Страница 1 из 3

OpenLayers и WFS (GeoServer)

Добавлено: 25 окт 2010, 11:29
Mavka
Описывается работа с WFS в OpenLayers при условии что все происходит в Windows, установлен OSGeo4W и GeoServer. Добавление слоя WFS на карту само по себе очень простое, но потребуется настройка прокси.
Внимание: Для UMN MapServer инструкция не подходит. Там свои тонкости с СК и присутствует bug.

Cross-domain security

Допустим, что сайт обслуживается сервером Apache из состава OSGeo4W. GeoServer работает в отдельном контейнере сервлетов (Jetty, Tomcat). (Контейнеры сервлетов, как правило, могут выступать и в роли http-серверов, но в данном случае этот вариант не рассматривается.) Политика безопасности JavaScript запрещается обращаться на другие серверы. Получается, что веб-сайт расположен на сервере localhost:80, а GeoServer - на localhost:8080.

Поэтому потребуется на другом языке (php, python) создать proxy-скрипт, который будет обрабатываться тем же сервером, на котором расположен сайт. В нашем случае - Apache (localhost:80). Воспользуемся штатным скриптом из состава OpenLayers. Он входит в полный дистрибутив (OpenLayers-2.10\examples\proxy.cgi) и можно скачать отдельно.

Скрипт написан на python, поэтому потребуется интерпретатор. Отправляемся на оф. сайт и берем дистрибутив "Python 2.7 Windows installer" (версия не принципиальна). Устанавливаем в папку "C:\Python27". В proxy-скрипте в первой строке указываем полный путь к интерпретатору:

Код: Выделить всё

#!c:/Python27/python.exe -u        
Настройка прокси заключается в указании все доменов к которым разрешено обращаться. Для наших целей достаточно указать:

Код: Выделить всё

allowedHosts = ['localhost','localhost:8080','www.openlayers.org'] 
Ссылка на openlayer.org добавлена для проверки правильности работы скрипта.

Полученный proxy-скрипт нужно положить в папку "C:\OSGeo4W\bin\". (Так как она уже настроена на выполнение cgi-скриптов). Расширение файла не имеет значения (любое, например proxy.cgi). Для проверки в веб-браузере открываем: http://localhost/cgi-bin/proxy.cgi, должен открыться сайт OpenLayers.org.

GeoServer

Очень важно создать правильный Workspace. Если для сервиса WMS он играл лишь второстепенное значение, то в WFS он необходим для парсинга (чтения) данных в OpenLayers. При создании Workspace в качестве Namespace URI принято указывать ссылку вида <адрес_сайта>/<проект> (например, http://localhost/test). В отличие от URL эта ссылка может не указывать на реальную страницу сайта, главное - что бы URI был уникальным. Если используется Workspace по-умолчанию (topp), то его URI будет таким: http://www.openplans.org/topp.

Далее создается хранилище (Store) и соответствующие слои (Layers). Специально для доступа по WFS ничего делать не требуется, все слои публикуются автоматически.

На этом этапе можно проверить работу в Qunatum GIS. В параметрах соединения:
URL - http://localhost:8080/geoserver/wfs

OpenLayers

Указываем OpenLayers адрес proxy-скрипта (обычно в самом начале кода):

Код: Выделить всё

OpenLayers.ProxyHost = "/cgi-bin/proxy.cgi?url="; 
Создаем слой WFS. Так как класс OpenLayers.Layer.WFS признан устаревшим и в будущих версиях будет удален, то будем действовать по-новому:

Код: Выделить всё

var layer_wfs = new OpenLayers.Layer.Vector('Слой WFS', {
        strategies: [new OpenLayers.Strategy.Fixed({preload: true})],
        protocol: new OpenLayers.Protocol.WFS({
            version: '1.1.0',
            url: 'http://localhost:8080/geoserver/wfs',
            featureType: 'mylayer',
            featureNS: 'http://localhost/test',
            srsName: 'EPSG:900913'
        }),
        visibility: true
}); 
Параметры:
  • featureNS - должен совпадать с Namespace URI в GeoServer;
  • srsName - если не указан, то сервер по-умолчанию выдает данные в epsg:4326.
Далее, как обычно добавляем слой на карту (map) и можно смотреть результат:
img2.png
Пример
img2.png (71.88 КБ) 17685 просмотров
Как видите, в моем примере полигоны получились оранжевого цвета, причем заливка имеет прозрачность 50%. Это стандартный стиль. Как задать свои цвета, а может даже выделить элементы в зависимости от атрибутов расскажу во второй части статьи.

Re: OpenLayers и WFS (GeoServer) [Рецепт]

Добавлено: 01 ноя 2010, 09:23
Denis Rykov
А для чего:

Код: Выделить всё

visibility: false

Re: OpenLayers и WFS (GeoServer) [Рецепт]

Добавлено: 01 ноя 2010, 10:47
Mavka
Идея была показать куда вставлять параметры базового Layers, такие как displayInLayerSwitcher и projection. Что бы не запутались в скобках. Наверное, правда, лучше исправить на 'visibility: true'.

Re: OpenLayers и WFS (GeoServer) [Рецепт]

Добавлено: 02 ноя 2010, 13:46
Denis Rykov
Mavka писал(а):Как задать свои цвета, а может даже выделить элементы в зависимости от атрибутов расскажу во второй части статьи.
Хотелось бы еще увидеть небольшой примерчик как в OpenLayers для векторных слоёв хранить описание символики во внешних файлах. Как я понимаю для этого можно использовать *.sld файлы. Или есть другие способы?

Re: OpenLayers и WFS (GeoServer) [Рецепт]

Добавлено: 03 ноя 2010, 11:44
eternal
Сделал все, установил Geoserver, OsGeo4W и из него установил Apache( меню web и web applications установил полностью), скрипт proxy.cgi исправил как написано в статье. Помещаю в папку "C:\OSGeo4W\bin\", запускаю Apache, перехожу по ссылке http://localhost/cgi-bin/proxy, работа с прокси у меня не проходит даже проверку =)) в чем моя ошибка?

Re: OpenLayers и WFS (GeoServer) [Рецепт]

Добавлено: 03 ноя 2010, 11:56
Mavka
Исправил в инструкции, потерялось окончание cgi. Попробуйте:
http://localhost/cgi-bin/proxy.cgi

Re: OpenLayers и WFS (GeoServer) [Рецепт]

Добавлено: 03 ноя 2010, 16:35
eternal
Работает, спасибо :)

Re: OpenLayers и WFS (GeoServer) [Рецепт]

Добавлено: 05 ноя 2010, 16:01
eternal
Когда пытаюсь создать wfs слой в Geoserver'е, создаю workspace, в нем пытаюсь создать Store, пишет Error creating data store, check the parameters. Error message: Could not acquire data access 'test'

Re: OpenLayers и WFS (GeoServer) [Рецепт]

Добавлено: 05 ноя 2010, 16:39
Mavka
Это значит что GeoServer не может найти файл test. Вы случайно в пути обратные слеши не использовали? Нужно прямые, типа:
file:/D:/Workspace/shapefiles/VerdeRiverBuffer.shp

Re: OpenLayers и WFS (GeoServer) [Рецепт]

Добавлено: 05 ноя 2010, 17:12
eternal
попробовал так file:/D:/разобрать/maps/belgorod/belgorod-bound.shp и в поле Data Source Name * ввел belgorod-bounds все равно пишет Error creating data store, check the parameters. Error message: Could not acquire data access 'belgorod-bounds' после этого переместил файлы на диск D чтобы избежать русских слов в адресе, все равно....

Re: OpenLayers и WFS (GeoServer) [Рецепт]

Добавлено: 05 ноя 2010, 17:48
Mavka
Тогда не знаю. Я все файлы держу внутри DATA_DIR и все пути относительные. Но с полными тоже должен работать. Дефис в названии допускается.

Re: OpenLayers и WFS (GeoServer) [Рецепт]

Добавлено: 05 ноя 2010, 18:10
eternal
попробовал по вашему совету закинуть все в DATA_DIR указал прямые слешы в адресе и вот что выкинуло

Oops, something went wrong...

Sorry, something unexpected happened on the server.

Here's an error report you can include in a JIRA bug report about this issue:
java.lang.NullPointerException
at org.geoserver.catalog.impl.DataStoreInfoImpl.getDataStore(DataStoreInfoImpl.java:37)
at org.geoserver.web.data.store.DataAccessNewPage.onSaveDataStore(DataAccessNewPage.java:87)
at org.geoserver.web.data.store.AbstractDataAccessPage$1.onSubmit(AbstractDataAccessPage.java:159
.... и таких строк много

а можно создать слой в WMS а подключаться к нему через WFS?

Re: OpenLayers и WFS (GeoServer) [Рецепт]

Добавлено: 05 ноя 2010, 18:31
Mavka
Oops, something went wrong...
Вот в этом весь GeoServer.

В GeoServer любой слой доступен как WMS так и WFS, отдельно их создавать нет нужды.

Re: OpenLayers и WFS (GeoServer)

Добавлено: 10 ноя 2010, 11:53
eternal
прописал

Код: Выделить всё

OpenLayers.ProxyHost = "/cgi-bin/proxy.cgi?url=";
добавил слой

Код: Выделить всё

var wfs = new OpenLayers.Layer.Vector('Слой WFS', {
        strategies: [new OpenLayers.Strategy.Fixed({preload: true})],
        protocol: new OpenLayers.Protocol.WFS({
            version: '1.1.0',
            url: 'http://localhost:8080/geoserver/wfs',
            featureType: 'belgorod-bound',
            featureNS: 'http://my.ru',
            srsName: 'EPSG:4326'
        }),
        visibility: true
    });
но он не отображается, хотя proxy.cgi работает ( переходит по ссылке http://localhost/cgi-bin/proxy.cgi)
у меня так и не получилось создать wfs хранилище, может ли из-за этого не отображаться слой, если не из-за этого то в чем ошибка?!?

Re: OpenLayers и WFS (GeoServer)

Добавлено: 10 ноя 2010, 11:58
Mavka
Firebug на "Консоли" показывает обращения к серверу. Что там видно?