GetFeatureinfo: query su WMS

Alcuni server WMS supportano le query tramite la richieste di tipo GetFeatureinfo.

La query viene eseguita rispetto al punto (X, Y), che sono le coordinate in pixel della mappa nelle dimensioni e bounding box specificate. La query viene fatta nel dintorno del punto, con la tolleranza indicata nel mapfile.

Il risultato può essere composto in formato testo, http oppure GML. Noi proveremo con quest'ultimo.

Con MapServer è necessario configurare alcuni parametri nel mapfile. Nel nostro caso aggiungiamo la complicazione dovuta al fatto che il layer è in un sistema di riferimento (EPSG:3003) diverso da quello che useremo nella query (EPSG:4326).

LAYER
  NAME "entita_lineari"
  DATA "275040el"
  STATUS ON
  TYPE LINE
  TEMPLATE "void"
  TOLERANCEUNITS pixels
  TOLERANCE 10
  DUMP TRUE
  PROJECTION
    "+init=epsg:3003 +towgs84=-104.1,-49.1,-9.9,0.971,-2.917,0.714,-11.68"
  END
  METADATA
    "wms_title"         "Entità lineari"
    "wms_srs"           "EPSG:4326"
    "gml_include_items" "all"
    #"wms_include_items" "all"
  END
END

Se il client effettua richieste in formato text/plain (non GML), pare che per ottenere risposta sia necessario il parametro wms_include_items.

La richiesta WMS assume la seguente forma:

http://localhost/cgi-bin/mapserv?map=/var/www/wms_query.map&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetFeatureinfo&SRS=EPSG:4326&BBOX=11.16398206,43.74906364,11.33432601,43.79898334&LAYERS=entita_lineari&QUERY_LAYERS=entita_lineari&FEATURE_COUNT=100&X=150&Y=100&WIDTH=1024&HEIGHT=480&INFO_FORMAT=gml

Questi i parametri utilizzati:

SERVICE=WMS
VERSION=1.1.1
REQUEST=GetFeatureinfo
SRS=EPSG:4326
BBOX=11.16398206,43.74906364,11.33432601,43.79898334
LAYERS=entita_lineari
QUERY_LAYERS=entita_lineari
FEATURE_COUNT=100
X=150
Y=100
WIDTH=1024
HEIGHT=480
INFO_FORMAT=gml

Attenzione: il numero di feature (oggetti) ritornati dipende dalla dimensione del dintorno del punto (la TOLERANCE del mapfile) e dal parametro FEATURE_COUNT (numero massimo di feature ritornati) della query.

Il risultato è qualcosa del tipo:

<?xml version="1.0" encoding="UTF-8"?>
<msGMLOutput
    xmlns:gml="http://www.opengis.net/gml"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <entita_lineari_layer>
        <entita_lineari_feature>
            <gml:boundedBy>
                <gml:Box srsName="EPSG:4326">
                    <gml:coordinates>11.173595,43.788665 11.197719,43.790197</gml:coordinates>
                </gml:Box>
            </gml:boundedBy>
            <FOGLIO>275030</FOGLIO>
            <CODICE>0301</CODICE>
            <RECORD>150872</RECORD>
            <IDENTIF></IDENTIF>
        </entita_lineari_feature>
        <entita_lineari_feature>
            <gml:boundedBy>
                <gml:Box srsName="EPSG:4326">
                    <gml:coordinates>11.180460,43.788754 11.189372,43.789513</gml:coordinates>
                </gml:Box>
            </gml:boundedBy>
            <FOGLIO>275030</FOGLIO>
            <CODICE>0102</CODICE>
            <RECORD>151559</RECORD>
            <IDENTIF></IDENTIF>
        </entita_lineari_feature>
    </entita_lineari_layer>
</msGMLOutput>

Query su raster

In modo analogo si possono effettuare query su layer raster, questo un esempio di risultato:

<?xml version="1.0" encoding="ISO-8859-1"?>
<msGMLOutput
    xmlns:gml="http://www.opengis.net/gml"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ctr25k_layer>
        <ctr25k_feature>
            <gml:boundedBy>
                <gml:Box srsName="EPSG:3003">
                    <gml:coordinates>1681609.346909,4707664.375214 1681609.346909,4707664.375214</gml:coordinates>
                </gml:Box>
            </gml:boundedBy>
            <x>1681609.3</x>
            <y>4707664.4</y>
            <value_0>0</value_0>
            <value_list>0</value_list>
            <red>255</red>
            <green>255</green>
            <blue>255</blue>
        </ctr25k_feature>
    </ctr25k_layer>
</msGMLOutput>

Questo il risultato di una query su un layer TIFF di tipo Int16, il colore (red, green, blue) deriva da una classificazione:

<?xml version="1.0" encoding="ISO-8859-1"?>
<msGMLOutput
    xmlns:gml="http://www.opengis.net/gml"
    xmlns:xlink="http://www.w3.org/1999/xlink"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <rainfall_layer>
        <rainfall_feature>
            <gml:boundedBy>
                <gml:Box srsName="EPSG:4326">
                    <gml:coordinates>-1.000000,-1.000000 -1.000000,-1.000000</gml:coordinates>
                </gml:Box>
            </gml:boundedBy>
            <x>0.2503605</x>
            <y>44.916937</y>
            <value_0>902</value_0>
            <value_list>902</value_list>
            <class>5</class>
            <red>247</red>
            <green>6</green>
            <blue>123</blue>
        </rainfall_feature>
    </rainfall_layer>
</msGMLOutput>