[Все статьи]

Размещение карт в Web при помощи Google Maps

В этой статье я хочу поделиться опытом создания и размещения карт в Интернет на основе Google Maps. При этом используя только бесплатно распространяемые программные продукты. Так же учитывается размещение сайта для малобюджетных (некоммерческих) проектов в условиях ограниченных аппаратных ресурсов (недорогой тарифный план хостинга). Статья построена по тем путевым «вехам» размышлений и выводов, которые я прошёл при создании карты Архангельска на основе Google Maps. В начале – абстрактное лирическое отступление – и более конкретные детали к концу статьи.

Как устроен Google Maps

Если вы хорошо представляете, о чем идёт речь, то этот довольно большой раздел можно не читать.

Google Maps – это сервис, который предоставляет инструменты для создания и размещения интерактивных карт на страницах Интернет сайтов. Этот сервис предоставляет Googe Maps API – Java Script библиотека для создания клиентских картографических приложений, а так же предоставляет доступ к спутниковым фотографиям – основа для карт.

Есть отличная статья об устройстве Google Maps, в ней имеется всё необходимое – исчерпывающие пояснения и даже математические формулы и примеры программного кода.

Первая проблема, с которой придётся столкнуться при создании картографического web-приложения, это вопрос о том, как «поверх» спутниковых снимков отображать объекты имеющейся у вас электронной карты. Под электронной картой здесь понимается нобор пространственных данных и их атрибутов в электронном виде, в т.ч. базы пространственных данных.

Можно предположить, что каким-то образом необходимо размещать свои электронные карты на серверах Google, но это не совсем так, точнее совсем не так – ничего никому передавать ненужно.

Затем может прийти в голову использование Google Maps API и создавать точки, линии и полигоны при помощи Java Script в браузере. В принципе, так делать можно, даже в документации по Google Maps API есть такие примеры (пример 1 и пример 2),  и многие сайты используют такой подход. Но, это не наш способ! Вы только представьте, что у вас имеются сотни и даже тысячи объектов на карте (точки, линии, полигоны). Бедный браузер пользователя вашего сайта попросту «загнётся» от такой работы, да и «тащить» этот контент в браузер пользователя не нужно (и не желательно).

Как же делать «правильно»?! Если немного глубже изучить проблему, почитать документацию, посёрфить Интернет, то ответ будет таков – необходимо публиковать изображения с «кусками» вашей карты.

Google Maps оперирует тайлами (tiles) – это изображения (картинки) с участком карты размером 256х256 точек. Спутниковые фотографии «нарезаны» на такие картинки, для карт крупных городов на Google Maps сделано так же и для ситуации (улицы, дома и т.п.). Используется общепринятый для ГИС многослойный (overlays) подход – в первом слое идут тайлы спутниковых снимков, во втором – тайлы с конкретной ситуацией (дороги, маркеры, номера домов). Верхние слои тайлов – «прозрачные», поэтому под ними видны тайлы спутниковых снимков.

Тайлы привязаны к своей внутренней системе координат (об этом говориться в упомянутой выше статье) и тайлы из разных слоёв с одинаковой позицией в этой системе координат будут располагаться друг над другом – об этом беспокоиться не надо, за это отвечает Java Script код из библиотеки Google Maps.

Вот примеры тайлов:

http://mt1.google.com/mt/v=w2t.95&hl=ru&x=9901&y=5120&z=14&s=Galileo (Не обращаейте внимания на чёрный цвет фона).

Пример тайла с сервра Google

http://khm3.google.ru/kh/v=39&hl=ru&x=9901&y=5120&z=14

Пример тайла с сервера Google 

А вот то, что получиться при их совмещении

Совмещённые тайлы 

Если внимательно посмотреть на ссылки, приведённые ваше, то можно понять, что:

  • x=9901 – это некоторая координата X
  • y=5129 – это некоторая координата Y
  • z=14 – это масштаб (zoom)

Координаты X и Y указывают на позицию тайла в системе координат тайлов (по большому счёту это матрица и эти координаты указывают на номер столбца и строки в этой матрице, вся карта мира «покрыта» такой квадратной матрицей; для зума 1 эта матрица размером 1х1, для зума 2 – 2х2 и т.п.). Эти координаты можно пересчитать в географические (широта/долгода) и обратно – т.е для каждого тайла по его позиции в матрице вычислить географические координаты его «углов», и по точке с определёнными географическими координатами можно вычислить координаты тайла X и Y в который она попадает при заданном масштабе (зуме).

Google Maps поддерживает 20 уровней зума, от 1 до 20. У Google, например, есть уже «заготовленые» тайлы со спутниковыми снимками для всех этих масштабов.

Таким образом, общая схема работы карт Google такова:

На странице сайта с картой работает специальный Java Script код (клиентский движок), который отвечает за визуализацию карты и за «общение» с сервером. Этот код при необходимости (изменение зума карты, перемещение карты в «окне» просмотра пользователем) подгружает необходимые тайлы с сервера и компанует их вместе для создания единого «панно» карты. Для подгрузки тайла с сервера создаётся HTTP запрос с параметрами, где указывается номер позиции тайла (X, Y) и используемый масштаб (Z). Сервер по полученным параметрам возвращает необходимое изображение.

Если используются несколько слоёв, то клиентский Java Script движок размещает тайлы из разных слоёв друг над другом (используя HTML DOM и CSS). При этом возникает важный момент - изображения для тайлов из разных слоёв карты могут быть загружены с разных хостов (серверов)! Взгляните на ссылки на тайлы приведённые выше, для тайла спутникового снимка используется хост khm3.google.ru, а для тайла с ситуацией хост mt1.google.com. Вот именно этим и следует пользоваться при размещении своих карт при помощи Google Maps – тайлы со спутниковыми снимками будут загружаться с хостов Google, а тайлы с участками нашей карты – будут загружаться с вашего сервера.

Дело за «малым» – научиться создавать тайлы :-). Об этом далее.

Рисуем тайлы

Итак, стоит задача создать огромную кучу картинок с «кусками» карты. В качестве исходных данных мы имеем набор пространственных данных (координаты точек, линии, полигоны) и, может быть, атрибутивная информация по ним (номера домов, названия улиц и т.п.). Так же допустим, мы уже определились, какие уровни zoom-а, и какой участок земной поверхности нужен для нашей карты. 

В подавляющем большинстве случаев, географические данные уже хранятся в одном из стандартных/общераспространённых форматов данных (файлов). Это может быть файл формата ESRI Shape, GPS трек, файлы данных некоторой ГИС системы (MapInfo, ESRI ArcInfo, ГИС «Панорама») или же загружены в базы данных с поддержкой хранения пространственных данных (Oracle Spatial, PostGIS, MySQL Spatial Extentions).

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

GIS Web-сервера

Имеется целая линейка продуктов, позволяющих размещать электронные карты в Интернет. Это специально адаптированные для картографических web-приложений серверы. Например, коммерческие ESRI ArcIMS, MapInfo MapXtreme, Oracle MapViewer, GIS WebServer; и бесплатно распространяемые MapServer и GeoServer.

Все эти веб-сервера работают по одному принципу: генерировать изображение с картой по запросу пользователя (картинку с участком карты) и встраивать её в страницу сайта. Т.е. на web-сервер приходит HTTP запрос, в котором содержится информация, например, о географических координатах «окна» отрисовки карты, о размере самой карты, о необходимых для отображения слоях карты и т.п. В качетсве ответа на такой запрос клиенту (в браузер пользователя) возвращается картинка с отрисованной картой согласно параметрам запроса. Ключевой момент здесь – рисовать участок карты в заданных границах (координатах). Т.е. это как раз тот инструмент, при помощи которого можно рисовать тайлы.

На самом деле в Интернете и в документации к этим GIS web-серверам можно найти информацию о том, как «прикрутить» такой веб-сервер к Google Maps. Т.е. как было описано выше – со страницы генерируются запросы на загрузку необходимых тайлов, сервер «рисует» необходимые картинки и возвращает их клиенту (в браузер) и JavaScript «сшивает» их в одно целое панно – и пользователь видит карту на странице сайта. Всё просто. Вроде бы…

Ресурсы, ресурсы, ресурсы…

Теперь немного простых оценочных вычислений. Предположим, что карта на странице будет иметь размеры 1000х600 пикселов, т.е. для покрытия такого «окна» нужно примерно 12-16 тайлов. Т.е. 12-16 запросов на сервер и сервер должен сгенерировать в ответ 12-16 картинок. Так же предположим, что пользователь активно что-то ищет на карте – перемещает её, изменяет масштаб. Вероятно, что пиковая нагрузка – это отрисовка 10 тайлов в секунду (для одного пользователя). Вообще нужно сказать, что подобные операции не совсем «легковесны» и требуют определённой процессорной мощности и объема памяти. Таким образом, можно предположить, что даже если сайт, на котором размещена ваша карта, посещает немного людей, но пиковая нагрузка, которую должен держать сайт (относительно запросов на отрисовку карты) может намного выше 10 запросов в секунду – нужно брать с серьёзным запасом, в районе 100 запросов в секунду. Конечно, для мощного сервера это пустяк.

Но позвольте, кто может позволить себе хостинг к примеру, хотя бы с выделенными 512 «метрами» памяти и без серьёзных ограничений на ресурсы процессора. Не стоит забывать ещё и тот момент, что не все тарифные планы хостинга подразумевают возможность размещения специального ПО – таких как GIS Web-сервера и базы данных с поддержкой хранения пространственных данных (spatial option). Я думаю, что нужен как минимум виртуальный выделенный сервер (VPS) или даже «реальный» выделенный сервер.

Вот несколько ссылок на тарифы VPS хостинга (для справки): 

В принципе, не очень дорого, но всё же не копейки (например, для некоммерческого проекта или персонального сайта). Я лично считаю, что для «маленького» хобби или просто «доброго дела», когда денег жалко, но очень хочется попробовать – это предел в 100 долларов в год (моё личное мнение).

Да, и администрировать, и настраивать VPS сервер (как правило, под UNIX/Linux) придётся почти на 100% самому.

Хотя есть хостинг провайдеры, которые уже предоставляют услуги по размещению web-приложений с GIS Web-серверами.

Вот что народ пишет по поводу хостинга для ГИС приложений:

Неужели придётся отказаться от идеи создания своего более-менее функционального ГИС web-приложения на не дорогом/дешевом хостинге? Думаю, что нет – есть и другие пути. Один из них хочу предложить далее. 

Если гора не идёт к Магомеду, то Магомед идёт к горе

Итак, мы можем себе позволить не дорогой хостинг, с лимитом оперативной памяти 30-40 мегабайт (а может и меньше) и с серьёзными ограничениями на ресурсы процессора (т.е. нет мощностей или они сильно ограничены). Это нормальная ситуация для недорогого виртуального хостинга, когда на одном сервере «живёт» куча (может быть даже сотни) сайтов, а у сервера всего пару камней и 4 гектара на борту на всех. Или даже нет поддержки какой-либо технологии динамических страниц (PHP, JSP, ASP) или другого способа генерации динамического контента – т.е. есть возможность размещать только статические файлы (HTML  странички).

В таком случае работает старый добрый приём – мы создадим/отрисуем все тайлы заранее (для всех нужных масштабов для нужного участка карты) и просто разместим уже готовые рисунки на своём сервере как статический контент. Тогда на веб-сервер ложиться только задача передачи изображений клиенту (в браузер пользователя) по запросу – нагрузка, с которой он просто обязан справляться хорошо или даже отлично.

Остаётся только написать для страницы с картой JavaScript код, который «заставит» клиентский JavaScript движок Google Maps подгружать тайлы с нашего сервера. Эта стандатрная функция для работы со слоями (overlays) из Google Maps API (доки на русском и на английском):


tileLayer.getTileUrl = function(tile, zoom) {
return '/tiles/' + zoom + '/' + tile.x + '_' + tile.y + '.png';
};

Пример: http://myhost.com/tiles/14/9901_5120.png

Где 14 – номер зума, 9901 – X координата тайла, 5120 – Y координата тайла. Т.е. на сервере будет директория «tiles», где в директории «14» будет храниться картинки для 14-го зума, такая как 9901_5120.png. В директории «15» - соответственно 15-й зум и т.д.

Но как же мы отрисуем большое количество тайлов (для небольшого участка карты и для нескольких масштабов количество тайлов может измеряться тысячами!)? Ну, разумеется при помощи GIS Web-серверов!! Настроим сервер на своём «домашнем» компьютере и заставим его нарисовать нам нужные тайлы! Пускай он «попыхтит» немного, ничего страшного в этом не будет. Ну и что мы будем единственным пользователем этого сервера на время создания тайлов, т.е. будем использовать ГИС веб-сервер не по прямому назначению?! А потом придётся несколько «метров» картинок закачивать на сервер по FTP!? Но задача будет решена – не так ли?!

Ну, хорошо, что если данные для вашей карты подвергаются периодическим изменениям?! Неужели придётся каждый раз пересоздавать тайлы и выкладывать их на сервер?! Я отвечу - а почему бы и нет!!? Этот процесс может быть простым и автоматическим, и я уверен, что в 99 процентах случаев, можно обновлять тайлы с частотой 1-2 раза в неделю или даже реже. Даже если один-два раз в день – не вижу в этом проблемы, если процесс автоматизирован.

Конечно, следует «скачать» какой-либо свободно распространяемый GIS Web-сервер, такой как MapServer или GeoServer. Лично я остановился на последнем варианте, т.к. являюсь ярым приверженцем платформы Java от Sun.

Эти сервера поддерживают различные источники данных – файлы и базы данных. И нам собственно нужно «подключить» наши данные к серверу. О том, как это делается – написано в документации и есть куча информации в Интернете.

Так же необходимо настроить стилизацию карт – то, как они должны выглядеть – цвета, линии, шрифты для подписей и т.п. Этот процесс так же расписан в документации.

Будем считать, что у нас имеется готовый к работе GIS Web-сервер. Теперь о том, как заставить его создавать необходимые нам тайлы. Разумеется, никто не собирается просить его об этом «в ручную». Нужна программа, которая будет просить его делать это. Типа такого: «создать тайлы для заданной географическими координатами прямоугольной области карты для заданных масштабов и сохранить полученные изображения на диск в указанную папку». Т.е. мы запускаем GIS Web-сервер, потом запускаем такую программу с указанными параметрами (она будет работать с сервером - он будет предоставлять ей готовые картинки). Ждём немного (продолжительность будет зависеть от объёма работы и от мощности компьютера, но сразу нужно сказать – не очень быстро, чаю выпить успеете) – и радуемся результату, после чего копируем полученные изображения на сервер своего сайта (это, наверное, так же можно автоматизировать).

Всё ли так хорошо?

На самом деле не совсем всё хорошо, хотя и будет неплохо работать. При таком подходе «в лоб» многие тайлы просто окажутся «пустыми». Взгляните на рисунок:

Схема покрытия карты  

Серые квадратики – это тайлы, в которых будет содержимое. Всё остальное «белое пространство» - это тайлы, на которых не будет ничего нарисовано. Т.е. наш сервер будет работать в «холостую» очень часто. По правде сказать, сначала я этому значения не предал, поэтому тайлы генерировались очень долго – больше часа а то и двух (на моём довольно «слабеньком» компьютере, Celeron-D 2,8Hz, 1GB RAM). Но потом эта проблема была решена довольно простым способом, и всё стало работать примерно в 10 раз быстрее. Всё очень просто – нам нужно заранее знать, какие тайлы будут «пустыми» - т.е. создать для каждого масштаба «индекс», простой прямоугольный массив, где будет записано для каждого элемента (x,y) является ли тайл с такими координатами «пустым» или нет (0 или 1, true или false). Создать такой индекс можно в принципе разными способами, но я предпочёл делать это следующим образом:

Т.к. географические данные в моём случае хранились в базе данных (PostgreSQL/PostGIS), я написал простенькую программу, которая «опрашивает» базу и опеределяет «пустые» тайлы. Например, SQL запрос (синтаксис PostgreSQL/PostGIS): 


SELECT COUNT(*) FROM streets_geom
WHERE Crosses(GeomFromText('POLYGON((minX, maxY, maxX, maxY, maxX, minY, minX, minY, minX, maxY’))), the_geom) = TRUE

Где minX/minY и maxX/maxY – координаты (широта/долгота) левого нижнего и правого верхнего «угла» тайла. Если запрос вернёт значение больше нуля – то в область тайла попали объекты карты, если 0 – не попали, тайл будет пустым.

На создание таких «индексов», разумеется, так же нужно время, но это значительно позволит ускорить процесс создания тайлов. Предварительно можно создать такой индекс, выгрузить его в файл, а затем уже использовать его при генерации тайлов. Таким образом, отделяем зёрна от плевел - отсеиваем всё не нужное.

Такой подход не только значительно повысит скорость создания тайлов для карты, но и может значительно уменьшить суммарный размер (в мегабайтах) тайлов. Это благодаря тому, что «пустые» тайлы можно исключить. Для карт средней насыщенности пустых тайлов будет более 60%.

WMS сервисы

Этот аспект я считаю важным, поэтому не могу его обойти. WMS (Web Map Service) – это стандартный прикладной протокол верхнего уровня для работы с изображениями географических объектов через Интернет. Проще говоря, при помощи этой «штуковины» можно получать картинки с картой по заданным параметрам с удалённых серверов в Интернете (или в любой другой сети). Работа с WMS сервисами чаще всего ведётся по протоколу HTTP. Спецификация WMS сервисов здесь.

Многие GIS Web-серверы поддерживают WMS (MapServer, GeoServer, Oracle MapViewer), да и в Интернете куча доступных для использования серверов, поддерживающих WMS. Прелесть этого в том, что клиентам всё равно, кто поставщик таких сервисов, на каком ПО это работает и где это расположено. И многие настольные GIS десктопы поддерживают работу с WMS сервисами, такие как QuantumGIS или MapInfo Professional.

Например, используя QuantumGIS подключимся к одному из таких сервисов в Интернете. Название этого сервиса – «GMap WMS Demo Server», адрес: http://www2.dmsolutions.ca/cgi-bin/mswms_gmap

Для этого запустим QuantumGIS, и подключим WMS слой (Меню «Слой/Добавить WMS слой».

Добавить WMS слой в QuantumGIS 

Далее – кнопка «Создать»:

Добавить WMS сервер в QuantumGIS 

Затем «Подключить», выбрать интересующий слой и, – вуа-ля!

WMS слой открытый в QuantumGIS 

Для тех, кто не знает – QuantumGIS – свободно распространяемый GIS десктоп. И очень даже не плохой! Не буду тыкать пальцем, но многие коммерческие продукты этого типа даже хуже (по моему скромному мнению).

Это конечно всё «круто», но нас интересует здесь другое – «многие GIS Web-серверы поддерживают WMS». А раз WMS сервисы могут «предоставлять» нам картинки с участками карты, то это мы можем использовать для программы генерации тайлов. Т.е. WMS – это тот протокол, по которому программа может «общаться» с сервером. Главное преимущество – такой программе будет всё равно, что за GIS Web-сервер «выдаёт» ей картинки – будь то Oracle MapViewer, MapServer или GeoServer.

А теперь сделаем вот что: откроем в браузере вот этот URL: http://www2.dmsolutions.ca/cgi-bin/mswms_gmap?service=WMS&request=GetMap&version=1.1.1&layers=DEMO&srs=EPSG:4326&bbox=-148.059,35.882,-33.7745,72.5503&format=image/png&width=400&height=250

И вот что мы увидим:

Карта с одного из WMS серверов в интернете 

Это и был один из запросов к WMS сервису в действии. Детально я разбирать его не буду (все, кому интересно, найдут в Интернете кучу информации), просто замечу, что в этом HTTP GET запросе нужны определённые параметры. Например: 

  • Layers=DEMO – какую карту использовать (можно через запятую указать несколько карт/слоёв),
  • bbox=-148.059,35.882,-33.7745,72.5503 – координаты «углов» участка карты, через запятую,
  • width=400 – ширина получаемой картинки (карты) в пикселах,
  • height=250 – высота картинки в пикселах

Подведу итог. Если создавать программу, которая будет работать с GIS Web-сервером и создавать нам нужные тайлы (хотя реально рисовать будет сервер, а программа всего лишь будет управлять сервером и «складывать» полученные тайлы в виде файлов с картинками с определёнными именами куда-то на диск), то использование WMS сервисов будет самым подходящим вариантом.

MapTilesBuiilder

Для создания карты Архангельска на основе Google Maps использовался как раз подход, изложенный выше. Для чего было создано довольно не сложное консольное приложение, которое я назвал MapTilesBuilder. Приложение позволяет, и строить индексы, и создавать тайлы для карт, взаимодействуя с GIS Web-сервером посредством WMS сервисов (в нашем случае это был GeoServer). Создано приложение на основе Java SE, поэтому для работы оно требует установленную на компьютер JRE. Java используется по трём причинам:

  1. Я ярый поклонник Java :-)
  2. Запускать такое приложение можно на любой операционной системе, поддерживающей JRE.
  3. Карта Архангельска на сайте itroadlabs.com работет под управлением Java EE, поэтому это удобно для «обобщения» кода.

Более подробно про это приложение написано здесь, там же можно его скачать и попробовать в работе. 

Как всё это использовать для создания web-приложений?

Теперь несколько слов о том, как всё это можно использовать для создания интерактивной карты на основе Google Maps на своём сайте. На самом деле всё очень просто. 

Допустим, у нас имеется набор файлов и файлы индексов для каждого масштаба (zoom-а). Так же допустим, что уже имеется представление о Google Maps API и о том, какой JavaScript код нужен нам на странице для создания карты и подключения собственного слоя (тайлы для которого как раз уже были подготовлены). 

Ну и вот как можно поступить (пример Java Servlet-а): 


@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int x = Integer.parseInt(request.getParameter("x"));
int y = Integer.parseInt(request.getParameter("y"));
int zoom = Integer.parseInt(request.getParameter("zoom"));
if (tilesIndex.forZoom(zoom).isEmpty(x,y)) {
forward("/map-tiles/transparent-stub.png", request, response);
} else {
forward("/map-tiles/" + zoom + "/" + x + "_" + y + ".png", request, response);
}
}

Логика здесь проста – берём из HTTP запроса необходимые параметры (x, y, zoom), смотрим в индекс. Если тайл «пустой» - возвращаем стандартную картинку для пустых тайлов (простое «прозрачное» и «пустое» изображение размером 256х256 пикселов). Если нет – возвращаем тайл (файл расположен в директории «/map-tiles/<номер зума>» в корне веб-сервера, и имеет соответствующее имя по координатам тайла (x,y)).

Пример, разумеется, сильно упрощён, но даёт, на мой взгляд, хорошее представление. Конечно, можно (и, наверное, нужно) установить в заголовке HTTP ответа ещё и атрибуты кэширования возвращаемого изображения браузером.

В принципе, похожий код можно размесить и на клиенте – прямо в странице сайта. Этот вариант подойдёт для ультра бюджетных сайтов, которые хостятся на условиях, когда тарифный план предусматривает размещение на сервере только статического контента (статические страницы, изображения и т.п.). Вот пример JavaScript кода, для подгрузки тайлов (на основе Google Map API):


tileLayer.getTileUrl = function(tile, zoom) {
if(zoom < 13 || zoom > 17 || tile.x < 9000 || tile.x > 9100 || tile.y < 5100 || tile.y > 5400) {
return '/tiles/transparent-stub.png';
} else {
return '/tiles/' + zoom + '/' + tile.x + '_' + tile.y + '.png';
}
};

Только есть одна проблема – индексы. На стороне клиента (в браузере) будет довольно сложно размесить индекс. Но, действительно ли это проблема или нет – нужно решать в конкретных условиях. Например, у вас «пустых» тайлов получается всего не более 20-25% (карта предельно насыщенная). В таком случае, возможно, применение индексов тайлов не целесообразно – тайлы можно создавать и без индексов – со «сплошным» покрытием. Это приведёт к увеличению числа файлов с изображениями (тайлов), но это не так уж и страшно.

В качестве заключения

Мораль сей басни такова – при соответствующем подходе размещение электронных карт на страницах Интернет сайтов довольно не сложная задача. Проблемы с ресурсами и ПО решаются так же без каких-либо серьёзных затрат. Порядок вещей намного проще, чем кажется изначально.

Кто-то может заметить, что описанная здесь технология избыточна. Может быть… Возможно, есть смысл подключиться к «движку», который отрисовывает карты на прямую, минуя WMS/HTTP – это даже может значительно повысить скорость работы. Однако, в общем случае, это недокументированная возможность (я не нашёл такого в документации). Да и в таком случае реализация доступа к такому движку будет для каждого движка отдельная, а в случае WMS – одна реализация подключения к сервису, и в этом его преимущество.

[На верх страницы]
Loading... Загрузка...