วิธีรับชื่อเลเยอร์ทั้งหมดในร้านค้าใน GeoServer โดยใช้ OpenLayers


9

ฉันมีข้อกำหนดที่เข้มงวดเพื่อเรียกชื่อเลเยอร์ทั้งหมดในที่จัดเก็บ GeoServer โดยใช้ OpenLayers ฉันได้อ่านบทความนี้แล้ว แต่ไม่ตอบคำถามของฉัน ฉันได้ผ่าน REST API ของ GeoServer ซึ่งจะเหมาะถ้าฉันใช้ภาษาอื่นเช่น C #, Java หรือ PHP แต่ฉันต้องการทำสิ่งนี้ทั้งหมดใน JavaScript

UPDATE: จากสิ่งที่ฉันเห็นในWFS GetCapabilitiesเอกสารฉันสามารถดึงชื่อของเลเยอร์ทั้งหมดได้โดยส่งคำร้องขอ WFS GetCapabilities โดยใช้ตัวกรอง แต่ฉันไม่แน่ใจว่าเป็นไปได้หรือไม่ที่จะรวมตัวกรองไว้ในGetCapabilitiesคำขอ ฉันไม่มีความคิดใด ๆ ว่าตัวกรองดังกล่าวจะมีลักษณะอย่างไร

คำแนะนำใด ๆ เกี่ยวกับวิธีที่ฉันสามารถไปเกี่ยวกับการบรรลุเป้าหมายนี้จะได้รับการชื่นชม แนวทางอื่นใดก็จะได้รับการชื่นชม

UPDATE:

ฉันเชื่อว่าฉันพบวิธีแก้ปัญหาที่นี่ ; "คำขอ WC GetCapabilities สามารถกรองเพื่อส่งคืนเลเยอร์ที่สอดคล้องกับเนมสเปซเฉพาะโดยทำตามนี้เพิ่มรหัสต่อไปนี้ในคำขอของคุณ: namespace = <namespace>" ฉันหวังว่านี่จะช่วยคนอื่นได้


คำถามเพิ่มเติม วิธีที่คุณพูดถึงจะส่งคืน xml ของเลเยอร์ที่เผยแพร่แล้วและข้อมูลที่เผยแพร่อื่น ๆ เท่านั้น มีวิธีใดในการส่งคืนข้อมูล xml ของเลเยอร์ที่ไม่ได้เผยแพร่ / รอดำเนินการ? ฉันได้ลอง wms / wfs / wcs / REST และแม้แต่แพ็คเกจ python gsconfig และไม่มีใครทำเช่นนี้
swap0

คำตอบ:


18

ฉันสังเกตเห็นว่าคุณได้พบวิธีแก้ปัญหาที่เหมาะกับคุณแล้ว แต่ฉันคิดว่าฉันอาจเพิ่มตัวเลือกเพิ่มเติมที่คุณหรือคนอื่น ๆ อาจพบว่ามีประโยชน์

ใน GeoServer มีความสามารถที่เรียกว่าบริการ OWS เสมือน บริการ WMS, WFS และ WCS เป็นที่รู้จักกันโดยรวมว่าเป็นบริการ OWS เมื่อคุณทำการร้องขอไปยังหนึ่งในบริการเหล่านี้คุณกำลังร้องขอทั่วโลกดังนั้นเลเยอร์ที่ลงทะเบียนทั้งหมดจะถูกส่งคืนในเอกสารความสามารถ (ยกเว้นว่าคุณมีการตั้งค่าความปลอดภัยของข้อมูล) ในทางตรงกันข้ามบริการเสมือนเป็นมุมมองที่ถูกกรองของบริการทั่วโลก การกรองเสร็จสิ้นในพื้นที่ทำงานและเข้าถึงได้ผ่าน URL ที่แตกต่างกันเล็กน้อย

ลองยกตัวอย่าง สมมติว่าคุณมีพื้นที่ทำงานที่เรียกว่าmywsและเป็นพื้นที่ทำงานที่คุณต้องการแสดงรายการเลเยอร์ ในกรณีนั้นคุณสามารถขอ URL:

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

เอกสารความสามารถที่ส่งคืนจะแสดงรายการเลเยอร์ที่ลงทะเบียนกับเวิร์กสเปซmywsเท่านั้น

นั่นเป็นวิธีการหนึ่ง แต่เดิมคุณได้ถามเกี่ยวกับการเข้าถึงรายการเลเยอร์ผ่าน JavaScript มีความสุขที่มีวิธีการทำเช่นนี้โดยใช้ GeoServer REST API คุณสามารถรับรายการประเภทคุณลักษณะสำหรับพื้นที่ทำงานและ datastore ที่กำหนดโดยใช้สิ่งต่อไปนี้

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

สิ่งนี้จะส่งคืนวัตถุ JSON ที่แสดงรายการคุณลักษณะทั้งหมดของคุณในพื้นที่ทำงานนอกจากนี้คุณยังสามารถแทนที่. json สำหรับ. xml หรือ. html เพื่อรับการตอบสนองในรูปแบบเหล่านั้น ดังนั้นวิธีการทำเช่นนี้ใน OpenLayers? โชคดีที่ OpenLayers จัดเตรียมการห่อหุ้มของวัตถุ XMLHttpRequest ในรูปแบบของOpenLayers.Requestวัตถุ ตัวอย่างง่ายๆที่ใช้ URL REST ด้านบนจะเป็น:

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 เป็นที่นี่

หวังว่าจะให้แนวทางอื่น ๆ แก่คุณในการพิจารณา


ฉันได้ทดสอบข้อเสนอแนะแต่ละข้อใน @ โพสต์นี้แล้ว พวกเขาทำงานอย่างสมบูรณ์ ขอบคุณมาก. สิ่งนี้มีประโยชน์มาก
okello

ไม่มีปัญหายินดีที่ได้ช่วยเหลือ!
CHenderson

ลิงก์บริการ OWS เสมือนนั้นตายแล้วในขณะนี้ สามารถพบได้ที่นี่
wchatx

ใช้งานได้อย่างมีเสน่ห์
AhammadaliPK

คุณช่วยเพิ่มคำตอบสำหรับแผ่นพับด้วยได้ไหม
Tekson

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

ด้วยวิธีนี้ฉันสามารถเพิ่มคำหลัก "กลุ่ม: GEOGRAPHY" ป้อนคำอธิบายรูปภาพที่นี่บนเลเยอร์ Geoserver และฉันไม่จำเป็นต้องเขียนโค้ดแต่ละเลเยอร์และกลุ่มด้วยตนเอง ชื่อใช้ในการสร้างชั้น (อาจจะใช้ L.WMS.source) และชื่อเป็นป้ายของ html


1

ลองดูคำตอบนี้ มันยังให้การสาธิต อย่าลืมว่าเลเยอร์ให้บริการผ่านบริการต่าง ๆ ตามที่กล่าวไว้

ฉันหวังว่ามันจะช่วยคุณ ...


ฉันตรวจสอบแล้ว มันสอดคล้องกับความคิดของฉันที่ฉันสามารถทำได้โดยใช้การWFS GetCapabilitiesร้องขอ แต่ฉันต้องการเรียกชื่อเลเยอร์เท่านั้นไม่มีอะไรอื่นอีกแล้ว ซึ่งหมายความว่าฉันต้องรวมตัวกรองในคำขอของฉัน แต่ฉันยังไม่มีความคิดใด ๆ เกี่ยวกับวิธีที่ฉันสามารถผนวกตัวกรองเข้ากับWFS GetCapabiltiesคำขอที่จะส่งกลับเฉพาะชื่อของเลเยอร์ อ้างถึงการอัปเดตของฉันด้านบน ตัวชี้ใด ๆ
okello
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.