advertisement

Php Conf2007 Mapscript

33 %
67 %
advertisement
Information about Php Conf2007 Mapscript

Published on May 27, 2007

Author: Slach

Source: slideshare.net

Description

MapServer architecture, MapScript examples, MapInfo format description
advertisement

MapServer и PHP/MapScript Публикация картографических данных с помощью PHP Климов Евгений aka Slach

Вступительное слово phpConf 2006 – Rasmus Lerdorf http://talks.php.net/show/phpclub/25 Вопрос - «Когда будет вся Россия ? » Ответ - «Картографических данных в Yahoo и Google нет и их очень сложно получить» Buzz «надо делать карту своего города» ;-)

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 и т.п. ;)

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

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)

Плюсы

Низкоуровневый интерфейс, обеспечивает доступ практически ко всем объектам карты

Позволяет создавать собственные слои

ООП

Минусы

Не включен в 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 ( '' );

// Загрузка 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/

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 пример для Челябинска (карта MapInfoDAT формата) http://gisa.ru/info_see.php?id=547

Открытого картографического рынка НЕТ http://community.livejournal.com/ru_gis/20981.html http://community.livejournal.com/ru_gis/18353.html

Картографическая деятельность, лицензируемая область деятельности, часть данных попадает под понятие «Государственная тайна».

Правообладатели в основном Государственные и Полугосударственные структуры ( неповоротливы)

Но некоторые данные, все таки можно купить ;-) http://gisa.ru/organiz_type_data.html пример для Челябинска (карта MapInfoDAT формата) 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



# основные параметры и объекты типа 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

# общие параметры карты

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

# путь к файлам векторных и растровых данных карты, используется для «не 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

# секция определяющая поведение 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

# легенда условных изображений и слоев на карте

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

# обычный слой типа ПОЛИГОН в формате 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)

# Слой типа АНОТАЦИЯ, отображающий подписи номеров домов и названия улиц

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

Инструменты просмотра карт – 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 файлы

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)

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 ;-)

Построен на 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 и реализовать кеширование

Самое узкое место 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? И т.п. СПАСИБО ЗА ВНИМАНИЕ ;-)

Какие есть альтернативы MapServer?

Как обстоят дела с GPS?

Как интегрировать с Google / Yahoo?

И т.п.

СПАСИБО ЗА ВНИМАНИЕ ;-)

Add a comment