Cách nhận tên của tất cả các lớp trong một cửa hàng trong GeoServer bằng OpenLayers


9

Tôi có yêu cầu nghiêm ngặt để truy xuất tên của tất cả các lớp trong cửa hàng GeoServer bằng OpenLayers. Tôi đã đi qua bài viết ở đây , nhưng nó không trả lời câu hỏi của tôi. Tôi cũng đã trải qua API REST của GeoServer, sẽ rất lý tưởng nếu tôi sử dụng ngôn ngữ khác, nói C #, Java hoặc PHP. Nhưng tôi muốn làm điều này hoàn toàn bằng JavaScript.

CẬP NHẬT: Từ những gì tôi có thể thấy trong WFS GetCapabilitiestài liệu, tôi có thể truy xuất tên của tất cả các lớp bằng cách gửi yêu cầu WFS GetCapabilities bằng các bộ lọc. Nhưng tôi không chắc có thể kết hợp các bộ lọc trong một GetCapabilitiesyêu cầu hay không. Tôi cũng không biết bộ lọc như vậy sẽ như thế nào.

Bất kỳ lời khuyên nào về cách tôi có thể đạt được điều này sẽ được đánh giá cao. Bất kỳ phương pháp thay thế cũng sẽ được đánh giá cao.

CẬP NHẬT:

Tôi tin rằng tôi đã tìm thấy một giải pháp ở đây ; "Các yêu cầu GetCapabilities của WFS có thể được lọc để chỉ trả về các lớp tương ứng với một không gian tên cụ thể. Để thực hiện việc này, hãy thêm đoạn mã sau vào yêu cầu của bạn: namepace = <namespace>". Tôi hy vọng điều này sẽ giúp người khác.


Một câu hỏi mở rộng. Phương thức bạn đề cập chỉ trả về xml của các lớp đã xuất bản và thông tin được xuất bản khác. Có cách nào để trả về thông tin xml của các lớp chưa được công bố / đang chờ xử lý không? Tôi đã thử wms / wfs / wcs / REST và thậm chí cả gói python gsconfig và không ai trong số họ sẽ làm điều này.
hoán đổi

Câu trả lời:


18

Tôi nhận thấy bạn đã tìm thấy một giải pháp phù hợp với bạn, nhưng tôi nghĩ rằng tôi có thể thêm một số tùy chọn bổ sung mà bạn hoặc những người khác có thể thấy hữu ích.

Trong GeoServer có một khả năng được gọi là Dịch vụ OWS ảo . Các dịch vụ WMS, WFS và WCS được gọi chung là các dịch vụ OWS. Khi bạn thực hiện một yêu cầu đối với một trong những dịch vụ này, bạn đang thực hiện một yêu cầu toàn cầu, vì vậy tất cả các lớp đã đăng ký sẽ được trả về trong tài liệu khả năng (trừ khi bạn có cài đặt bảo mật dữ liệu). Ngược lại, một dịch vụ ảo là một cái nhìn được lọc của dịch vụ toàn cầu. Việc lọc được thực hiện trên các không gian làm việc và được truy cập thông qua một url hơi khác.

Hãy lấy một ví dụ. Giả sử bạn có một không gian làm việc được gọi là myws và đó là không gian làm việc mà bạn muốn liệt kê các lớp. Trong trường hợp đó, bạn có thể yêu cầu url:

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

Tài liệu về các khả năng được trả về sẽ chỉ liệt kê các lớp được đăng ký theo không gian làm việc của myws .

Đó là một cách tiếp cận, tuy nhiên ban đầu bạn đã hỏi về việc truy cập danh sách lớp thông qua JavaScript. Hạnh phúc là có một cách để làm điều này bằng API REST của GeoServer. Bạn có thể nhận được một danh sách các featuretypes cho một không gian làm việc và kho dữ liệu nhất định bằng cách sử dụng một cái gì đó như:

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

Điều này sẽ trả về cho bạn một đối tượng JSON liệt kê tất cả các featuretypes trong không gian làm việc, bạn cũng có thể thay thế .json cho .xml hoặc .html để nhận phản hồi theo các định dạng đó. Vậy, làm thế nào để làm điều này trong OpenLayers? May mắn thay, OpenLayers cung cấp một gói gọn của đối tượng XMLHttpRequest ở dạng OpenLayers.Requestđối tượng. Một ví dụ đơn giản sử dụng url REST ở trên sẽ là:

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

Có một tài liệu tốt về yêu cầu dữ liệu từ xa với OpenLayers tại đây .

Hy vọng rằng cung cấp cho bạn một số phương pháp khác để xem xét.


Tôi đã kiểm tra từng đề xuất trong bài đăng này, @CHenderson. Họ làm việc hoàn hảo. Cảm ơn rất nhiều. Điều này là vô cùng hữu ích.
okello

Không có vấn đề, đó là một niềm vui để có thể giúp đỡ!
Người dẫn chương trình

Liên kết dịch vụ OWS ảo đó đã chết. Có thể tìm thấy ở đây
wchatx

hoạt động như một bùa mê
AhammadaliPK

Bạn có vui lòng thêm câu trả lời cho tờ rơi không?
Tekson

2

Câu trả lời này có thể giúp được ai đó. Tôi muốn tự động xây dựng một danh sách các lớp của mình bằng Javascript và Tờ rơi. Sử dụng câu trả lời của CHenderson, tôi đã tạo ra đoạn mã sau:



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

Bằng cách này, tôi có thể thêm từ khóa "nhóm: GEOGRAPHY" nhập mô tả hình ảnh ở đâytrên lớp Geoserver và tôi không phải mã hóa thủ công từng lớp và nhóm của nó. Các tên được sử dụng để tạo ra các lớp (có thể sử dụng L.WMS.source) và danh hiệu là nhãn html.


1

Hãy thử kiểm tra câu trả lời này . nó cũng đưa ra một bản demo. Đừng quên rằng các lớp phục vụ thông qua các dịch vụ khác nhau như đã đề cập ở đó.

Tôi hy vọng nó sẽ giúp bạn...


Tôi đã kiểm tra nó. Điều đó phù hợp với suy nghĩ của tôi rằng tôi có thể đạt được điều này bằng cách sử dụng WFS GetCapabilitiesyêu cầu. Nhưng tôi chỉ muốn lấy tên của các lớp, không có gì khác. Điều này có nghĩa là tôi phải kết hợp các bộ lọc trong yêu cầu của tôi. Nhưng tôi vẫn không có ý tưởng nào về cách tôi có thể nối các bộ lọc vào một WFS GetCapabiltiesyêu cầu chỉ trả lại tên của các lớp. Tham khảo cập nhật của tôi ở trên. Bất kỳ con trỏ?
okello
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.