Làm cách nào để chọn các trường được trả về bởi yêu cầu GeoServer WMS GetFeatureInfo?


9

Tôi đang chạy dịch vụ ánh xạ cục bộ đơn giản dựa trên ngăn xếp PostGIS / GeoServer / OpenLayers.

Theo hướng dẫn của opengeo Tôi đã gắn các sự kiện nhấp chuột trong OpenLayers vào cuộc gọi WMS GetFeatureInfo bằng cách sử dụng:

    map.events.register('click', map, function (e) {
        var url = "http://localhost:1979/geoserver/wms" 
          + "?REQUEST=GetFeatureInfo"
          + "&EXCEPTIONS=application/vnd.ogc.se_xml"
          + "&BBOX=" + map.getExtent().toBBOX()
          + "&X=" + e.xy.x
          + "&Y=" + e.xy.y
          + "&INFO_FORMAT=text/html"
          + "&QUERY_LAYERS=MYDATA:MYLAYER"
          + "&LAYERS=MYDATA:MYLAYER"
          + "&FEATURE_COUNT=5"
          + "&SRS=EPSG:3857"
          + "&STYLES="
          + "&WIDTH=" + map.size.w
          + "&HEIGHT=" + map.size.h;
        window.open(url,
          "getfeatureinfo",
          "location=0,status=0,scrollbars=1,width=800,height=125"
        );
      });

Tôi đã sử dụng các mẫu FreeMarker của GeoServer để định dạng phản hồi chính xác. Vấn đề tôi có là phản hồi tôi nhận được trả về tất cả các trường từ lớp.

Có cách nào để chọn những cái có liên quan đến người dùng không?

Câu trả lời:


7

Có vẻ không tốt ( nguồn ):

... GetFeatureInfo [...] là một yêu cầu WMS và WFS. [...] Một điểm khác biệt trong hành vi của họ là Geoserver luôn gửi tất cả các thuộc tính bằng GetFeatureInfo nhưng với WFS, danh sách các thuộc tính có thể được cung cấp trong yêu cầu.

Bạn có thể tạo chế độ xem chỉ chứa các thuộc tính mà người dùng của bạn muốn / nên xem và phục vụ thông qua Geoserver.

Một cách khác là điều chỉnh khuôn mẫu GetFeatureInfo .


2
hiển thị hoặc không hiển thị là một điều nhưng radek muốn chỉ trả về một số giá trị trường. Nó làm cho một sự khác biệt lớn về dữ liệu được chuyển và các khía cạnh bảo mật.
simo

2
Đó là lý do tại sao đề nghị đầu tiên của tôi là tạo ra một cái nhìn.
underdark

Thêm về cách sử dụng XEM tại đây .
radek

7

Chỉ không bao gồm các lĩnh vực bạn không muốn trong mẫu freemarker của bạn. Xem http://docs.geoserver.org/trunk/en/user/tutorials/GetFeatureInfo/index.html#custom-temsheet


Liên kết tốt, có một số tài liệu thực sự tốt trên trang web Geoserver - Ví dụ này tôi thấy hữu ích (dĩ nhiên là có một chút lo lắng) vì chỉ trả lại các lĩnh vực tôi muốn.
Ando


5

Bạn có thể làm điều này bằng cách sử dụng tham số yêu cầu WMS của GeoServer propertyName:

http://docs.geoserver.org/urdy/en/user/service/wms/vendor.html#propertyname


Đối với tôi đây là giải pháp tốt nhất! 1. Rất đơn giản! 2. Tôi thậm chí có khả năng từ các ứng dụng khác để tạo một tính năng đầy đủ. Với các mẫu, nó không còn có thể nữa! 3. Và cuối cùng nhưng không kém phần lưu lượng truy cập mạng nhỏ hơn nhiều sau đó yêu cầu tính năng hoàn chỉnh! Xe tăng-bạn!
marcel

0

Bạn có thể thêm các câu điều kiện vào các mẫu freemarker.

Ví dụ: trong tệp content.ftl của bạn, bạn có thể thêm một cái gì đó như thế này vào danh sách "YOU_FIELDNAME".

<#if attribute.name == "YOUR_FIELDNAME">
     <li>${attribute.name}: ${attribute.value}</li>
</#if>

Ngoài ra, bạn có thể loại trừ một lĩnh vực bằng cách làm điều này:

<#if !attribute.name == "YOUR_FIELDNAME">
     <li>${attribute.name}: ${attribute.value}</li>
</#if>

-2

Cái này thì sao?

Ngoài ra, để điều này trả về các thuộc tính (và không chỉ tên lớp và id tính năng), bạn phải thêm "ows_include_items" "property1, property2, ..., propertyN" hoặc "ows_include_items" "all" vào phần siêu dữ liệu của WMS của bạn mục nhập tệp bản đồ của lớp.

Từ: http://trac.osgeo.org/openlayers/wiki/GetFeatureInfo


Nhưng Radek sử dụng Geoserver chứ không phải UMN Mapserver, vì vậy không có tệp bản đồ.
underdark

1
Tôi đã thấy điều đó. Tôi chưa bao giờ sử dụng máy chủ địa lý nhưng tôi đoán có một cách để thiết lập siêu dữ liệu, phải không?
simo
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.