วิธีเพิ่มเลเยอร์ 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: workspace name = medford, Namespace 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 เป็นโมฆะในชุดข้อมูลของเราถ้าเราเก็บชื่อเรขาคณิตไว้มากกว่าค่าเริ่มต้น แต่หากไม่มีมันก็จะใช้การฉายแผนที่ (27700- ในกรณีของเรา)

คำตอบ:


24

ลองดูคำตอบของฉันในโพสต์นี้

  1. ตรวจสอบให้แน่ใจว่าค่า featureNS ของคุณอยู่ใน "Edit Workspace Page ภายใต้ Namespace URI" ใน GEOSERVER ของคุณ อย่าใช้สิ่งทั่วไปเหมือน " http://postgis.org " ใช้บางอย่างเช่น " http: // yourdomain / application / catalogLayer " หรือสิ่งที่ไม่เหมือนใคร คุณสามารถทำให้ URI นี้เป็นเพียงทำให้เป็นเอกลักษณ์
  2. คุณมี BBOX () ใหม่เป็นกลยุทธ์ แต่กล่องนั้นมีขนาดเท่าไร ฉันจะเปลี่ยนเป็น [OpenLayers.Strategy.Fixed ()] ใหม่สำหรับการทดสอบ
  3. featureType ไม่ใช่ประเภทของรูปทรงเรขาคณิตจริงๆแล้วมันเป็น "ชื่อเลเยอร์" ของคุณใน GEOSERVER (ฉันรู้ว่าทำให้เข้าใจผิด)
  4. geometryName เป็นชื่อของเขตข้อมูลในฐานข้อมูล postgis ของคุณที่มีประเภทข้อมูลเรขาคณิต ใน GEOSERVER ภายใต้ "แก้ไขเลเยอร์" คุณสามารถดูได้ที่ด้านล่าง "รายละเอียดประเภทสถานที่" คุณจะเห็นฟิลด์ที่มีประเภท "เรขาคณิต" ใช้ค่าภายใต้คอลัมน์คุณสมบัติ

ฉันจะระบุ FeaturePrefix และเวอร์ชัน ลองสิ่งนี้:

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

ขอบคุณ capdragon ฉันทำตามขั้นตอนทั้งหมดแล้ว แต่ยังไม่มีความสุข ... พื้นที่ทำงานของฉันตอนนี้เรียกว่า rpid และฉันได้เพิ่ม featurePrefix ฉันได้ลอง FeatureType ทั้งที่มีและไม่มีพื้นที่ทำงานต่อท้าย ฉันได้ลองใช้ namespaces ต่างๆรวมถึง: " rpid.opengeo.com ", " localhost: 8081 / rpid " ฉันยังคงสับสนเกี่ยวกับคุณสมบัตินี้ ฉันได้ใส่ชื่อเส้นโครงและเรขาคณิต (GEOM) หน้า map.html ของฉันอยู่ที่นี่: ไฟล์: /// C: /Aptana/Workspace/GIS/map.html สิ่งนี้จะจับฉันด้วยนโยบายแหล่งกำเนิดเดียวกันด้านล่างหรือไม่ Net tabe ของฉันใน Firebug แสดง 'OPTIONS wfs' โดยไม่มีการตอบสนอง
geo_james

2
เนมสเปซของฟีเจอร์ NS สามารถเป็นอะไรก็ได้ที่คุณชอบดังนั้นทั้งคู่จะใช้งานได้ สิ่งสำคัญคือคุณมีมันเหมือนกันทุกประการใน geoserver ของคุณ มิฉะนั้นสิ่งอื่น ๆ จะไม่ได้รับการทำให้เป็นอนุกรมและคุณจะไม่ได้รับการตอบกลับจากบริการบนเว็บ เพื่อไปเข้า geoserver คลิกของคุณworkspace(นี้จะนำคุณไปยังหน้าEdit Workspace. the Nameคือสิ่งที่ใส่เป็นfeaturePrefix. และNamespace URIเป็นสิ่งที่คุณใส่เป็นfeatureNS. ยังไม่แน่ใจว่าfile:///c:สถานที่จะทำให้คุณต้องใช้พร็อกซี. แต่ฉันจะทำให้ ไฟล์สดที่http://localhostเพื่อทดสอบและตรวจสอบให้แน่ใจ
CaptDragon

ตกลงตอนนี้ฉันย้ายรหัสของฉันไปที่ localhost: 8081 / apps / index.html และเปลี่ยนฟีเจอร์ของฉัน ตอนนี้ฉันสามารถเห็นคุณสมบัติ 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
จุดกำเนิดเดียวกันคือปัญหาของเบราว์เซอร์ WFS ทำงานตรงตามที่ออกแบบไว้
Ian Turton

ใช่และไม่ใช่: WFS เป็น XML ดังนั้นจึงจำเป็นต้องใช้ตัวแยกวิเคราะห์ XML ในทุกแพลตฟอร์มยกเว้น Firefox (และ 'เดสก์ท็อป') และมันก็ไม่เข้ากันกับวิธีเดียวที่เราต้องทำการสื่อสารข้ามโดเมน: JSONP ในทางกลับกัน GeoJSON ถูกแยกวิเคราะห์ในเบราว์เซอร์เกือบทุกตัวและสามารถห่อหุ้มได้ง่ายและโดยทั่วไปจะเข้ากันได้ข้ามโดเมน เห็นได้ชัดว่าไม่ใช่แอปเปิ้ลต่อส้มและนั่นไม่ใช่ขอบเขตของการวิจารณ์ WFS ของฉัน (บวมขยายตัวไม่ดี ฯลฯ )
tmcw

คุณสมมติว่าเบราว์เซอร์สร้างไคลเอนต์ WFS ที่ดี คุณแทบจะไม่เคยต้องการดึงข้อมูลทางภูมิศาสตร์จำนวนมากไปยังเว็บเบราว์เซอร์เป็นพาหะ
Ian Turton

สวัสดี tmcw ไม่มีหน้าทดสอบของฉันเป็นเพียงไฟล์ในตัวเครื่อง C ของฉัน ฉันควรตั้งค่า Namespace URI ของฉันเป็นอย่างไรถ้าฉันต้องการทำงานกับ GeoServer ท้องถิ่นบนพอร์ต 8081
geo_james

2

ปัญหาของคุณคือคุณมีคำนำหน้าชื่อคุณสมบัติและเนมสเปซซึ่งทำให้ GeoServer (และ / หรือ OpenLayers) สับสน

ลอง:

 featureType : "parks",

ฉันมีตัวอย่าง WFS บางอย่างที่http://ian01.geog.psu.edu/geoserver/www/wfs/index.htmlพร้อมรหัสแหล่งที่มาที่มีความคิดเห็นซึ่งคุณสามารถศึกษาได้


ขอบคุณ iant ตอนนี้ฉันพยายามโดยไม่ใช้คำนำหน้าและฉันคิดว่ามีปัญหาที่กว้างขึ้น
geo_james

ลิงก์ไม่ทำงาน iant
Sam007

0

เพียงแก้ไขประเภทของคุณจาก "medford: สวนสาธารณะ" เป็น "สวนสาธารณะ"

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 ...... "

จากนั้นเลเยอร์เวกเตอร์จะแสดงผลได้อย่างสมบูรณ์แบบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.