вторник, 31 июля 2007 г.

Настройка шрифтов в mapserver (mapserver fonts howto)

Статистика сайта мне подсказывает, что этот вопрос интересует посетителей. Интересно, почему, ведь в этом нет ничего сложного. Впрочем, не все могут иметь опыт наступания на грабли в давних версиях библиотеки GD и не приучены оные [грабли] обходить. Требуемые действия не зависят от платформы, будь то Linux, Unix или клоны BSD. Итак, по порядку.

1. Нужно использовать юникодные шрифты. Можно даже виндовые, из XP. Вот такой набор будет достаточным на первое время:

arialbd.ttf
arialbi.ttf
ariali.ttf
arial.ttf
ariblk.ttf
comic.ttf
courbd.ttf
courbi.ttf
couri.ttf
cour.ttf
FreeMonoBoldOblique.ttf
FreeMonoBold.ttf
FreeMonoOblique.ttf
FreeMono.ttf
FreeSansBoldOblique.ttf
FreeSansBold.ttf
FreeSansOblique.ttf
FreeSans.ttf
FreeSerifBoldItalic.ttf
FreeSerifBold.ttf
FreeSerifItalic.ttf
FreeSerif.ttf
symbols.ttf
verdana.ttf

2. Пишем конфигурационный файл для используемых шрифтов (fonts.list):

mono ../fonts/FreeMono.ttf
sans ../fonts/FreeSans.ttf
sansb ../fonts/FreeSansBold.ttf
vera ../fonts/FreeVera.ttf
serif ../fonts/FreeSerif.ttf

arial ../fonts/arial.ttf
arialbd ../fonts/arialbd.ttf
arialblk ../fonts/ariblk.ttf
cour ../fonts/cour.ttf
symbols ../fonts/symbols.ttf

Пути указываются относительно расположения главного файла конфигурации (map-файла).

3. В конфигурационном файле указываем размещение файла конфигурации шрифтов следующей директивой

FONTSET "fonts.list"

4. Необходимо указать кодировку данных, в случае использования ESRI shapefiles это будет cp1251. Для этого конфигурационном файле карты в секцию LABEL нужно добавить директиву ENCODING CP1251.

P.S. Я пользуюсь вот такой структурой каталогов:

$ ls -R
.:
bin fonts maps

./bin:
mapdraw.py
mapinfo.py

./fonts:
arialbd.ttf
arialbi.ttf
ariali.ttf
arial.ttf
ariblk.ttf
comic.ttf
courbd.ttf
courbi.ttf
couri.ttf
cour.ttf
FreeMonoBoldOblique.ttf
FreeMonoBold.ttf
FreeMonoOblique.ttf
FreeMono.ttf
FreeSansBoldOblique.ttf
FreeSansBold.ttf
FreeSansOblique.ttf
FreeSans.ttf
FreeSerifBoldItalic.ttf
FreeSerifBold.ttf
FreeSerifItalic.ttf
FreeSerif.ttf
symbols.ttf
verdana.ttf

./maps:
fonts.list
map_ru_52_nn.map
map_ru_52_nn
symbols.list


В папке map_ru_52_nn располагается карта Нижнего Новгорода в формате шейпфайлов. Как показывает практика, именно шейпфайлы позволяют добиться максимальной производительности. Только не забудьте их проиндексировать!

P.S. По отзывам некоторых пользователей BSD-систем, у них есть проблемы при выводе кириллицы. Честно говоря, удивлен, что такое у них с библиотекой iconv - то ли сильно древняя в системе, то ли сами пользователи лет 5 не обновлялись. В дебиане еще с Sarge все работает, вот в Woody приходилось mapserver со всеми зависимостями пересобирать для нормальной поддержки русского языка, но те времена давно минули. О чем это я - если не хотите лишних проблем на свои [измерить самим] сантиметров, обновите систему для работы с русским языком в картсервере. Где-то у меня скрипты для сборки всех зависимостей валялись, но я ни в коей мере не считаю себя дальновиднее мантейнеров соответствующих пакетов и теперь, когда все работает "из коробки" фигней не страдаю. Ну, если кому интересно, в рассылке пожалуй их могу опубликовать, чем не повод вспомнить и улыбнуться тем временам.

2 комментария:

Анонимный комментирует...

И чтоб всё это работало, незабыть в секции LABEL поставить:
TYPE TRUETYPE

Анонимный комментирует...

Спасибо! Ваша статья оказалась очень полезной для меня.


(C) Alexey Pechnikov aka MBG, mobigroup.ru