Как добавить простой слой WFS из GeoServer на карту OpenLayers?

19

Я пытаюсь добавить один из включенных наборов данных с GeoServer на карту OpenLayers. Я следовал учебным пособиям по OpenGeo, видел подобную ветку здесь, но, похоже, не могу ее взломать. Может кто-нибудь взглянуть на мой код и настройку GeoServer и сказать, где я ошибаюсь?

Вот мой код:

//WMS map
world = new OpenLayers.Layer.WMS("Global Imagery", "http://maps.opengeo.org/geowebcache/service/wms", {
    layers : "openstreetmap",
    format : "image/png"
});
map.addLayer(world);

//WFS
parks = new OpenLayers.Layer.Vector("WFS", {
    strategies : [new OpenLayers.Strategy.BBOX()],
    protocol : new OpenLayers.Protocol.WFS({
        url : "http://localhost:8081/geoserver/wfs",
        featureType : "medford:parks",
        featureNS : "http://medford.opengeo.org/medford"
    })
});

map.addLayer(parks);

map.zoomToMaxExtent();

Подробности GeoServer: имя рабочего пространства = medford, URI пространства имен = http://medford.opengeo.org Для типа объекта, который я пробовал, «парки» и «медфорд: парки»

Слой включен, объявлен и имеет предел возврата 30 объектов.

Я изо всех сил пытаюсь собрать простую карту.

Обновленное решение. Работает в настоящее время.

wfs = new OpenLayers.Layer.Vector("Fields_WFS", {
        strategies : [new OpenLayers.Strategy.Fixed()],
        protocol : new OpenLayers.Protocol.WFS({
        version : "1.1.0",
        url : GEOSERVER_HOST + ":" + GEOSERVER_PORT + "/geoserver/wfs", 
        featurePrefix : "rpid",
        featureType : "FIELDS_SUBSET_BNG_OSGB36_1",
        featureNS : "<namespace>", 
        //geometryName : "GEOM", type "Geometry"
        srsName : "EPSG:27700"
}),
    renderers : renderer
})

Не нужно указывать имя геометрии в определении слоя. Так как Native SRS был нулевым в нашем наборе данных, если мы сохраним geometryName, чем он принимает значение по умолчанию, но без него он использует проекцию карты (в нашем случае 27700).

geo_james
источник

Ответы:

24

Посмотрите на мой ответ на этот пост .

  1. Убедитесь, что ваше значение featureNS находится на странице «Редактировать страницу рабочего пространства под URI пространства имен» в вашем GEOSERVER. Не используйте что-то общее, как " http://postgis.org ". Используйте что-то вроде « http: // yourdomain / application / catalogLayer » или что-то уникальное в этом роде. Вы можете создать этот URI, просто сделайте его уникальным.
  2. У вас есть новый BBOX () в качестве стратегии, но что у этого окна есть в качестве измерений? Я бы изменил его на [новый OpenLayers.Strategy.Fixed ()] для тестирования.
  3. featureType на самом деле не является типом геометрии, это ваше «имя слоя» в GEOSERVER (я знаю, вводит в заблуждение).
  4. geometryName - это имя поля в вашей базе данных postgis с типом данных Geometry. В GEOSERVER, под «Редактировать слой» вы можете увидеть внизу «Детали типа элемента». Там вы увидите поле с типом «Геометрия». Используйте значение под столбцом свойств

Я бы уточнил featurePrefix и версию. Попробуйте что-то вроде этого:

var wfs = new OpenLayers.Layer.Vector(
            "Stavros Features",
            {
                strategies: [new OpenLayers.Strategy.Fixed()]
                , projection: new OpenLayers.Projection("EPSG:4326")
                , protocol: new OpenLayers.Protocol.WFS({
                    version: "1.1.0",
                    url: "http://localhost:8081/geoserver/wfs",
                    featurePrefix: 'myWorkspace', //geoserver worspace name
                    featureType: "medford:parks", //geoserver Layer Name
                    featureNS: "http://medford.opengeo.org/medford", // Edit Workspace Namespace URI
                    geometryName: "bounds" // field in Feature Type details with type "Geometry"
                })
            });
CaptDragon
источник
Спасибо, капдрагон. Я сделал все шаги, но все еще не радости ... мое рабочее пространство теперь называется rpid, и я добавил FeaturePrefix. Я пробовал featureType с добавлением и без добавления рабочей области. Я пробовал различные пространства имен, в том числе: « rpid.opengeo.com », « localhost: 8081 / rpid ». Я все еще не понимаю эту недвижимость. Я вставил имя проекции и геометрии (GEOM). Моя страница map.html живет здесь: file: /// C: /Aptana/Workspace/GIS/map.html. Это поймает меня с той же Политикой Происхождения ниже? Моя сетевая вкладка в Firebug показывает «Опции wfs» без ответа
geo_james
2
Пространство имен featureNS может быть любым, так что оба будут работать. Важно то, что он у вас точно такой же на вашем геосервере. Или же вещи не сериализуются, и вы не получаете ответа от веб-службы. Так что зайдите в geoserver, нажмите на ваш workspace(это приведет вас к странице Edit Workspace. NameЭто то, что вы положили как featurePrefix. И Namespace URIэто то, что вы положили как featureNS. Кроме того, не уверен, если file:///c:местоположение потребует от вас использовать прокси. Но я бы сделал файл в прямом эфире, http://localhostчтобы проверить и убедиться.
CaptDragon
Хорошо, теперь я переместил свой код в localhost: 8081 / apps / index.html и изменил свою функциюNS. Теперь я вижу 30 функций, возвращающихся в ответ ... <rpid: OBJECTID> 25 </ rpid: OBJECTID> <rpid: FIELD_ID> NS / 86427/74196 </ rpid: ‌ FIELD_ID> <rpid: GROSS_AREA> 2.307 </ rpid: GROSS_AREA>. Прогресс! Однако я не вижу никаких функций на моей карте. При добавлении в качестве WMS я вижу их нормально. Единственный другой слой - это базовый WMS. Моя консоль также пронизана ошибками, такими как: OpenLayers.Marker не определен, а Ext.preg не является функцией. Я импортирую все свои библиотеки локально ...
geo_james
Когда вы говорите, что в ответе 30 функций. Они в формате XML, завернутые в родительский <wfs:FeatureCollection numberOfFeatures="30"... элемент, верно?
CaptDragon
Я бы сказал, создать новую очень простую тестовую страницу и добавить этот слой WFS. Мне кажется, что эти ошибки происходят из других частей вашего кода, так как OpenLayers.Marker не связан с WFS. Возможно, я ошибаюсь, но создание простой тестовой страницы всегда помогает определить, работает она или нет. Это то, что я делаю в любом случае.
CaptDragon
3

Первое, что нужно проверить: находится ли ваш сервер / тестовая веб-страница на medford.opengeo.org? Если это не так, вы не сможете получить доступ к WFS из-за единой политики происхождения . Технически вы можете использовать прокси, чтобы это исправить. (хотя, на мой взгляд, это всего лишь случай, когда WFS является плохо разработанным протоколом)

tmcw
источник
1
Same Origin - проблема браузера, WFS работает точно так, как задумано.
Ян Тертон
Да и нет: WFS - это XML, поэтому он требует синтаксического анализатора XML на каждой платформе, кроме Firefox (и «рабочего стола»), и он также плохо сочетается с единственным способом, которым мы должны осуществлять междоменную связь: JSONP. GeoJSON, с другой стороны, изначально анализируется почти в каждом браузере и легко и обычно упаковывается для обеспечения междоменной совместимости. Очевидно, не яблоки к апельсинам, и это не степень моей критики WFS (раздутый, плохо расширенный, и т. Д.).
tmcw
Вы предполагаете, что браузеры делают хороших клиентов WFS. Вам вряд ли захочется переносить большие объемы географических данных в веб-браузер в качестве векторов.
Ян Тертон
Привет tmcw. Нет, моя тестовая страница - это просто локальный файл на моем диске C. Что я должен установить для своего URI пространства имен, если я хочу работать с локальным GeoServer на порту 8081?
geo_james
2

Ваша проблема в том, что у вас есть префикс в имени функции и пространстве имен, это сбивает с толку GeoServer (и / или OpenLayers).

Пытаться:

 featureType : "parks",

У меня есть несколько примеров WFS на http://ian01.geog.psu.edu/geoserver/www/wfs/index.html с закомментированным исходным кодом, который вы можете изучить.

Ян Тертон
источник
Спасибо, iant. Я сейчас попробовал без префикса, и я думаю, что есть более широкая проблема
geo_james
ссылка не работает iant
Sam007
0

просто исправьте ваш тип функции от "медфорд: парки" до "парки"

var wfs = new OpenLayers.Layer.Vector(
            "Stavros Features",
            {
                strategies: [new OpenLayers.Strategy.Fixed()]
                , projection: new OpenLayers.Projection("EPSG:4326")
                , protocol: new OpenLayers.Protocol.WFS({
                    version: "1.0.0",
                    url: "http://localhost:8081/geoserver/wfs",
                    featureType: "parks", //geoserver Layer Name without workspace prefix
                    featureNS: "http://medford.opengeo.org/medford"

                })
            });

См. Jsfiddle как пример: http://jsfiddle.net/expedio/ucrtthya/

Томас Б
источник
-1

Ваш код в порядке. Вам просто нужно изменить адрес браузера вашей страницы. Направьте страницу браузера через "localhost: 8080 / geoserver / www / your_file_name.html" вместо "file: \ c ......"

Тогда векторный слой будет рендериться отлично.

Шахида Умар
источник