OpenLayers를 사용하여 GeoServer의 상점에있는 모든 레이어의 이름을 얻는 방법


9

OpenLayers를 사용하여 GeoServer 저장소에서 모든 레이어의 이름을 검색해야합니다. 나는 여기 에 게시물을 보았지만 내 질문에 대답하지 않습니다. 또한 C #, Java 또는 PHP와 같은 다른 언어를 사용하는 경우에 이상적인 GeoServer의 REST API를 살펴 보았습니다. 그러나 나는 이것을 완전히 JavaScript로하고 싶다.

업데이트 :WFS GetCapabilities 문서 에서 볼 수 있듯이 필터를 사용하여 WFS GetCapabilities 요청을 보내 모든 계층의 이름을 검색 할 수 있습니다. 그러나 GetCapabilities요청에 필터를 통합 할 수 있는지 확실하지 않습니다 . 그런 필터가 어떻게 보일지 전혀 알지 못합니다.

이것을 달성하는 방법에 대한 조언은 높이 평가 될 것입니다. 대안적인 접근법도 인정 될 것이다.

최신 정보:

여기 에서 해결책을 찾았 습니다 . "WFS GetCapabilities 요청은 특정 네임 스페이스에 해당하는 계층 만 반환하도록 필터링 할 수 있습니다. 이렇게하려면 요청에 다음 코드를 추가하십시오 : namespace = <namespace>" 이것이 다른 누군가를 돕기를 바랍니다.


확장 된 질문. 언급 한 방법은 이미 게시 된 레이어 및 기타 게시 된 정보의 xml 만 반환합니다. 게시되지 않은 / 보류중인 레이어의 XML 정보를 반환하는 방법이 있습니까? 나는 wms / wfs / wcs / REST와 심지어 파이썬 패키지 gsconfig를 시도했지만 그중 아무도 이것을하지 않을 것입니다.
swap0

답변:


18

귀하에게 적합한 솔루션을 이미 찾았지만 귀하 또는 다른 사람들이 유용하게 사용할 수있는 추가 옵션을 추가 할 수 있다고 생각했습니다.

GeoServer에는 Virtual OWS Services 라는 기능이 있습니다 . WMS, WFS 및 WCS 서비스를 통칭하여 OWS 서비스라고합니다. 이러한 서비스 중 하나에 요청하면 전역 요청을 수행하므로 데이터 보안 설정이없는 한 등록 된 모든 레이어가 기능 문서에 반환됩니다. 반대로 가상 서비스는 글로벌 서비스의 필터링 된보기입니다. 필터링은 작업 공간에서 수행되며 약간 다른 URL을 통해 액세스됩니다.

예를 들어 봅시다. myws 라는 작업 공간이 있고이 작업 공간이 레이어를 나열 하려고 한다고 가정하십시오 . 이 경우 URL을 요청할 수 있습니다.

http://www.yourgeoserver.com/geoserver/myws/ows?SERVICE=WFS&REQUEST=GetCapabilities

리턴 된 기능 문서는 myws 작업 공간에 등록 된 계층 만 나열합니다 .

이것이 한 가지 방법이지만, 원래 JavaScript를 통해 레이어 목록에 액세스하는 방법에 대해 문의했습니다. 다행히도 GeoServer REST API를 사용하여이를 수행 할 수있는 방법이 있습니다. 다음과 같은 방법으로 주어진 작업 공간 및 데이터 저장소에 대한 기능 유형 목록을 얻을 수 있습니다 .

http://www.yourgeoserver.com/geoserver/rest/workspaces/myws/featuretypes.json

이것은 당신에게 모두 나열하는 JSON 개체를 반환합니다 featuretypes 작업 공간 내를, 당신은 또한 .XML에 대한 .json 대체 또는 해당 형식의 응답을 얻기 위해 .html 파일 수 있습니다. OpenLayers에서 어떻게해야합니까? 다행히 OpenLayers는 XMLHttpRequest 객체를 OpenLayers.Request객체 형태로 캡슐화 합니다. 위의 REST URL을 사용하는 간단한 예는 다음과 같습니다.

var request = OpenLayers.Request.GET({
  url: "http://www.yourgeoserver.com/geoserver/rest/workspaces/myws/featuretypes.json",
  callback: function(request) {
    // Code here to handle the response, the request object contains the data
  }
});

OpenLayers로 원격 데이터를 요청하는 것에 대한 좋은 문서가 여기 있습니다 .

그것이 당신에게 고려해야 할 다른 접근법을 제공하기를 바랍니다.


이 게시물 @CHenderson의 모든 제안을 테스트했습니다. 그들은 완벽하게 작동합니다. 고마워 이것은 매우 도움이되었습니다.
okello

문제 없습니다. 기꺼이 도와 드리겠습니다.
CHenderson

그 가상 OWS 서비스 링크는 이제 죽었습니다. 여기
wchatx

매력처럼 작동
AhammadaliPK

전단지에 대한 답변도 추가 하시겠습니까?
Tekson December

2

이 답변은 누군가를 도울 수 있습니다. Javascript와 Leaflet을 사용하여 레이어 목록을 자동으로 만들고 싶었습니다. CHenderson 답변을 사용하여 다음 코드를 작성했습니다.



    url = "https://YOUSERVER/geoserver/STORE/ows?service=wfs&version=2.0.0&request=GetCapabilities"
    layerList = [];
    $.ajax({
        type: "GET",
        url: url,
        dataType: "xml",
        success: function(xml) {
            $(xml).find('FeatureType').each(function(){
                name = $(this).find("Name").text();
                title = $(this).find("Title").text();
                group = "NO_GROUP";
                $(this).find('ows\\:Keywords').each(function(){
                    keyword = $(this).find('ows\\:Keyword').text();
                    if(keyword.indexOf("group:")!=-1)
                    {
                        group=keyword.split(":")[1];
                        return false;
                    }
                });
                layerList.push({"name":name,"title":title,"group":group});          
            });
        }
    });

이런 식으로 여기에 이미지 설명을 입력하십시오지오 서버 레이어에 키워드 "group : GEOGRAPHY" 를 추가 할 수 있으며 각 레이어와 해당 그룹을 수동으로 코딩 할 필요가 없습니다. 이름은 (아마도 L.WMS.source 사용) 레이어를 생성하는 데 사용되며, 제목은 html로 레이블입니다.


1

답변 을 확인하십시오 . 또한 데모를 제공합니다. 계층은 다양한 서비스를 통해 제공된다는 것을 잊지 마십시오.

나는 그것이 당신에게 도움이되기를 바랍니다 ...


확인했습니다. WFS GetCapabilities요청 을 사용하여 이것을 달성 할 수 있다는 생각과 일치 합니다. 그러나 레이어 이름 만 검색하고 싶습니다. 이것은 요청에 필터를 통합해야 함을 의미합니다. 그러나 여전히 WFS GetCapabilties레이어 이름 만 반환 하는 요청에 필터를 추가하는 방법에 대해서는 전혀 모릅니다 . 위의 내 업데이트를 참조하십시오. 어떤 포인터?
okello
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.