Як додати простий шар 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, ім'я простору імен = 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).

Відповіді:


24

Погляньте на мою відповідь у цьому дописі .

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

Я б вказав functionPrefix та версію. Спробуйте щось подібне:

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"
                })
            });

Дякуємо капрагону. Я зробив усі кроки, але досі не радіє ... моя робоча область тепер називається rpid, і я додав функціюPrefix. Я спробував featureType з робочим простором і без його додавання. Я пробував різні простори імен, включаючи: " rpid.opengeo.com ", " localhost: 8081 / rpid ". Я все ще плутаю цю власність. Я вставив назву проекції та геометрії (GEOM). Моя сторінка map.html живе тут: файл: /// C: /Aptana/Workspace/GIS/map.html. Чи вдасться мені це виграти із тієї ж політики щодо походження нижче? Моя таблиця Net в Firebug показує "OPTIONS wfs" без відповіді
geo_james

2
Простір імен FeatureNS може бути будь-яким, що вам подобається, тому обидва будуть працювати. Важливо те, що у вас це точно так само на вашому геосервері. Інакше речі не серіалізуються, і ви не отримаєте відповіді від веб-служби. Отже, перейдіть у геосервер, натисніть на вашу 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, який є погано розробленим протоколом)


1
Same Origin - проблема з браузером, WFS працює точно так, як було розроблено.
Ян Тертон

Так і ні: WFS - це XML, тому для цього потрібен XML-аналізатор на будь-якій платформі, окрім Firefox (і «робочого столу»), і він також не добре поєднується з єдиним способом спілкування між доменами: JSONP. GeoJSON, з іншого боку, в основному розбирається майже в кожному веб-переглядачі, і його легко і просто обробляти, щоб бути сумісним між доменами. Очевидно, що це не яблука-апельсини, і це не ступінь моєї критики щодо ВПС (роздута, погано розширена тощо).
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 з коментованим вихідним кодом, який ви можете вивчити.


Дякую Іант. Зараз я спробував без префікса, і я думаю, що існує більш широка проблема
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 ......"

Тоді векторний шар візуалізується ідеально.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.