Публикация TAB на Mapserver

Документация Mapserver сообщает, что он может публиковать TAB файлы с ОРИГИНАЛЬНОЙ СТИЛИЗАЦИЕЙ из Mapinfo. Что же посмотрим.

Установка и начальная настройка

Ставить буду на Windows, поэтому качаем MS4W. Распаковываем и запускаем apache-install.bat, В Службах должен появиться Apache. Создаем папку для конфигов \ms4w\apps\example\, где и создаем файл расширения map. Засовываем внутрь простой конфиг:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
MAP
  NAME           "WMS"
  STATUS         ON
  IMAGETYPE      PNG
  EXTENT         59.9 56.5 61.0 57.0
  SIZE           1000 1000
  SHAPEPATH      "C:/ms4w/apps/example/shp/"
  IMAGECOLOR     255 255 255
  CONFIG "MS_ERRORFILE" "D:\dev\Mapserver\ms4w\tmp\ms_error.txt"

	OUTPUTFORMAT
	   NAME "png"
	   DRIVER AGG/PNG
	   MIMETYPE "image/png"
	   IMAGEMODE RGB
	   EXTENSION "png"
	   FORMATOPTION "GAMMA=0.75"
	END
	
	WEB
		IMAGEPATH '/tmp/'

		IMAGEURL '/tmp/'

		METADATA
		  ows_title          'Simple map'
		  ows_onlineresource  
			'http://localhost:8081/cgi-bin/mapserv.exe?map=D:/dev/Mapserver/ms4w/apps/example/test.map&'
		  wms_getfeatureinfo         
			'http://192.168.70.18/cgi-bin/mapserv.exe?map=C:/ms4w/apps/example/test.map&'
		  wms_featureinfoformat      "text/plain"
		  wms_title          "Test WMS"
		  wms_srs            "EPSG:4326 EPSG:3857"
		END
		TEMPLATE 'fooOnlyForWMSGetFeatureInfo'
	END
  
	LAYER
	  NAME GREEN_POLYGON
	  TYPE POLYGON
	  TEMPLATE "dummy"
	  STATUS DEFAULT
	  CONNECTIONTYPE OGR
	  CONNECTION "d:\dev\tabs\GREEN_POLYGON.tab"
	  STYLEITEM "AUTO"
	  CLASS
	  END
	END
END

Так же как и в примерах, я добавляю тег STYLEITEM “AUTO” к слою, в надежде увидить искомую оригинальную стилизацию. Результат посмотреть можно поссылке:

http://localhost:8081/cgi-bin/mapserv.exe?map=D:/dev/Mapserver/ms4w/apps/example/test.map&mode=map&LAYERS=GREEN_POLYGON

Использование своей СК

И увидел я белую картинку, ну и правильно, данные то у меня в мск. Добавляем новую СК в Mapserver. Редактируем файл \ms4w\proj\nad\epsg и добавлем в него строки:

# MSK
<100000> +proj=...+no_defs  <>

Все теперь можем показывать и ипользовать данные в нестандартной СК. Для этого в блоки MAP и LAYER добавялем:

PROJECTION
  "init=epsg:100000"
END

А еще добавим СК в wms_srs.

Теперь нужен EXTENT. Я поступил просто и открыл файлы в QGIS, прикинув на глаз интересующую территорию. Попутно я узнал, что в табах не записана система координат. Поэтому запишу ее через ogr2ogr.

@echo off
set ext=.tab
FOR /f "tokens=*" %%G IN ('dir /b "D:\dev\tabs\*.tab"') 
	DO (ogr2ogr -a_srs "+proj=..." -f "MapInfo File" "D:\dev\tabs\projected\%%~nG%ext%" "D:\dev\tabs\%%~nG%ext%")

Стилизация

После проделанных операций у меня наконец-то появилась картинка. Это был просто кусок зеленки с однородной заливкой. Ничего сложного вроде, но нас больше интересует как он справиться с симболазерами Mapinfo. Поэтому покопавшись, я нашел железную дорогу. Вот так это выглядит в Mapinfo:

Road MapInfo

А вот так опубликовалось на Mapserver:

Road Mapserver

Как видно мапинфошные симболайзеры не перенеслись. Что можно сделать? Стандартные символы MapInfo, которые имеют имена mapinfo-sym-## описаны в файле в документации. Скачаем его и подключим в секцию MAP:

SYMBOLSET      "D:\dev\Mapserver\ms4w\apps\etc\symbols_mapinfo.txt"

К сожалению мне это не помогло, потому что посмотреть стиль слоя через ogrinfo, я увидел следующее:

PEN(w:1px,c:#000000,id:"mapinfo-pen-73,ogr-pen-0")

Документации, как это описать я не нашел. Конечно можно взять и писать стили для каждого слоя, но идея-то не в этом. Я то, хотел что бы стили сами подсосались из табов. Поэтому эта часть все еще в работе.

Человеческие ссылки

Хоть меня и постигла неудача, но работу я продолжил. Далее я захотел подключить WMS на свой основной клиент написаный на BruTile. И столкнулся с тем, что у меня все падает при запросе GetMap. Все дело в том, что стандартная url на wms уже содержит в себе параметры, библиотека же к такому не готова. Тут нам поможет Apache, на котором и крутится Mapserver. Пишем короткий конфиг:

Alias /wmsmap "/ms4w/Apache/cgi-bin/mapserv.exe"
<Location /wmsmap>
   SetHandler cgi-script
   Options ExecCGI
   SetEnv MS_MAPFILE "/ms4w/apps/example/test.map"
</Location>

И сохраняем в \ms4w\httpd.d_. Открываем _\ms4w\Apache\conf\httpd.conf, находим строку

# parse MS4W apache conf files
include "D:/dev/Mapserver/ms4w/httpd.d/httpd_*.conf"

И удаляем маску файла, так что бы подсасывались все conf файлы из этой папки. Основная идея подхода, в том что бы для каждого map файла написать по конфигу и у все будет своя url без параметров. Изначально хотел работать через теги __, как и указано в документации Mapserver, но там возникла непонятная проблема с правами на папку /tmp/.

После этого урла до wms стала http://localhost:8081/wmsmap, что уже по человечески.

Заключение

Ну что сказать, толи я дурак, толи лыжи не едут. Но получить, что я хотел не получилось. Мечты о картинке выглядещей так же как в Mapinfo не осуществились. На этом я продолжил публиковать табы, и пока не оставляю надежды найти способ описания симболайзеров из Mapinfo.