[Gfoss] monitoraggio traffico navale

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.

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...)

GeoServer gestirebbe correttamente una chiamata del genere ?

Restituendomi una mappa costruita con i soli records che rispettano il
filtro data='27-12-008' ?

Grazie,

Andrea.

--
~~~~~~~~~~~~~~~~~
§ Andrea §
§ Peri §
~~~~~~~~~~~~~~~~~

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&quot;
   xmlns:wfs="http://www.opengis.net/wfs&quot;
   xmlns:ogc="http://www.opengis.net/ogc&quot;
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&quot;
   xsi:schemaLocation="http://www.opengis.net/wfs
                       http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd&quot;&gt;
   <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=<Filter%20xmlns%3D"http%3A//www.opengis.net/ogc"><PropertyIsBetween><PropertyName>topp%3ALAND_KM</PropertyName><LowerBoundary><Literal>100000</Literal></LowerBoundary><UpperBoundary><Literal>150000</Literal></UpperBoundary></PropertyIsBetween></Filter>

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&quot;
   xmlns:wfs="http://www.opengis.net/wfs&quot;
   xmlns:ogc="http://www.opengis.net/ogc&quot;
   xmlns:gml="http://www.opengis.net/gml&quot;
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&quot;
   xsi:schemaLocation="http://www.opengis.net/wfs
                       http://schemas.opengis.net/wfs/1.0.0/WFS-basic.xsd&quot;&gt;
   <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.

Grazie per la risposta, e' veramente molto interessante ...

Pero' cosa intendi con la condizione

purchè si limiti a il solo feature type della richiesta (i join
non sono supportati dallo standard).

Nel caso richiedessi una mappa con 3 layers distinti potrei passargli
(in post ovviamente)
un filtro per ciascuno di essi ?

Grazie,
Andrea.

2009/1/3 Andrea Aime <aaime@opengeo.org>:

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:

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

--
~~~~~~~~~~~~~~~~~
§ Andrea §
§ Peri §
~~~~~~~~~~~~~~~~~

Andrea Peri ha scritto:

Grazie per la risposta, e' veramente molto interessante ...

Pero' cosa intendi con la condizione

purchè si limiti a il solo feature type della richiesta (i join
non sono supportati dallo standard).

Nel caso richiedessi una mappa con 3 layers distinti potrei passargli
(in post ovviamente)
un filtro per ciascuno di essi ?

Si, puoi mettere più elementi query, ciascuno può interrogare un
layer diverso, quello che ottieni nel risultato è la concatenazione
delle tre collezioni di feature ritornate dalle query (o se usi
il formato di uscita SHAPE-ZIP, specifico di GeoServer, un zip file con
tre shapefile dentro).

Quello che lo standard non permette di fare è specificare una query
che confronti attributi di un feature type con attributi di un
altro feature type (un join, appunto).

Ciao
Andrea

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