OpenLayers и WFS (GeoServer)

Решенные задачи, первая запись - описание решения.
Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Статьи: 11
Проекты: 2/1
Репутация: 9

OpenLayers и WFS (GeoServer)

Сообщение Mavka » 25 окт 2010, 11:29

Описывается работа с 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 КБ) 14311 просмотров
Как видите, в моем примере полигоны получились оранжевого цвета, причем заливка имеет прозрачность 50%. Это стандартный стиль. Как задать свои цвета, а может даже выделить элементы в зависимости от атрибутов расскажу во второй части статьи.
Последний раз редактировалось Mavka 03 ноя 2010, 11:59, всего редактировалось 2 раза.
лангольеры под окном жрали время ом-ном-ном

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3315
Зарегистрирован: 11 апр 2008, 21:09
Статьи: 33
Проекты: 9
Репутация: 492
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 01 ноя 2010, 09:23

А для чего:

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

visibility: false
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Статьи: 11
Проекты: 2/1
Репутация: 9

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

Сообщение Mavka » 01 ноя 2010, 10:47

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

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3315
Зарегистрирован: 11 апр 2008, 21:09
Статьи: 33
Проекты: 9
Репутация: 492
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 02 ноя 2010, 13:46

Mavka писал(а):Как задать свои цвета, а может даже выделить элементы в зависимости от атрибутов расскажу во второй части статьи.
Хотелось бы еще увидеть небольшой примерчик как в OpenLayers для векторных слоёв хранить описание символики во внешних файлах. Как я понимаю для этого можно использовать *.sld файлы. Или есть другие способы?
Spatial is now, more than ever, just another column- The Geometry Column.

eternal
Интересующийся
Сообщения: 26
Зарегистрирован: 26 июл 2010, 17:45
Репутация: 0

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

Сообщение eternal » 03 ноя 2010, 11:44

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

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Статьи: 11
Проекты: 2/1
Репутация: 9

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

Сообщение Mavka » 03 ноя 2010, 11:56

Исправил в инструкции, потерялось окончание cgi. Попробуйте:
http://localhost/cgi-bin/proxy.cgi
лангольеры под окном жрали время ом-ном-ном

eternal
Интересующийся
Сообщения: 26
Зарегистрирован: 26 июл 2010, 17:45
Репутация: 0

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

Сообщение eternal » 03 ноя 2010, 16:35

Работает, спасибо :)

eternal
Интересующийся
Сообщения: 26
Зарегистрирован: 26 июл 2010, 17:45
Репутация: 0

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

Сообщение eternal » 05 ноя 2010, 16:01

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

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Статьи: 11
Проекты: 2/1
Репутация: 9

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

Сообщение Mavka » 05 ноя 2010, 16:39

Это значит что GeoServer не может найти файл test. Вы случайно в пути обратные слеши не использовали? Нужно прямые, типа:
file:/D:/Workspace/shapefiles/VerdeRiverBuffer.shp
лангольеры под окном жрали время ом-ном-ном

eternal
Интересующийся
Сообщения: 26
Зарегистрирован: 26 июл 2010, 17:45
Репутация: 0

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

Сообщение eternal » 05 ноя 2010, 17:12

попробовал так 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 чтобы избежать русских слов в адресе, все равно....

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Статьи: 11
Проекты: 2/1
Репутация: 9

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

Сообщение Mavka » 05 ноя 2010, 17:48

Тогда не знаю. Я все файлы держу внутри DATA_DIR и все пути относительные. Но с полными тоже должен работать. Дефис в названии допускается.
лангольеры под окном жрали время ом-ном-ном

eternal
Интересующийся
Сообщения: 26
Зарегистрирован: 26 июл 2010, 17:45
Репутация: 0

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

Сообщение eternal » 05 ноя 2010, 18:10

попробовал по вашему совету закинуть все в 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?

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Статьи: 11
Проекты: 2/1
Репутация: 9

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

Сообщение Mavka » 05 ноя 2010, 18:31

Oops, something went wrong...
Вот в этом весь GeoServer.

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

eternal
Интересующийся
Сообщения: 26
Зарегистрирован: 26 июл 2010, 17:45
Репутация: 0

Re: OpenLayers и WFS (GeoServer)

Сообщение eternal » 10 ноя 2010, 11:53

прописал

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

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 хранилище, может ли из-за этого не отображаться слой, если не из-за этого то в чем ошибка?!?
Вложения
123.jpg
123.jpg (34.18 КБ) 14030 просмотров

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Статьи: 11
Проекты: 2/1
Репутация: 9

Re: OpenLayers и WFS (GeoServer)

Сообщение Mavka » 10 ноя 2010, 11:58

Firebug на "Консоли" показывает обращения к серверу. Что там видно?
лангольеры под окном жрали время ом-ном-ном

Ответить

Вернуться в «Рецепты»