Wie wähle ich Felder aus, die von der GeoServer WMS GetFeatureInfo-Anforderung zurückgegeben werden?

9

Ich verwende einen einfachen lokalen Zuordnungsdienst basierend auf dem PostGIS / GeoServer / OpenLayers-Stack.

Nach dem Opengeo- Tutorial habe ich Klickereignisse in OpenLayers mit dem WMS GetFeatureInfo-Aufruf verknüpft.

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

Ich habe die FreeMarker- Vorlagen von GeoServer verwendet, um die Antwort korrekt zu formatieren. Das Problem, das ich habe, ist, dass die Antwort, die ich erhalte, alle Felder von der Ebene zurückgibt.

Gibt es eine Möglichkeit, diejenigen auszuwählen, die für den Benutzer relevant sind?

Radek
quelle

Antworten:

7

Sieht nicht gut aus ( Quelle ):

... GetFeatureInfo [...] ist eine WMS-Anfrage und WFS. [...] Ein Unterschied in ihrem Verhalten besteht darin, dass Geoserver immer alle Attribute mit GetFeatureInfo sendet, aber mit WFS kann die Liste der Attribute in der Anforderung angegeben werden.

Sie können eine Ansicht erstellen, die nur die Attribute enthält, die Ihr Benutzer sehen möchte / sollte, und diese über Geoserver bereitstellen.

Eine Alternative wäre, die GetFeatureInfo-Vorlage anzupassen .

Unterdunkel
quelle
2
Anzeigen oder Nicht-Anzeigen ist eine Sache, aber Radek möchte nur einige Feldwerte zurückgeben. Dies macht einen großen Unterschied in Bezug auf übertragene Daten und Sicherheitsaspekte.
Simo
2
Deshalb war mein erster Vorschlag, eine Ansicht zu erstellen.
Underdark
Mehr zur Verwendung von VIEWs hier .
Radek
7

Fügen Sie einfach nicht die Felder ein, die Sie nicht in Ihre Freemarker-Vorlage aufnehmen möchten. Siehe http://docs.geoserver.org/trunk/en/user/tutorials/GetFeatureInfo/index.html#custom-templates

Ian Turton
quelle
Guter Link, es gibt einige wirklich gute Dokumentationen auf der Geoserver-Site - Dieses Beispiel fand ich nützlich (natürlich mit ein wenig Herumspielen), um nur die Felder zurückzugeben, die ich wollte.
Ando
5

Sie können dies mit dem Anforderungsparameter GeoServer propertyName WMS tun:

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

dr_jts
quelle
Für mich ist das die beste Lösung! 1. Sehr einfach! 2. Ich habe sogar die Möglichkeit von anderen Anwendungen, eine vollständige featureInfo zu erstellen. Mit den Vorlagen ist das nicht mehr möglich! 3. Und zu guter Letzt ist der Netzwerkverkehr viel kleiner als die Anforderung einer vollständigen Funktion! Tank-du!
Marcel
0

Sie können Freemarker-Vorlagen bedingte Anweisungen hinzufügen.

Zum Beispiel können Sie in Ihrer content.ftl-Datei so etwas hinzufügen, um nur "YOUR_FIELDNAME" aufzulisten.

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

Alternativ können Sie ein Feld folgendermaßen ausschließen:

<#if !attribute.name == "YOUR_FIELDNAME">
     <li>${attribute.name}: ${attribute.value}</li>
</#if>
Owen J Lamb
quelle
-2

Was ist damit?

Damit Attribute (und nicht nur der Layername und die Feature-ID) zurückgegeben werden, müssen Sie dem Metadatenabschnitt Ihres WMS "ows_include_items", "attribute1, attribute2, ..., attributeN" oder "ows_include_items" "all" hinzufügen Karteneintrag der Ebene.

Von: http://trac.osgeo.org/openlayers/wiki/GetFeatureInfo

simo
quelle
Radek verwendet jedoch Geoserver und nicht UMN Mapserver, sodass keine Kartendatei vorhanden ist.
Underdark
1
Ich habe das gesehen. Ich habe noch nie einen Geoserver verwendet, aber ich denke, es gibt auch eine Möglichkeit, Metadaten festzulegen, oder?
Simo