[Gfoss] monitoraggio traffico navale

Andrea Aime aaime a opengeo.org
Sab 3 Gen 2009 22:26:34 CET


Andrea Peri ha scritto:
>>> I parametri passabili non prevedono la possibilita' di richiedere i
>>> dati discriminandoli con un intervallo temporale, ma solo con una
>>> estensione geografica.
> 
>> Why not? IMHO è possibile utilizzando il Filter Encoding di OGC:
>> http://www.opengeospatial.org/standards/filter
> 
> Questa non la sapevo (!)
> 
> Infatti, non pensavo che con sistemi quali geoserver o mapserver fosse
> possibile passare da utente dinamicamente un filtro sui campi
> dell'archivio.

Su un campo, su più campi, complessità del filtro a piacimento,
purchè si limiti a il solo feature type della richiesta (i join
non sono supportati dallo standard).
Ad esempio, il seguente filtro mette insieme due campi, li divide,
e verifica che il risultato superi un certo valore:

<wfs:GetFeature service="WFS" version="1.0.0"
   outputFormat="GML2"
   xmlns:topp="http://www.openplans.org/topp"
   xmlns:wfs="http://www.opengis.net/wfs"
   xmlns:ogc="http://www.opengis.net/ogc"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.opengis.net/wfs
                       http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd">
   <wfs:Query typeName="topp:states">
     <ogc:Filter>
       <ogc:PropertyIsGreaterThan>
         <ogc:Div>
             <ogc:PropertyName>MANUAL</ogc:PropertyName>
             <ogc:PropertyName>WORKERS</ogc:PropertyName>
         </ogc:Div>
          <ogc:Literal>0.25</ogc:Literal>
     </ogc:PropertyIsGreaterThan>
     </ogc:Filter>
     </wfs:Query>
</wfs:GetFeature>


> A questo punto mi incuriosisce pero' capire se ho capito bene.
> Ad esempio se ipotizzassi di ricevere solo i dati che soddisfino il valore
> "data=27-12-2008". Dove data e' un campo dell'archivio, mi domando
> come sarebbe la chiamata:
> 
> qualcosa del tipo:
> 
> http://......?service=WMS&layer=traffico&data=27-12-2008
> (ovviamente non mi aspetto che la chiamata sia proprio cosi', ma tanto
> per esemplificare...)

La chiamata sarebbe qualcosa di orribile se fatta con una GET usando
un filtro OGC, perché lo devi scrivere in XML e url-encodarlo,
però l'idea è quella.... sotto ho messo un esempio.

> GeoServer gestirebbe correttamente una chiamata del genere ?
> 
> Restituendomi una mappa costruita con i soli records che rispettano il
> filtro data='27-12-008' ?

Posto che il backend riesca a gestire le date correttamente si, non ci 
sono problemi. E questo vale per qualunque tipo di attributo (per le
date so che è un po' traballante, ma fino ad ora non ho ricevuto grosse
lamentele, se avete noie fatemi sapere).

Questo è un esempio funzionante di filtro OGC in una richiesta
GET:

http://geo.openplans.org:8080/geoserver/wfs?request=GetFeature&version=1.1.0&typeName=topp:states&propertyName=STATE_NAME,LAND_KM,the_geom&outputFormat=GML2&FILTER=%3CFilter%20xmlns%3D%22http%3A//www.opengis.net/ogc%22%3E%3CPropertyIsBetween%3E%3CPropertyName%3Etopp%3ALAND_KM%3C/PropertyName%3E%3CLowerBoundary%3E%3CLiteral%3E100000%3C/Literal%3E%3C/LowerBoundary%3E%3CUpperBoundary%3E%3CLiteral%3E150000%3C/Literal%3E%3C/UpperBoundary%3E%3C/PropertyIsBetween%3E%3C/Filter%3E

La stessa richiesta in formato XML per uso POST:

<wfs:GetFeature service="WFS" version="1.0.0"
   outputFormat="GML2"
   xmlns:topp="http://www.openplans.org/topp"
   xmlns:wfs="http://www.opengis.net/wfs"
   xmlns:ogc="http://www.opengis.net/ogc"
   xmlns:gml="http://www.opengis.net/gml"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.opengis.net/wfs
                       http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd">
   <wfs:Query typeName="topp:states">
   <ogc:PropertyName>topp:STATE_NAME</ogc:PropertyName>
   <ogc:PropertyName>topp:LAND_KM</ogc:PropertyName>
    <ogc:PropertyName>topp:the_geom</ogc:PropertyName>
<ogc:Filter>
<ogc:PropertyIsBetween>
<ogc:PropertyName>topp:LAND_KM</ogc:PropertyName>
<ogc:LowerBoundary><ogc:Literal>100000</ogc:Literal></ogc:LowerBoundary>
<ogc:UpperBoundary><ogc:Literal>150000</ogc:Literal></ogc:UpperBoundary>
</ogc:PropertyIsBetween>
</ogc:Filter>
   </wfs:Query>
</wfs:GetFeature>

O infine se preferisci la leggebilità a discapito dello standard,
puoi usare un filtro in linguaggio CQL (lo stesso dei catalog services,
ma che GeoServer supporta per WFS e per WMS, perché più pratico):

http://geo.openplans.org:8080/geoserver/wfs?request=GetFeature&typeName=topp:states&propertyName=STATE_NAME,LAND_KM,the_geom&CQL_FILTER=LAND_KM%20BETWEEN%20100000%20AND%20150000&version=1.0.0

Ciao
Andrea

PS: btw, le richieste che ho incollato qui fanno parte delle
demo di GeoServer, quelle che vi trovate fra le mani subito
dopo aver installato un GeoServer "standard", così come lo
trovate nei download.

-- 
Andrea Aime
OpenGeo - http://opengeo.org
Expert service straight from the developers.


Maggiori informazioni sulla lista Gfoss