จะเลือกฟิลด์ที่ส่งคืนโดย GeoServer WMS GetFeatureInfo ได้อย่างไร


9

ฉันใช้บริการการแมปท้องถิ่นที่เรียบง่ายโดยใช้ PostGIS / GeoServer / OpenLayers stack

ต่อไปนี้การสอนแบบ opengeo ฉันได้ผูกเหตุการณ์การคลิกในการเรียกใช้ OpenLayers กับ WMS GetFeatureInfo โดยใช้:

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

ฉันใช้เทมเพลตFreeMarker ของ GeoServer เพื่อจัดรูปแบบการตอบกลับอย่างถูกต้อง ปัญหาที่ฉันมีคือการตอบสนองที่ฉันได้รับจะคืนค่าฟิลด์ทั้งหมดจากเลเยอร์

มีวิธีการเลือกรายการที่เกี่ยวข้องกับผู้ใช้หรือไม่?

คำตอบ:


7

ดูไม่ดี ( แหล่งที่มา ):

... GetFeatureInfo [... ] เป็นคำขอ WMS และ WFS [... ] ความแตกต่างอย่างหนึ่งของพฤติกรรมของพวกเขาคือ Geoserver จะส่งแอททริบิวต์ทั้งหมดที่มี GetFeatureInfo เสมอ แต่ด้วย WFS คุณสามารถกำหนดรายการของแอททริบิวได้ในคำขอ

คุณสามารถสร้างมุมมองที่มีเพียงแอตทริบิวต์ที่ผู้ใช้ของคุณต้องการ / ควรเห็นและให้บริการผ่าน Geoserver

ทางเลือกอื่นคือปรับแม่แบบ GetFeatureInfo ที่ตายแล้ว


2
การแสดงหรือไม่แสดงเป็นสิ่งหนึ่ง แต่ radek ต้องการคืนค่าบางฟิลด์เท่านั้น มันสร้างความแตกต่างอย่างมากเกี่ยวกับการถ่ายโอนข้อมูลและด้านความปลอดภัย
simo

2
นั่นเป็นเหตุผลที่คำแนะนำแรกของฉันคือการสร้างมุมมอง
underdark

เพิ่มเติมเกี่ยวกับการใช้มุมมองที่นี่
radek

7

อย่ารวมฟิลด์ที่คุณไม่ต้องการในเทมเพลต freemarker ของคุณ ดูhttp://docs.geoserver.org/trunk/en/user/tutorials/GetFeatureInfo/index.html#custom-templates


ลิงก์ดีมีเอกสารที่ดีจริง ๆ ในไซต์ Geoserver - ตัวอย่างนี้ฉันพบว่ามีประโยชน์ (มีปัญหานิดหน่อยรอบแน่นอน) สำหรับการส่งคืนเฉพาะเขตข้อมูลที่ฉันต้องการ
Ando


5

คุณสามารถทำได้โดยใช้พารามิเตอร์การร้องขอ GeoServer propertyName WMS:

http://docs.geoserver.org/stable/en/user/services/wms/vendor.html#propertyname


สำหรับฉันนี่คือทางออกที่ดีที่สุด! 1. ง่ายมาก! 2. ฉันยังมีความเป็นไปได้จากแอพพลิเคชั่นอื่น ๆ ด้วยเทมเพลตจึงไม่สามารถทำได้อีกต่อไป! 3. และสุดท้าย แต่ไม่ท้ายสุดปริมาณการรับส่งข้อมูลของเครือข่ายนั้นเล็กกว่ามากแล้วขอคุณสมบัติที่สมบูรณ์! ขอบคุณ!
marcel

0

คุณสามารถเพิ่มข้อความสั่งแบบมีเงื่อนไขให้กับแม่แบบ freemarker ได้

ตัวอย่างเช่นในไฟล์ content.ftl ของคุณคุณสามารถเพิ่มสิ่งนี้ในรายการ "YOUR_FIELDNAME" เท่านั้น

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

หรือมิฉะนั้นคุณสามารถยกเว้นฟิลด์โดยทำสิ่งนี้:

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

-2

แล้วเรื่องนี้ล่ะ

นอกจากนี้เพื่อให้ส่งคืนแอตทริบิวต์ (และไม่ใช่แค่ชื่อเลเยอร์และรหัสคุณลักษณะ) คุณต้องเพิ่ม "ows_include_items" "attribute1, attribute2, ... , attributeN" หรือ "ows_include_items" "all" ลงในส่วนข้อมูลเมตาของ WMS ของคุณ รายการไฟล์แผนที่ของ layer

จาก: http://trac.osgeo.org/openlayers/wiki/GetFeatureInfo


แต่ Radek ใช้ Geoserver ไม่ใช่ UMN Mapserver ดังนั้นจึงไม่มีไฟล์แผนที่
underdark

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