MapServer  и  PHP/MapScript Публикация картографических данных  с помощью  PHP Климов Евгений  aka Slach
Вступительное слово phpConf 2006 – Rasmus Lerdorf http://talks.php.net/show/phpclub/25   Вопрос - «Когда будет вся Россия ? »  Ответ - «Картографических данных в  Yahoo  и  Google  нет и их очень сложно получить» Buzz  «надо делать карту своего города»  ;-)
OpenSource  инструменты для  PHP UMN MapServer –  среда разработки для построения картографических интернет приложений, разработанная под эгидой  NASA  и  University of Minnesota (UMN) . Это не полноценная  GIS  система, зато она превосходно справляется с задачами отображения картографических данных как растровых так и векторных Как скачать -  http://mapserver.gis.umn.edu/download   Как ставить -  http://mapserver.gis.umn.edu/docs/howto   Поддерживаемые  OS FreeBSD, Linux (Debian, RedHat, SuSe), Windows, Mac OSX  и т.п. ;)
PHP/MapScript MapScript –  скриптовый интерфейс прорисовки карты для  MapServer,  сделанный с использованием  SWIG http://mapserver.gis.umn.edu/docs/reference/mapscript/   PHP/MapScript – PHP4/5 Extension  для интеграции  MapScript  и  PHP  (существуют  bindings  для  Perl, Python, Ruby, C#, Java) Где брать http://www.maptools.org/php_mapscript/   Как ставить  http://mapserver.gis.umn.edu/docs/howto/phpmapscript-install
PHP/MapScript  плюсы / минусы Плюсы Низкоуровневый интерфейс, обеспечивает доступ практически ко всем объектам карты Позволяет создавать собственные слои ООП Минусы Не включен в  pecl   ;) Не  thread-safe Нет наследования от базовых классов  MapScript ( инициализация через ф-ции  ms_newMapObj)
PHP/MapScript –  простой пример // Загрузка PHP/MapScript  define ( 'MAPSCRIPT_MODULE' ,  dirname ( __FILE__ ). 'php_mapscript.' . PHP_SHLIB_SUFFIX );  if (! extension_loaded ( 'MapScript' ))  dl ( MAPSCRIPT_MODULE );  // открытие файла с картой, производится парсинг .MAP файла  define ( 'MAPFILE' ,  dirname ( __FILE__ ). '/mapinfo.map' ); $oMap  =  ms_newMapObj (  MAPFILE  );  // параметры системы координат для вашей карты, типы проекций и систем координат //  см. http://proj.maptools.org/  $oMap -> setProjection ( 'init=epsg:42304' );  // будем выводить картинку 800x600 в  PNG  формате $oMap -> setsize ( 800 ,  600 );  $oMap -> selectoutputformat ( 'png' );  // прорисовка карты в памяти, поскольку не заданы условия фильтрации данных // и масштаба, карта   строится по всем слоям, с минимальным увеличением и стилями  //  заложенными в карте  $oImage  =  $oMap -> draw ();  // вывод картинки  header ( 'Content-type: image/png' );  // при желании картинку можно вывести в Кеш  $url  =  $oImage -> saveImage ( '' );
Построение карты - с чего начать MapServer  Поддерживаемые форматы Растровые –   с помощью  GDAL  http://www.gdal.org/formats_list.html   Векторные – с помощью  OGR http://www.gdal.org/ogr/ogr_formats.html наиболее распространенные  MapInfo, ESRI, PostGIS MapServer  как  GEO- сервис WMS (client/server), non-transactional WFS (client/server), WMC, WCS, Filter Encoding, SLD, GML, SOS http://www.opengeospatial.org/
Построение карты - правообладатели Открытого картографического рынка НЕТ   http://community.livejournal.com/ru_gis/20981.html http://community.livejournal.com/ru_gis/18353.html   Картографическая деятельность, лицензируемая область деятельности, часть данных попадает под понятие «Государственная тайна». Правообладатели в основном Государственные и Полугосударственные структуры  ( неповоротливы) Но некоторые данные, все таки можно купить  ;-)   http://gisa.ru/organiz_type_data.html   пример для Челябинска (карта  MapInfo\DAT  формата) http://gisa.ru/info_see.php?id=547
Построение карты – формат  MAP  файла (1 /7) MAP … # основные параметры и объекты типа  LEGEND, WEB, QUERYMAP … # определение слоев LAYER … END LAYER … END END #  английский  guide -  http://maps.tikiwiki.org/page/8   #  английский  reference -  http://mapserver.gis.umn.edu/docs/reference/mapfile
Построение карты – формат  MAP  файла (2 /7) # общие параметры карты NAME CHELMAP # при прорисовке с помощью  PHP/MapScript  в  stderr  ( apache error.log)  будет записан порядок и время прорисовки слоев карты DEBUG ON STATUS ON # размер изображения по умолчанию, обычно перекрывается в  MapViewer’ ах SIZE 400 300 # базовый цвет фона для карты, легенды, линейки   масштаба и т.п. IMAGECOLOR 255 255 255 # базовые единицы измерения UNITS METERS # экранное разрешение, используется например при генерации карты в формате  PDF RESOLUTION 72
Построение карты – формат  MAP  файла (3 /7) # путь к файлам векторных и растровых данных карты, используется для «не  SQL » форматов ( ESRI, MapInfo) SHAPEPATH "../data“ # путь к файлу с набором символов в формате  OGR,  набор символов используется для прорисовки таких объектов как «памятники», «остановки», «флаги» и т.п. SYMBOLSET ../fonts/symbols.sym # путь к файлу с набором  TTF  шрифтов используемых при прорисовке надписей на карте FONTSET ../fonts/fonts.txt # размер карты в общей координатной системе в формате  min_x min_y max_x max_y EXTENT  -17000 132000 -5000 144000 # формат вывода по умолчанию  IMAGETYPE png INTERLACE OFF OUTPUTFORMAT NAME png DRIVER "GD/PNG" MIMETYPE "image/png" IMAGEMODE RGB FORMATOPTION  INTERLACE=OFF TRANSPARENT OFF END
Построение карты – формат  MAP  файла (4 /7) # секция определяющая поведение  MapServer  в качестве  GEO- сервиса WEB IMAGEPATH "/var/local/www/sites/map.mpautina.ru/tmp/" IMAGEURL "/img_tmp/" LOG "/var/local/www/sites/map.mpautina.ru/tmp/mapinfo.log" MAXSCALE 150000 MINSCALE 1000 EMPTY "/empty.html" ERROR "/error.html" END # подсветка «найденных объектов» QUERYMAP STYLE HILITE COLOR 255 0 0 END # уменьшенная «копия карты», обычно статическое изображение REFERENCE IMAGE /var/local/www/sites/map.mpautina.ru/www/pmapper/images/chelmap_final.gif EXTENT -17000 132000 -5000 144000 SIZE 150 138 STATUS ON COLOR 200 200 200 OUTLINECOLOR 255 0 0 END
Построение карты – формат  MAP  файла (5 /7) # легенда условных изображений и слоев на карте LEGEND STATUS ON KEYSIZE 18 12 POSITION ul LABEL MINFEATURESIZE auto TYPE BITMAP SIZE MEDIUM COLOR 0 0 89 FORCE true TYPE truetype FONT "arial" SIZE 9 ENCODING windows-1251 END END # линейка масштаба SCALEBAR STATUS EMBED TRANSPARENT ON INTERVALS 4 SIZE 200 3 UNITS kilometers COLOR 254 254 217 OUTLINECOLOR 0 0 0 BACKGROUNDCOLOR 254 254 217 STYLE 0 POSTLABELCACHE true LABEL MINFEATURESIZE auto COLOR 0 0 90 SIZE small END END
Построение карты – формат  MAP  файла (6 /7) # обычный слой типа ПОЛИГОН в формате  MapInfo/TAB LAYER NAME "Avtomobilnye_dorogi“ # подробная информация о рисовании слоя и ошибках выводится в  stderr  ( error.log) DEBUG ON TYPE POLYGON STATUS ON CONNECTIONTYPE OGR CONNECTION "Avtomobilnye_dorogi.TAB" STYLEITEM "AUTO" CLASS NAME " Автомобильные дороги" END END # слой типа ПОЛИГОН с МЕТАДАННЫМИ, по которым можно осуществлять поиск LAYER NAME "Stroenija" DEBUG ON TYPE POLYGON STATUS ON CONNECTIONTYPE OGR CONNECTION "Stroenija.TAB" METADATA "LAYER_ENCODING" "CP1251" "QUERYABLE" "true" "SEARCHFIELD" " Название_улицы" " RESULT_FIELDS" " Название_улицы,Номер_дома" " RESULT_HEADERS" " Название улицы,Номер Дома" END
# Слой типа АНОТАЦИЯ, отображающий подписи номеров домов и названия улиц LAYER NAME "Podpisi_nazvaniy_ulic_i_nomero" DEBUG ON TYPE ANNOTATION MAXSCALE  20000 STATUS ON CONNECTIONTYPE OGR CONNECTION "Podpisi_nazvaniy_ulic_i_nomero.TAB" METADATA "LAYER_ENCODING" "CP1251" END STYLEITEM "AUTO“ CLASS NAME " Названия улиц" LABEL ENCODING windows-1251 TYPE TRUETYPE ANTIALIAS true COLOR 0 255 0 ANGLE 0 BUFFER 5 PARTIALS true END END # конец слоя END Построение карты – формат  MAP  файла (7 /7)
Инструменты просмотра карт –  MapViewer’ ы http://mapserver.gis.umn.edu/docs/link   Chameleon  -  http://chameleon.maptools.org/   framework  для быстрой разработки на базе  PHP/MapScript,  предоставляет набор  widgets , которые можно удобно встраивать в  HTML  шаблон FIST -  http://fist-mapping.org/   еще один  framework,  позволяет редактировать карту P.mapper  -  http://www.pmapper.net/   простой, удобный и настраиваемый  viewer  карт на базе  xajax, PHP/Mapscript, XHTML  +  CSS Ka-Map  -  http://ka-map.maptools.org/   другой  viewer  карт использующий больше  JavaScript , меньше  PHP  и лучше поддерживающий кеширование QGis -  http://www.qgis.org/   полноценная  GIS  система поддерживающая  OGR \ GDAL  форматы и позволяющая генерировать  .MAP  файлы
Сравнение  ka-map  и  p.mapper Ka-Map Плюсы Tile-caching  а-ля  Google Фиксированные масштабы Поддержка нескольких  .MAP  файлов в одной конфигурации Минусы Отсутствие локализации Хаотичная архитектура   в которой есть компоненты  (tools) , но очень много спагетти и процедурного кода Зачатки  AJAX  интерфейса, очень многое сделано на  IFRAME P.mapper Плюсы Хорошо структурированный  HTML+CSS  +  AJAX  интерфейс ООП дизайн  PHP  кода Метки на карте Динамический масштаб Динамический подбор размера карты под размер окна Многоязычность Минусы Динамический масштаб как причина слабого кеширования JavaScript  динамическая расстановка элементов интерфейса (сложно править  layout)
p.Mapper  подводные камни Построен на  utf-8  но не поддерживает слои с 8 bit (cp1251)  кодировкой Необходимость русской локализации Написан (как и  ka-map)  без использования  E_ALL Довольно быстро засоряет  /tmp/  каталог временными изображениями с кусками карты Нестабильность под  RedHat ;-)
Производительность Самое узкое место  CPU  при прорисовке карты скорость прорисовки нелинейно зависит от сложности, объема карты и отображаемой части карты ab -n  100  -C PHPSESSID=acf0df8646f1f69bc7fc446544095ef9  http://local.map.mpautina.ru/pmapper/incphp/xajax/x_load.php?PHPSESSID=acf0df8646f1f69bc7fc446544095ef9&mapW=640&mapH=480&zoom_type=zoompoint Celeron-M 1.7Ghz/512RAM/win32 Apache2+php5.1.6-cgi 2.7 req/sec  !!!  ;-( При высокой нагрузке необходимо вынести  MapSript  на отдельный  PHP-FCGI   daemon  и   реализовать кеширование
Вопросы аудитории Какие есть альтернативы  MapServer? Как обстоят дела с  GPS? Как интегрировать с  Google   /   Yahoo? И т.п. СПАСИБО ЗА ВНИМАНИЕ  ;-)

Php Conf2007 Mapscript

  • 1.
    MapServer и PHP/MapScript Публикация картографических данных с помощью PHP Климов Евгений aka Slach
  • 2.
    Вступительное слово phpConf2006 – Rasmus Lerdorf http://talks.php.net/show/phpclub/25 Вопрос - «Когда будет вся Россия ? » Ответ - «Картографических данных в Yahoo и Google нет и их очень сложно получить» Buzz «надо делать карту своего города» ;-)
  • 3.
    OpenSource инструментыдля PHP UMN MapServer – среда разработки для построения картографических интернет приложений, разработанная под эгидой NASA и University of Minnesota (UMN) . Это не полноценная GIS система, зато она превосходно справляется с задачами отображения картографических данных как растровых так и векторных Как скачать - http://mapserver.gis.umn.edu/download Как ставить - http://mapserver.gis.umn.edu/docs/howto Поддерживаемые OS FreeBSD, Linux (Debian, RedHat, SuSe), Windows, Mac OSX и т.п. ;)
  • 4.
    PHP/MapScript MapScript – скриптовый интерфейс прорисовки карты для MapServer, сделанный с использованием SWIG http://mapserver.gis.umn.edu/docs/reference/mapscript/ PHP/MapScript – PHP4/5 Extension для интеграции MapScript и PHP (существуют bindings для Perl, Python, Ruby, C#, Java) Где брать http://www.maptools.org/php_mapscript/ Как ставить http://mapserver.gis.umn.edu/docs/howto/phpmapscript-install
  • 5.
    PHP/MapScript плюсы/ минусы Плюсы Низкоуровневый интерфейс, обеспечивает доступ практически ко всем объектам карты Позволяет создавать собственные слои ООП Минусы Не включен в pecl ;) Не thread-safe Нет наследования от базовых классов MapScript ( инициализация через ф-ции ms_newMapObj)
  • 6.
    PHP/MapScript – простой пример // Загрузка PHP/MapScript define ( 'MAPSCRIPT_MODULE' , dirname ( __FILE__ ). 'php_mapscript.' . PHP_SHLIB_SUFFIX ); if (! extension_loaded ( 'MapScript' )) dl ( MAPSCRIPT_MODULE ); // открытие файла с картой, производится парсинг .MAP файла define ( 'MAPFILE' , dirname ( __FILE__ ). '/mapinfo.map' ); $oMap = ms_newMapObj ( MAPFILE ); // параметры системы координат для вашей карты, типы проекций и систем координат // см. http://proj.maptools.org/ $oMap -> setProjection ( 'init=epsg:42304' ); // будем выводить картинку 800x600 в PNG формате $oMap -> setsize ( 800 , 600 ); $oMap -> selectoutputformat ( 'png' ); // прорисовка карты в памяти, поскольку не заданы условия фильтрации данных // и масштаба, карта строится по всем слоям, с минимальным увеличением и стилями // заложенными в карте $oImage = $oMap -> draw (); // вывод картинки header ( 'Content-type: image/png' ); // при желании картинку можно вывести в Кеш $url = $oImage -> saveImage ( '' );
  • 7.
    Построение карты -с чего начать MapServer Поддерживаемые форматы Растровые – с помощью GDAL http://www.gdal.org/formats_list.html Векторные – с помощью OGR http://www.gdal.org/ogr/ogr_formats.html наиболее распространенные MapInfo, ESRI, PostGIS MapServer как GEO- сервис WMS (client/server), non-transactional WFS (client/server), WMC, WCS, Filter Encoding, SLD, GML, SOS http://www.opengeospatial.org/
  • 8.
    Построение карты -правообладатели Открытого картографического рынка НЕТ http://community.livejournal.com/ru_gis/20981.html http://community.livejournal.com/ru_gis/18353.html Картографическая деятельность, лицензируемая область деятельности, часть данных попадает под понятие «Государственная тайна». Правообладатели в основном Государственные и Полугосударственные структуры ( неповоротливы) Но некоторые данные, все таки можно купить ;-) http://gisa.ru/organiz_type_data.html пример для Челябинска (карта MapInfo\DAT формата) http://gisa.ru/info_see.php?id=547
  • 9.
    Построение карты –формат MAP файла (1 /7) MAP … # основные параметры и объекты типа LEGEND, WEB, QUERYMAP … # определение слоев LAYER … END LAYER … END END # английский guide - http://maps.tikiwiki.org/page/8 # английский reference - http://mapserver.gis.umn.edu/docs/reference/mapfile
  • 10.
    Построение карты –формат MAP файла (2 /7) # общие параметры карты NAME CHELMAP # при прорисовке с помощью PHP/MapScript в stderr ( apache error.log) будет записан порядок и время прорисовки слоев карты DEBUG ON STATUS ON # размер изображения по умолчанию, обычно перекрывается в MapViewer’ ах SIZE 400 300 # базовый цвет фона для карты, легенды, линейки масштаба и т.п. IMAGECOLOR 255 255 255 # базовые единицы измерения UNITS METERS # экранное разрешение, используется например при генерации карты в формате PDF RESOLUTION 72
  • 11.
    Построение карты –формат MAP файла (3 /7) # путь к файлам векторных и растровых данных карты, используется для «не SQL » форматов ( ESRI, MapInfo) SHAPEPATH "../data“ # путь к файлу с набором символов в формате OGR, набор символов используется для прорисовки таких объектов как «памятники», «остановки», «флаги» и т.п. SYMBOLSET ../fonts/symbols.sym # путь к файлу с набором TTF шрифтов используемых при прорисовке надписей на карте FONTSET ../fonts/fonts.txt # размер карты в общей координатной системе в формате min_x min_y max_x max_y EXTENT -17000 132000 -5000 144000 # формат вывода по умолчанию IMAGETYPE png INTERLACE OFF OUTPUTFORMAT NAME png DRIVER "GD/PNG" MIMETYPE "image/png" IMAGEMODE RGB FORMATOPTION INTERLACE=OFF TRANSPARENT OFF END
  • 12.
    Построение карты –формат MAP файла (4 /7) # секция определяющая поведение MapServer в качестве GEO- сервиса WEB IMAGEPATH "/var/local/www/sites/map.mpautina.ru/tmp/" IMAGEURL "/img_tmp/" LOG "/var/local/www/sites/map.mpautina.ru/tmp/mapinfo.log" MAXSCALE 150000 MINSCALE 1000 EMPTY "/empty.html" ERROR "/error.html" END # подсветка «найденных объектов» QUERYMAP STYLE HILITE COLOR 255 0 0 END # уменьшенная «копия карты», обычно статическое изображение REFERENCE IMAGE /var/local/www/sites/map.mpautina.ru/www/pmapper/images/chelmap_final.gif EXTENT -17000 132000 -5000 144000 SIZE 150 138 STATUS ON COLOR 200 200 200 OUTLINECOLOR 255 0 0 END
  • 13.
    Построение карты –формат MAP файла (5 /7) # легенда условных изображений и слоев на карте LEGEND STATUS ON KEYSIZE 18 12 POSITION ul LABEL MINFEATURESIZE auto TYPE BITMAP SIZE MEDIUM COLOR 0 0 89 FORCE true TYPE truetype FONT "arial" SIZE 9 ENCODING windows-1251 END END # линейка масштаба SCALEBAR STATUS EMBED TRANSPARENT ON INTERVALS 4 SIZE 200 3 UNITS kilometers COLOR 254 254 217 OUTLINECOLOR 0 0 0 BACKGROUNDCOLOR 254 254 217 STYLE 0 POSTLABELCACHE true LABEL MINFEATURESIZE auto COLOR 0 0 90 SIZE small END END
  • 14.
    Построение карты –формат MAP файла (6 /7) # обычный слой типа ПОЛИГОН в формате MapInfo/TAB LAYER NAME "Avtomobilnye_dorogi“ # подробная информация о рисовании слоя и ошибках выводится в stderr ( error.log) DEBUG ON TYPE POLYGON STATUS ON CONNECTIONTYPE OGR CONNECTION "Avtomobilnye_dorogi.TAB" STYLEITEM "AUTO" CLASS NAME " Автомобильные дороги" END END # слой типа ПОЛИГОН с МЕТАДАННЫМИ, по которым можно осуществлять поиск LAYER NAME "Stroenija" DEBUG ON TYPE POLYGON STATUS ON CONNECTIONTYPE OGR CONNECTION "Stroenija.TAB" METADATA "LAYER_ENCODING" "CP1251" "QUERYABLE" "true" "SEARCHFIELD" " Название_улицы" " RESULT_FIELDS" " Название_улицы,Номер_дома" " RESULT_HEADERS" " Название улицы,Номер Дома" END
  • 15.
    # Слой типаАНОТАЦИЯ, отображающий подписи номеров домов и названия улиц LAYER NAME "Podpisi_nazvaniy_ulic_i_nomero" DEBUG ON TYPE ANNOTATION MAXSCALE 20000 STATUS ON CONNECTIONTYPE OGR CONNECTION "Podpisi_nazvaniy_ulic_i_nomero.TAB" METADATA "LAYER_ENCODING" "CP1251" END STYLEITEM "AUTO“ CLASS NAME " Названия улиц" LABEL ENCODING windows-1251 TYPE TRUETYPE ANTIALIAS true COLOR 0 255 0 ANGLE 0 BUFFER 5 PARTIALS true END END # конец слоя END Построение карты – формат MAP файла (7 /7)
  • 16.
    Инструменты просмотра карт– MapViewer’ ы http://mapserver.gis.umn.edu/docs/link Chameleon - http://chameleon.maptools.org/ framework для быстрой разработки на базе PHP/MapScript, предоставляет набор widgets , которые можно удобно встраивать в HTML шаблон FIST - http://fist-mapping.org/ еще один framework, позволяет редактировать карту P.mapper - http://www.pmapper.net/ простой, удобный и настраиваемый viewer карт на базе xajax, PHP/Mapscript, XHTML + CSS Ka-Map - http://ka-map.maptools.org/ другой viewer карт использующий больше JavaScript , меньше PHP и лучше поддерживающий кеширование QGis - http://www.qgis.org/ полноценная GIS система поддерживающая OGR \ GDAL форматы и позволяющая генерировать .MAP файлы
  • 17.
    Сравнение ka-map и p.mapper Ka-Map Плюсы Tile-caching а-ля Google Фиксированные масштабы Поддержка нескольких .MAP файлов в одной конфигурации Минусы Отсутствие локализации Хаотичная архитектура в которой есть компоненты (tools) , но очень много спагетти и процедурного кода Зачатки AJAX интерфейса, очень многое сделано на IFRAME P.mapper Плюсы Хорошо структурированный HTML+CSS + AJAX интерфейс ООП дизайн PHP кода Метки на карте Динамический масштаб Динамический подбор размера карты под размер окна Многоязычность Минусы Динамический масштаб как причина слабого кеширования JavaScript динамическая расстановка элементов интерфейса (сложно править layout)
  • 18.
    p.Mapper подводныекамни Построен на utf-8 но не поддерживает слои с 8 bit (cp1251) кодировкой Необходимость русской локализации Написан (как и ka-map) без использования E_ALL Довольно быстро засоряет /tmp/ каталог временными изображениями с кусками карты Нестабильность под RedHat ;-)
  • 19.
    Производительность Самое узкоеместо CPU при прорисовке карты скорость прорисовки нелинейно зависит от сложности, объема карты и отображаемой части карты ab -n 100 -C PHPSESSID=acf0df8646f1f69bc7fc446544095ef9 http://local.map.mpautina.ru/pmapper/incphp/xajax/x_load.php?PHPSESSID=acf0df8646f1f69bc7fc446544095ef9&mapW=640&mapH=480&zoom_type=zoompoint Celeron-M 1.7Ghz/512RAM/win32 Apache2+php5.1.6-cgi 2.7 req/sec !!! ;-( При высокой нагрузке необходимо вынести MapSript на отдельный PHP-FCGI daemon и реализовать кеширование
  • 20.
    Вопросы аудитории Какиеесть альтернативы MapServer? Как обстоят дела с GPS? Как интегрировать с Google / Yahoo? И т.п. СПАСИБО ЗА ВНИМАНИЕ ;-)