Bagaimana memilih bidang yang dikembalikan oleh permintaan GeoServer WMS GetFeatureInfo?

9

Saya menjalankan layanan pemetaan lokal sederhana berdasarkan tumpukan PostGIS / GeoServer / OpenLayers.

Mengikuti tutorial pembuka Saya telah mengaitkan acara klik di OpenLayers ke panggilan WMS GetFeatureInfo menggunakan:

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

Saya telah menggunakan template FreeMarker GeoServer untuk memformat respons dengan benar. Masalah yang saya miliki adalah bahwa respons yang saya dapatkan mengembalikan semua bidang dari layer.

Apakah ada cara untuk memilih yang relevan bagi pengguna?

Radek
sumber

Jawaban:

7

Tidak terlihat bagus ( sumber ):

... GetFeatureInfo [...] adalah permintaan WMS dan WFS. [...] Satu perbedaan dalam perilaku mereka adalah Geoserver mengirimkan selalu semua atribut dengan GetFeatureInfo tetapi dengan WFS daftar atribut dapat diberikan dalam permintaan.

Anda bisa membuat tampilan yang hanya berisi atribut yang ingin / harus dilihat dan dilayani oleh pengguna melalui Geoserver.

Alternatifnya adalah menyesuaikan template GetFeatureInfo .

underdark
sumber
2
menampilkan atau tidak menampilkan adalah satu hal tetapi radek ingin mengembalikan hanya beberapa nilai bidang. Itu membuat perbedaan besar mengenai data yang ditransfer dan aspek keamanan.
simo
2
Itu sebabnya saran pertama saya adalah membuat tampilan.
underdark
Lebih lanjut tentang menggunakan LIHAT di sini .
radek
7

Hanya saja, jangan memasukkan bidang yang tidak Anda inginkan dalam templat freemarker Anda. Lihat http://docs.geoserver.org/trunk/en/user/tutorials/GetFeatureInfo/index.html#custom-templates

Ian Turton
sumber
Tautan yang baik, ada beberapa dokumentasi yang sangat bagus di situs Geoserver - Contoh ini menurut saya berguna (dengan sedikit mengotak-atik tentunya) untuk mengembalikan hanya bidang yang saya inginkan.
Ando
5

Anda dapat melakukan ini menggunakan parameter permintaan WMS GeoServer propertyName:

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

dr_jts
sumber
Bagi saya ini adalah solusi terbaik! 1. Sangat sederhana! 2. Saya bahkan memiliki kemungkinan dari aplikasi lain untuk membuat fitur penuh Info. Dengan templat itu tidak mungkin lagi! 3. Dan last but not least lalu lintas jaringan jauh lebih kecil daripada meminta fitur lengkap! Tank-kamu!
Marcel
0

Anda dapat menambahkan pernyataan kondisional ke templat freemarker.

Misalnya dalam file content.ftl Anda, Anda dapat menambahkan sesuatu seperti ini hanya pada daftar "YOUR_FIELDNAME".

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

Atau Anda dapat mengecualikan bidang dengan melakukan ini:

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

Bagaimana dengan ini?

Juga, agar ini mengembalikan atribut (dan bukan hanya nama layer dan fitur id) Anda harus menambahkan "ows_include_items" "atribut1, attribute2, ..., attributeN" atau "ows_include_items" "all" ke bagian metadata dari WMS Anda entri file peta layer.

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

simo
sumber
Tapi Radek menggunakan Geoserver, bukan UMN Mapserver, jadi tidak ada file peta.
underdark
1
Saya sudah melihatnya. Saya tidak pernah menggunakan geoserver tapi saya kira ada satu cara untuk mengatur metadata juga, bukan?
simo