GeoServer에서 OpenLayers 맵으로 간단한 WFS 레이어를 추가하는 방법은 무엇입니까?


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 기능 유형에 대해 "parks"및 "medford : parks"를 시도했습니다.

레이어가 활성화되고 보급되었으며 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가 null이기 때문에 geometryName을 기본값보다 유지하지만 기본값이 없으면 map projection (이 경우 27700)을 사용합니다.

답변:


24

이 게시물에 대한 내 대답을 살펴보십시오 .

  1. featureNS 값이 GEOSERVER의 "네임 스페이스 URI에서 작업 공간 페이지 편집"에 있는지 확인하십시오. " http://postgis.org " 와 같은 일반적인 것을 사용하지 마십시오 . " http : // yourdomain / application / catalogLayer "또는 이와 유사한 것을 사용하십시오. 이 URI를 만들 수 있고 고유하게 만들면됩니다.
  2. 전략으로 새로운 BBOX ()가 있지만 해당 상자의 크기는 무엇입니까? 테스트를 위해 [new OpenLayers.Strategy.Fixed ()]로 변경하겠습니다.
  3. featureType은 실제로 지오메트리의 유형이 아니며 GEOSERVER의 "계층 이름"입니다 (오해의 소지가 있음).
  4. geometryName은 지오메트리 데이터 유형이있는 postgis 데이터베이스의 필드 이름입니다. GEOSERVER의 "레이어 편집"아래에서 "기능 유형 세부 사항"의 맨 아래를 볼 수 있습니다. "Geometry"유형의 필드가 표시됩니다. 속성 열 아래의 값을 사용하십시오.

featurePrefix 및 version을 지정합니다. 다음과 같이 해보십시오 :

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라고하고 featurePrefix를 추가했습니다. 작업 영역을 추가하거나 추가하지 않고 featureType을 시도했습니다. " rpid.opengeo.com ", " localhost : 8081 / rpid "를 포함한 다양한 네임 스페이스를 시도했습니다 . 나는 여전히이 속성에 대해 혼란 스럽습니다. 투영 및 지오메트리 이름 (GEOM)을 삽입했습니다. 내 map.html 페이지는 file : /// C : /Aptana/Workspace/GIS/map.html에 있습니다. 이것이 아래의 동일한 원산지 정책으로 나를 잡을 수 있습니까? 방화범에 내 인터넷 타베는 응답이 가진 '옵션의 WFS'이다
geo_james

2
featureNS의 네임 스페이스는 원하는대로 사용할 수 있으므로 두 가지 모두 작동합니다. 중요한 것은 지오 서버에서 정확히 동일하다는 것입니다. 그렇지 않으면 일이 직렬화되지 않고 웹 서비스에서 응답이 없습니다. 그래서 클릭 geoserver로 이동하여 workspace(이 페이지에 당신을 데려 갈 것이다 Edit Workspace(가). Name로 넣어 것입니다 featurePrefix. 그리고는 Namespace URI당신이로 넣어 것입니다 featureNS. 또한,하지 않도록 경우 file:///c:위치가 프록시를 사용하도록 요구합니다.하지만 내가 만들 것 파일 http://localhost을 테스트하고 확인하기 위해 라이브
CaptDragon

이제 코드를 localhost : 8081 / apps / index.html로 옮기고 featureNS를 변경했습니다. 이제 응답에 30 개의 기능이 다시 표시되는 것을 볼 수 있습니다 ... </ rpid : GROSS_AREA>. 진행! 그러나 내지도에 기능이 표시되지 않습니다. WMS로 추가하면 잘 볼 수 있습니다. 다른 계층은 기본 WMS입니다. 내 콘솔에도 다음과 같은 오류가 있습니다. OpenLayers.Marker가 정의되지 않았으며 Ext.preg가 함수가 아닙니다. 모든 라이브러리를 로컬로 가져 오는 중 ...
geo_james

응답에 30 개의 기능이 있다고 말합니다. 그들은 부모 <wfs:FeatureCollection numberOfFeatures="30"... 요소에 싸여있는 XML 형식 입니까?
CaptDragon

새롭고 간단한 테스트 페이지 를 만들고 해당 WFS 계층을 추가한다고합니다. OpenLayers.Marker가 WFS와 관련이 없으므로 코드의 다른 부분에서 이러한 오류가 발생하는 것 같습니다. 어쩌면 내가 틀렸지 만 간단한 테스트 페이지를 만들면 항상 작동하는지 여부를 결정하는 데 도움이됩니다. 그것이 내가 어쨌든하는 것입니다.
CaptDragon

3

가장 먼저 확인해야 할 것 : 'medford.opengeo.org'의 서버 / 테스트 웹 페이지가 있습니까? 그렇지 않은 경우 동일한 오리진 정책으로 인해 WFS에 액세스 할 수 없습니다 . 기술적으로 프록시를 사용하여이 문제를 해결할 수 있습니다. (제 생각에는 WFS가 제대로 설계되지 않은 프로토콜 일뿐입니다)


1
동일한 출처는 브라우저 문제이며 WFS는 설계된대로 정확하게 작동합니다.
Ian Turton

예 / 아니요 : WFS는 XML이므로 Firefox (및 '데스크톱')를 제외한 모든 플랫폼에서 XML 파서를 필요로하며 도메인 간 통신을 수행해야하는 유일한 방법 인 JSONP 와도 잘 혼합되지 않습니다. 반면에 GeoJSON은 거의 모든 브라우저에서 기본적으로 구문 분석되며 도메인 간 호환을 위해 쉽고 일반적으로 래핑됩니다. 분명히 사과 대 오렌지가 아니며 그것은 내 WFS 비판의 정도 (부풀어 오르거나 확장되지 않은 등)가 아닙니다.
tmcw

브라우저가 좋은 WFS 클라이언트를 만든다고 가정합니다. 대량의 지리 데이터를 웹 브라우저에 벡터로 가져 오기를 거의 원하지 않습니다.
Ian Turton

안녕하세요 tmcw. 내 테스트 페이지는 내 C 드라이브의 로컬 파일이 아닙니다. 포트 8081에서 로컬 GeoServer로 작업하려면 네임 스페이스 URI를 어떻게 설정해야합니까?
geo_james

2

문제는 기능 이름에 접두사가 있고 GeoServer 및 / 또는 OpenLayers와 혼동되는 네임 스페이스라는 것입니다.

시험:

 featureType : "parks",

http://ian01.geog.psu.edu/geoserver/www/wfs/index.html 에 주석이 달린 소스 코드 가있는 WFS 예제가 있습니다.


고마워요 지금은 접두사없이 시도하고 나는 더 넓은 문제가 있다고 생각
geo_james

링크가 작동하지 않습니다
Sam007

0

"medford : parks"에서 "parks"로 기능 유형을 수정하십시오.

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

코드가 정상입니다. 페이지의 브라우저 주소 만 변경하면됩니다. "file : \ c ......"대신 "localhost : 8080 / geoserver / www / your_file_name.html"을 통해 브라우저 페이지를 가리 킵니다.

그러면 벡터 레이어가 완벽하게 렌더링됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.