Внимание! Все действия выполняете на свой страх и риск. Перед выполнением операций желательно снять копию с базы данных [GisDbMain], дабы иметь возможность восстановить все как было в случае нерабочей системы. Остальные частей статья вроде как не касается, но архивная копия всего тоже не повредит.
И так, имею КиберФлит версии 1.17.1.5 с установленным движком картографии М2М 1.1.4185
После установки обновления я подключил по прилагаемой к движку инструкции карты OSM, и теперь хочется иметь и карты google map.
Для этого пришлось разобраться с тем, что из себя представляет база данных GisDbMain, что появилась при установки обновления 1.17.1.3
И так, разборку я начал с того, как именно подключена карта OSM. В КиберФлите для нее зарегистрирована примерно такая строка подключения:
mapId=2;isGrayscale=false;compressImage=false;imageFormat=png
оказывается, mapId показывает на номер карты, зарегистрированной в таблице [GisDbMain].[dbo].[Map] с Id=2
т.е. указав mapId=мой_номер я смогу подключить свою карту, но надо ее зарегистрировать сначала в списке карт (insert into [GisDbMain].[dbo].[Map])
Что же из себя представляет запись о карте? - а вот тут информации не много - только какие-то координаты (видно границы для карты какие-то), и совсем не понятно, как идет связь с движком...
Поискав немного в таблицах, я наткнулся на [GisDbMain].[dbo].[Map_BaseMap]... и там три колонки...
[MapID] ,[BaseMapID], [Priority]
ага, подумал я, видно тут идет какая-то связь между картами что в [GisDbMain].[dbo].[Map] и движком...
и если MapId отвечает за номер карты, то [BaseMapID] за??? ну правильно, рядом оказалась таблица [GisDbMain].[dbo].[BaseMap] с довольно интересным реквизитом [InitializationData]
' <TileRenderer> <copyright>(c) пользователи OpenStreetMap, CC-BY-SA</copyright> <urlTemplates> <urlTemplate>http://tile.openstreetmap.org/{ZOOM}/{XTILE}/{YTILE}.png</urlTemplate> </urlTemplates> <tileCacheFolder>C:\GisPlatform\Server\TileCache\OSM Mapnik</tileCacheFolder> <tileSize width="256" height="256" /> <zoom min="3" max="18" /> </TileRenderer>'
ха! да это же родной xml, с указанием адреса сервера в реквизите urlTemplate, который возвращает карту в "картинках" (тайлы - умное слово означает просто картинки-нарезки карты).
Почитав описание на osm о тайлах и api, пришел к выводу, что {ZOOM} - это зум карты, {XTILE}, {YTILE} - номера тайлов.
Значит, найдя в интернете сервер, который подобным же образом выдаст мне информацию, я получу новую карту у себя в КиберФлите.
Ну так ведь у гугула есть сервер тайлов! Ура!!!
Покопавшись на просторах интернета я нашел адрес сервера, и присмотрел api работы с ним... вот и пример
получается, все что мне требуется, это в нужные места подставить {ZOOM},{XTILE},{YTILE}
подправить каталог для кеша <tileCacheFolder>C:\GisPlatform\Server\TileCache\Google1</tileCacheFolder>
ну и копирайты за компанию..., занести данные в [GisDbMain].[dbo].[BaseMap] и [GisDbMain].[dbo].[Map], связать данные через [GisDbMain].[dbo].[Map_BaseMap], и тогда можно будет регистрировать свою карту, подсмотрев ее id в [GisDbMain].[dbo].[Map]
И так, сначала копируем данные карты осм в новую карту:, а так же регистрируем движок гугла тоже скопировав его с осм-кого
скрипт напечатал мне номер id=7 (basemap)
ага. значит запись о базовой карте в basemap именно 7
теперь добавляем так же карту в таблицу [GisDbMain].[dbo].[Map]
Скрипт аналогичен предыдущему.
id карты 9 (map) - именно это нужно указывать при подключении карты в киберфлите
и последний штрих, привязываем таблицу друг к другу см. скрипт 3 из сообщения
добавил запись о карте во флит...
mapId=9;isGrayscale=false;compressImage=false;imageFormat=png
....
перезапустил флита и гиссервер....
вздохнул.... и попытался посмотреть на карте... не взлетело....
первая версия инструкций для гиссервера выглядела так (не верный вариант)
' <TileRenderer> <copyright>(c) Google</copyright> <urlTemplates> <urlTemplate>http://mt.google.com/vt?x={XTILE}&y={YTILE}&z={ZOOM}&hl=ru</urlTemplate> </urlTemplates> <tileCacheFolder>C:\GisPlatform\Server\TileCache\Google1</tileCacheFolder> <tileSize width="256" height="256" /> <zoom min="1" max="18" /></TileRenderer>'
но запускаться не желала.
оказывается, было две ошибки:
1. забыл создать каталог для кеша... ну создал, перезапустил флит и службу гиссервера - сообразил сам. все одно не работало.
2. покопавшись в настройках движка, и включив логирование, почесал голову, и сообразил, что ругается еще движок на знак амперсанда... стоп... это я уже видел! точно!!! в xml амперсанд должен передаваться не как "&" а как "&"
произведя замену я получил:
' <TileRenderer> <copyright>(c) Google</copyright> <urlTemplates> <urlTemplate>http://mt.google.com/vt?x={XTILE}&y={YTILE}&z={ZOOM}&hl=ru</urlTemplate> </urlTemplates> <tileCacheFolder>C:\GisPlatform\Server\TileCache\Google1</tileCacheFolder> <tileSize width="256" height="256" /> <zoom min="1" max="18" /></TileRenderer>'
перезапустил гиссервер, флита, затаив дыхание выбрал карту.... и, о чудо, оно заработало!
Как показал опыт, движок м2м несколько медлительнее в работе (наверное требуется его более тонкая настройка) и требует больше ресурсов при работе.
Так же периодически, по не понятным лично мне причинам он переставал отвечать на запросы.
Все тесты производились на виртуальной машине.
Из опыта, движок тайлов OSM достаточно медлителен, потому могут быть приличные паузы при заполнении кеша - работа с кешам на нормальном уровне.
Гугл работает несколько быстрее при начальном получении данных.
будем надеяться, что все эти "детские" болезни со временем будут полностью решены.
На данный момент релиз КиберФлита 1.17.1.5 является релизным (рекомендуется к установке клиентам).
Возможно, найденный путь подойдет и для 1.17.1.3 - не пробовал.
PS: На данный момент (18/01/2013) движок переработан, многие проблемы устранены. Скорость его работы вполне на уровне.
Так же читайте статьи:
Источник: CyberFleet, карты, google, OpenStreetMap |