Làm cách nào để thêm một lớp WFS đơn giản từ GeoServer vào bản đồ OpenLayers?


19

Tôi đang cố gắng thêm một trong các bộ dữ liệu được bao gồm với GeoServer vào bản đồ OpenLayers. Tôi đã theo dõi các hướng dẫn OpenGeo, thấy chủ đề tương tự ở đây, nhưng tôi dường như không thể bẻ khóa được. Ai đó có thể lướt qua mã của tôi và thiết lập GeoServer và cho tôi biết tôi đang sai ở đâu không?

Đây là mã của tôi:

//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();

Chi tiết GeoServer: tên không gian làm việc = medford, Namespace URI = http://medford.opengeo.org Đối với loại tính năng tôi đã thử "park" và "medford: park"

Lớp được kích hoạt, quảng cáo và có giới hạn trả lại 30 tính năng.

Tôi đang vật lộn để đặt một bản đồ đơn giản lại với nhau.

Giải pháp cập nhật. Đang làm việc.

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

Không cần chỉ định Tên hình học trong định nghĩa Lớp. Vì SRS bản địa là null trong tập dữ liệu của chúng tôi, nếu chúng tôi giữ hình họcName hơn mặc định, nhưng không có nó, nó sử dụng phép chiếu bản đồ (trong trường hợp của chúng tôi là 27700-).

Câu trả lời:


24

Hãy xem câu trả lời của tôi về bài viết này .

  1. Đảm bảo giá trị FeatureNS của bạn nằm trong "Chỉnh sửa trang không gian làm việc trong URI không gian tên" trong GEOSERVER của bạn. Không sử dụng một cái gì đó chung chung như " http://postgis.org ". Sử dụng một cái gì đó như " http: // yourdomain / application / catalogLayer " hoặc một cái gì đó độc đáo như thế. Bạn có thể làm cho URI này lên, chỉ cần làm cho nó độc đáo.
  2. Bạn có BBOX () mới làm chiến lược nhưng hộp đó có kích thước như thế nào? Tôi sẽ thay đổi nó thành [OpenLayers.Strargety.Fixed ()] mới để thử nghiệm.
  3. FeatureType không thực sự là loại hình học, đó là "Tên lớp" của bạn trong GEOSERVER (tôi biết, gây hiểu nhầm).
  4. hình học là tên của trường trong cơ sở dữ liệu postgis của bạn có kiểu dữ liệu Hình học. Trong GEOSERVER, trong "Chỉnh sửa lớp", bạn có thể thấy ở phía dưới "Chi tiết loại tính năng". Ở đó bạn sẽ thấy một trường có loại "Hình học". Sử dụng giá trị dưới cột thuộc tính

Tôi sẽ chỉ định FeaturePrefix và phiên bản. Hãy thử một cái gì đó như thế này:

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

Cảm ơn capdragon. Tôi đã thực hiện tất cả các bước nhưng vẫn không có niềm vui ... không gian làm việc của tôi bây giờ được gọi là rpid và tôi đã thêm một tính năngPrefix. Tôi đã thử FeatureType có và không nối thêm không gian làm việc. Tôi đã thử nhiều không gian tên khác nhau, bao gồm: " rpid.opengeo.com ", " localhost: 8081 / rpid ". Tôi vẫn còn bối rối về tài sản này. Tôi đã chèn tên hình chiếu và hình học (GEOM). Trang map.html của tôi nằm ở đây: file: /// C: /Aptana/Workspace/GIS/map.html. Điều này sẽ giúp tôi hiểu được với Chính sách xuất xứ tương tự dưới đây? Tab Net của tôi trong Fireorms hiển thị 'TÙY CHỌN wfs' không có phản hồi
Geo_james

2
Không gian tên của FeatureNS có thể là bất cứ thứ gì bạn thích để cả hai đều hoạt động. Điều quan trọng là bạn có nó giống hệt nhau trên máy chủ địa lý của bạn. Hoặc những thứ khác không được tuần tự hóa và bạn không nhận được phản hồi từ dịch vụ web. Vì vậy, hãy truy cập vào máy chủ địa lý, nhấp vào workspace(trang này sẽ đưa bạn đến trang Edit Workspace. NameĐây là những gì bạn đặt featurePrefix. Và đó Namespace URIlà những gì bạn đặt featureNS. Ngoài ra, không chắc file:///c:vị trí sẽ yêu cầu bạn sử dụng proxy. Nhưng tôi sẽ làm tệp trực tiếp http://localhostđể kiểm tra và đảm bảo.
CaptDragon

OK Bây giờ tôi đã chuyển mã của mình sang localhost: 8081 / apps / index.html và thay đổi tính năngNS của tôi. Bây giờ tôi có thể thấy 30 tính năng quay trở lại khi có phản hồi ... </ rpid: GROSS_AREA>. Phát triển! Tuy nhiên tôi không thấy bất kỳ tính năng nào trên bản đồ của mình. Khi thêm vào như WMS tôi có thể thấy chúng tốt. Lớp duy nhất khác là WMS cơ sở. Bảng điều khiển của tôi cũng bị lỗi với các lỗi như: OpenLayers.Marker không được xác định và Ext.preg không phải là một chức năng. Tôi đang nhập tất cả các thư viện của mình tại địa phương ...
Geo_james

Khi bạn nói có 30 tính năng trong phản hồi. Chúng ở định dạng xml được gói trong một <wfs:FeatureCollection numberOfFeatures="30"... phần tử cha phải không?
CaptDragon

Tôi có thể nói tạo một trang thử nghiệm rất đơn giản mới và thêm lớp WFS đó. Dường như với tôi rằng những lỗi đó đang đến từ các phần khác trong mã của bạn vì OpenLayers.Marker không liên quan đến WFS. Có thể tôi sai, nhưng việc tạo một trang thử nghiệm đơn giản luôn giúp xác định xem nó có hoạt động hay không. Dù sao đó cũng là những gì tôi làm.
CaptDragon

3

Điều đầu tiên cần kiểm tra: máy chủ / trang web thử nghiệm của bạn trên 'medford.opengeo.org'? Nếu không, bạn sẽ không thể truy cập WFS vì Chính sách xuất xứ tương tự . Về mặt kỹ thuật, bạn có thể sử dụng proxy để sửa lỗi này. (mặc dù theo tôi đây chỉ là một trường hợp WFS là một giao thức được thiết kế kém)


1
Cùng Origin là một vấn đề về trình duyệt, WFS hoạt động chính xác như thiết kế.
Ian Turton

Có và không: WFS là XML, do đó, nó cần một trình phân tích cú pháp XML trên mọi nền tảng trừ Firefox (và 'máy tính để bàn') và nó cũng không kết hợp tốt với cách duy nhất chúng ta phải thực hiện giao tiếp giữa các miền: JSONP. Mặt khác, GeoJSON được phân tích cú pháp trong hầu hết mọi trình duyệt và dễ dàng và thường được bao bọc để tương thích giữa các miền. Rõ ràng không phải là táo với cam, và đó không phải là phạm vi phê bình WFS của tôi (cồng kềnh, mở rộng kém, v.v.).
tmcw

Bạn đang giả định rằng các trình duyệt tạo ra các máy khách WFS tốt. Bạn hầu như không muốn kéo một lượng lớn dữ liệu địa lý vào trình duyệt web dưới dạng vectơ.
Ian Turton

Chào tmcw. Không có trang thử nghiệm của tôi chỉ là một tệp cục bộ trên ổ C của tôi. Tôi nên đặt URI không gian tên của mình thành gì nếu tôi muốn làm việc với GeoServer cục bộ trên cổng 8081?
Geo_james

2

Vấn đề của bạn là bạn có tiền tố trên tên tính năng và không gian tên, điều này gây nhầm lẫn cho GeoServer (và / hoặc OpenLayers).

Thử:

 featureType : "parks",

Tôi có một số ví dụ về WFS tại http://ian01.geog.psu.edu/geoserver/www/wfs/index.html với mã nguồn nhận xét mà bạn có thể nghiên cứu.


Cảm ơn tôi Bây giờ tôi đã thử mà không có tiền tố và tôi nghĩ có một vấn đề rộng hơn
Geo_james

liên kết không hoạt động iant
Sam007

0

chỉ cần sửa lại featuretype của bạn từ "medford: park" thành "park"

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"

                })
            });

Xem jsfiddle làm ví dụ: http://jsfiddle.net/expedio/ucrtthya/


-1

Mã của bạn là ok. Bạn chỉ cần thay đổi địa chỉ trình duyệt của trang của bạn. Trỏ trang trình duyệt của bạn thông qua "localhost: 8080 / geoserver / www / your_file_name.html" thay vì "tệp: \ c ......"

Sau đó, lớp vector sẽ kết xuất hoàn hảo.

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.