Introduzione a GeoServer ed ai servizi OGC

Post on 07-Jul-2015

488 views 4 download

description

Slide di Introduzione al GeoServer con particolare enfasi sui protocolli OGC da esso supportati. La presentazione ripercorre con buon livello di dettaglio le funzionalità offerte da GeoServer proponendo dove necessario una breve introduzione ai servizi OGC da esso implementati in modo da rendere l'utente autonomo per quanto riguarda la comprensione dei concetti alla base delle funzionalità di GeoServer stesso.

Transcript of Introduzione a GeoServer ed ai servizi OGC

Introduzionea

GeoServer

Andrea Aime, Simone Giannecchini

www.geo-solutions.it

www.geoserver.org

OGC: Open Geospatial Consortium

• www.opengeospatial.org

• Organizzazione internazionale no-profit

• Crea standard per il contenuto, i servizi e l'interscambio di dati

• L'accesso alle specifiche è libero

• I più noti standard:– WMS (Web Map Service)

– WFS (Web Feature Service)

– WCS (Web Coverage Service)

– CS-W (Catalogue service for Web)

– GML (Geographic Markup Language)

– KML (Keyhole Markup Language)

Lo scenario

• Evoluzione dell'uso di dati cartografici– file + workstation GIS

– dbms spaziali, server centralizzati (SDE)

– l'esplosione del web mapping

– l'accesso alla cartografia per le masse (Google Maps, Google Earth)

• Numero sempre crescente di utenti occasionali, non professionalizzati

• La spinta alla distribuzione dei dati verso il pubblico

Dati

• Dati chiusi in silos

• Comunicazioni assenti o rese difficili da mancanza di standard condivisi

• Il potenziale del dati è largamentesotto-sfruttato

• La partecipazione delcomune cittadino assente

Dati

Dati

Dati

• Apertura verso il web, maggiore fruibilità del dato geografico

• Disponibilità di protocolli condivisi e standardizzati (OGC)

• Partecipazione di una più ampia utenza grazie a sistemi pensati per il mercato di massa(es, Google Maps, Google Earth)

Dati

Dati

OGC

Dati

• Client desktop

– visualizzazione personalizzata

– modifica

– analisi

• Client web per tecnici

– vestizione fissa

– strumentazione avanzata

– piccolo editing

• Client web

– vestizione fissa

– strumentazione minima

– integrazione con G.Maps, VE, Yahoo Maps

• Globi

– integrazione con Google Earth (KML)

Protocolli OGC, velocemente

• WMS (Web Map Service) + SLD (Styled Layer Descriptor)

– creare di mappe a partire da dati grezzi, interrogare, legende

• WFS (Web Feature Service)– descrivere, fornire e modificare

dati vettoriali

• WCS (Web Coverage Service)– descrivere e fornire dati raster

• WPS (Web Processing Service)– eseguire analisi spaziali

Osservare,comprendere

ma nonanalizzare,

creare

Esportazione,filtro,

modifica

Analisi,indagine

OGC e INSPIRE

• Le specifiche OGC vengono spesso trasformate in standard ISO

• La direttiva europea INSPIRE richiederà agli enti pubblici di pubblicare dati secondo tali standard

• In particolare:– WMS 1.3

– WFS 1.2

• Queste versioni dei protocolli ad oggi non sono di larga diffusione. No client, no server per WFS 1.2, un solo server open source per WMS 1.3

• → bisogna fare ancora un po' di strada, per iniziare ci si può appoggiare alle versioni di larga diffusione, WMS 1.1 e WFS 1.0

OGC e la comunità Open Source

• OGC sponsorizza “reference implementations” per diversi standard

• Queste sono sempre Open Source

• Libero accesso alle specifiche:– molti software open source rispettano una o più

specifiche OGC

– spesso i software open source fanno da avanguardia nella realizzazione delle specifiche, creando massa critica (standard nella pratica oltre che sulla carta)

– ecosistema di prodotti interoperabili

• Esempi: DeeGree, GeoServer, gvSig, MapGuide, MapServer, OpenJump, OpenLayers, uDig, ...

I client

Andrea Aime, Simone Giannecchini

www.geo-solutions.it

www.geoserver.org

uDig

● User-friendly Desktop Internet GIS

● udig.refractions.net● Permette di integrare

sorgenti dati locali (shapefile, postgis) e remote (WMS/WFS)

● Creazione di carte tematiche

● Editing di dati (diretto o tramite WFS)

OpenLayers

● API Javascript per l'esplorazione di servizi OGC in un browser

● Permette di integrare in una sola mappa– strati serviti da server WMS– strati serviti da server WFS– mappe di base come Google Maps/MS

Virtual Earth/Yahoo Maps● Pensato per sviluppatori JavaScript.● GeoServer lo integra per avere una rapida

anteprima dei layer WMS

Gmaps satellite+ overlay WMS

Gmaps strade+ overlay WFS

Semplice

“Slippy map”

● L'immagine è in realtà composta da mattonelle 256x256

● I livelli di zoom sono fissi● Questo rende il “caching” possibile, le immagini

possono essere generate una volta sola

Google Earth

● Globo 3D● Dettagliate foto satellitari con copertura globale● Tutti i livelli più comuni e decine di extra con

collegamenti● Terreno tridimensionale● Possibilità di integrare i propri dati usando il

linguaggio KML (Keyhole Markup Language)

Overlay dati da GSOverlay dati da GS

GeoServer

Andrea Aime, Simone Giannecchini

www.geo-solutions.it

www.geoserver.org

• www.geoserver.org• Server Open Source realizzato in Java• Pubblica dati geografici in rete:

– con una forte enfasi sugli standard OGC(WMS, WFS, WCS, SLD, ...)

– con estensioni per il mercato di massa integrate nei protocolli OGC (Shapefile, SVG, PDF, GeoRSS, GeoJSON)

• Interfaccia di amministrazione web• In rapida crescita

Geo

Serve r

WFS 1.0

WMS 1.1

PostGISDB2OracleMySql

Shapefile-------

----------

----------

---------

---

----------

----------

---------

----------

----------

----------

---------

----------

ArcSDEWFS

PNG, GIFJPEGTIFF, GeoTIFFSVG, PDFKML/KMZ

Shapefile.zipGML2GML3GeoRSSGeoJSONCSV/XLSDati

vettoriali

Server

Mappe

DBMS

Dati vettoriali

WFS 1.1

WCS 1.0

GeoTIFFArcGridGTopo30Img+worldMosaicPyramidMrSidJPEG 2000Dati raster

Dati raster

GeoTIFFArcGridGTopo30Img+World

1.7.0

WCS 1.1

GWCKML superoverlaysGoogle maps tilesVirtual Earth tiles

Client webOpenLayersFlamingo M.C.WMS + WFS

(GML, GeoJSON, GeoRSS)

Client desktopgvSigQGIS, JumpArcMap, uDigWMS + WFS

ServerMapServerMapBenderDeeGree

WMS + WFS

WMS (KML, GeoRSS)

Globi, mappe comm.Google EarthGoogle MapsYahoo MapsVirtual Earth

Ge

oS

erver

Glossario GeoServer

● DataStore: una connessione a una sorgente dati. Ad esempio PostGIS/Oracle, o uno Shapefile

● FeatureType: una “tabella” all'interno di un DataStore.

● CoverageStore: una connessione a una sorgente dati raster. Ad esempio un file GeoTiff

● Coverage: un raster contenuto all'interno di un Coverage Store

GeoServerGeoServer

Esempio

landmarks.shp

PostGIS

NYC

Landmarks

Roads

Buildings

Hydrography

DataStore FeatureType

EPSG (www.epsg.org)

• European Petroleum Survey Group

• L'autorità internazionale in fatto di sistemi di riferimento geografici

• Elenco di codici numerici, ciascuno individua un sistema di riferimento (esistono più di 3000 codici)

• Fornisce un database con tali codici, la definizione degli ellissoidi, posizionamento datum, proiezioni ecc.

• Gli standard OGC riferiscono i codici come:– ESPG:<codice> (EPSG:3003)

– urn:ogc:def:crs:EPSG:<codice> (urn:ogc:def:crs:EPSG:3003)

EPSG:3003

PROJCS["Monte Mario / Italy zone 1", GEOGCS["Monte Mario", DATUM["Monte Mario", SPHEROID["International 1924", 6378388.0, 297.0, AUTHORITY["EPSG","7022"]], TOWGS84[-50.2, -50.4, 84.8, -0.69, -2.012, 0.459, -5.791915759418465], AUTHORITY["EPSG","6265"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AXIS["Geodetic longitude", EAST], AXIS["Geodetic latitude", NORTH], AUTHORITY["EPSG","4265"]], PROJECTION["Transverse Mercator", AUTHORITY["EPSG","9807"]], PARAMETER["central_meridian", 9.0], PARAMETER["latitude_of_origin", 0.0], PARAMETER["scale_factor", 0.9996], PARAMETER["false_easting", 1500000.0], PARAMETER["false_northing", 0.0], UNIT["m", 1.0], AXIS["Easting", EAST], AXIS["Northing", NORTH], AUTHORITY["EPSG","3003"]]

• Monte Mario Zona 1, definito con sintassi WKT (Well Known Text)

Parte pratica, introduzione

● Installazione Java, GeoServer e uDig● Familiarizzare con l'interfaccia utente di

GeoServer (configurare un layer, usare l'anteprima mappa in OpenLayers)

● Familiarizzare con l'interfaccia utente di uDig● Toccare con mano WMS e WFS: GeoServer e

uDig come coppia di client e server (guardiamo layer WMS, WFS, tematizziamo questi ultimi)

XML in cinque minuti

Andrea Aime, Simone Giannecchini

www.geo-solutions.it

www.geoserver.org

Stato dei protocolli

• I protocolli sono ben realizzati in un buon numero di progetti Open Source e in alcuni software commerciali

• La comunicazione è a volte ancora complessa, gli standard non sono chiari in tutti i dettagli

• Se volessimo fare un paragone con le automobili, siamo ancora al tempo in cui per possederne una bisognava essere un po' meccanici

• I software open source spesso non hanno interfacce utente amichevoli o le hanno solo per parte della funzionalità

• → occorre ancora sporcarsi le mani con molto XML

XML

• eXtensible Markup Language

• Un linguaggio in formato testo per descrivere “dati”

• Di ampio utilizzo nell'informatica moderna

• Alla base di quasi tutti i protocolli OGC

• Non è necessario essere programmatori, ma riuscire a leggerlo è fondamentale per districarsi nei protocolli OGC:

– molte chiamate presuppongono l'uso di XML (nella richiesta o nella risposta)

– OGC ha definito gli schema per ciascun documento passato nelle chiamate

Esempio

• <note>, <to>, ecc. sono detti tag

• Sono bilanciati, per ogni tag aperto c'é il corrispondente tag di chiusura (</note>, </to>), salvo il caso di elemento vuoto (<footer/>)

• Sono innestati in una struttura gerarchica

• Possono avere un contenuto testo (“Students”) o contenere altri elementi

• Possono avere attributi (type=”simpleMessage”)

<note type=”simpleMessage” xmlns=”http://www.w3schools.com”> <from>Andrea</from> <to>Students</to> <heading>OGC protocols</heading> <body>OGC protocols live and die by XML</body> <footer/></note>

XML Schema

• Un modo per specificare la struttura di un documento XML

• Indica come si chiamano gli elementi, quali sono i loro attributi, quale è il loro contenuto

• Indicano restrizioni, ad esempio:

– il contenuto di un tag deve essere un numero intero

– il tag “mother” contiene uno o più elementi “child”

– ecc.

• Un documento XML si dice ben formato se i tag sono bilanciati (e non contiene alcuni caratteri vietati)

• Un documento XML ben formato è conforme allo schema se riferisce uno schema e ne rispetta le regole

Esempio<?xml version="1.0"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3schools.com" xmlns="http://www.w3schools.com" elementFormDefault="qualified">

<xs:element name="note"> <xs:complexType> <xs:sequence> <xs:element name="from" type="xs:string" /> <xs:element name="to" type="xs:string" /> <xs:element name="heading" type="xs:string" /> <xs:element name="body" type="xs:string" /> <xs:element name="footnote" type="xs:string" /> </xs:sequence> <attribute name="type" type="xs:string"/> </xs:complexType> </xs:element>

</xs:schema>

Namespace

• I tag XML e i relativi schemi possono essere definiti da chiunque → lo stesso tag potrebbe essere definito da più persone con significati diversi

• Namespace:– si usa un URI per identificare i tag di un certo

schema

– l'URI può essere lungo, si usa un prefisso breve al suo posto nel documento xml

<h:table xmlns:h="http://www.w3.org/TR/html4/"> <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr></h:table>

<f:table xmlns:f="http://www.w3schools.com/furniture"> <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length></f:table>

OGC e namespace

• OGC fornisce molti schema, per ciascuno c'è un URI e un prefisso convenzionale

• Ogni servizio in genere usa diversi schemi e diversi namespace

•OWS 1.0OWS 1.0xmlns:ows=”xmlns:ows=”http://www.opengis.net/ows”http://www.opengis.net/ows”

GML 3.1.1GML 3.1.1xmlns:gml=”xmlns:gml=”http://www.opengis.net/gml”http://www.opengis.net/gml”

FILTER 1.1.0FILTER 1.1.0xmlns:ogc=”xmlns:ogc=”http://www.opengis.net/filter”http://www.opengis.net/filter”

WFS 1.1.0WFS 1.1.0xmlns:wfs=”xmlns:wfs=”http://www.opengis.net/wfs”http://www.opengis.net/wfs”

Esempio con namespace multipli<wfs:GetFeature service="WFS" version="1.0.0" xmlns:wfs="http://www.opengis.net/wfs" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml" xmlns:topp="http://www.openplans.org/topp" 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:PERSONS</ogc:PropertyName> <ogc:Filter> <ogc:BBOX> <ogc:PropertyName>the_geom</ogc:PropertyName> <gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326"> <gml:coordinates> -75.102613,40.212597 -72.361859,41.512517 </gml:coordinates> </gml:Box> </ogc:BBOX> </ogc:Filter> </wfs:Query></wfs:GetFeature>

Web Map Servicein GeoServer

Andrea Aime, Simone Giannecchini

www.geo-solutions.it

www.geoserver.org

Generalità

● WMS mette a disposizione un catalogo di strati per creare mappe, che possono essere fornite:

– in un insieme di formati di uscita (tipicamente raster, come PNG, GIF, JPEG)

– in un insieme di proiezioni cartografiche– ciascuno con uno o più stili predefiniti

● E' possibile interrogare la mappa in un punto

GeoServerGeoServerWMSWMS

Dativettorialie raster

---------------------------------------

---------------------------------------

---------------------------------------

---------------------------------------

---------------------------------------

---------------------------------------

Stili (SLD)

---------------------------------------

---------------------------------------

---------------------------------------

Template(personalizzazione output)

GetMap

GetFeatureInfo

GetLegendGraphics

Disegno mappaPNG, GIF, JPEG, GeoTiff, KML, SVG, PDF, GeoRSS, ...

Interrogazione datiHTML, GML2, TXT

LegendaPNG, GIF

GetCapabilities

Catalogo layer, stili, funzionalità supportate

WMS 1.1.1

uDiguDig GeoServer

GetCapabilities

GetMap

GetFeatureInfo

Metadati (titolo)

Stile (SLD)

Template (HTML)

GetFeatureInfo

Template (HTML)

GetMap

Stile SLD

http://localhost:8080/geoserver/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&LAYERS=tiger:poly_landmarks&STYLES=&FORMAT=image/png&HEIGHT=256&WIDTH=256&SRS=EPSG:4326&BBOX=-73.94281675,40.6695265, -73.83148025,40.780863

WMS GetCapabilities

• http://localhost:8080/geoserver/ows?service=WMS&request=GetCapabilities

• La risposta a questa chiamata è un documento XML, di norma piuttosto lungo (per la demo di GeoServer occuperebbe 78 pagine stampate in Arial corpo 10)

• La risposta elenca– Metadati sul server (titolo, gestore, ecc.)

– Informazioni sulle chiamate supportate (quali formati di uscita ecc.)

– L'elenco dei layer (titolo, abstract, sist. rif., area coperta, stili)

• E' un piccolo catalogo. Vediamone velocemente un estratto.

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE WMT_MS_Capabilities SYSTEM "http://localhost:8080/geoserver/schemas/wms/1.1.1/WMS_MS_Capabilities.dtd"><WMT_MS_Capabilities version="1.1.1" updateSequence="77"> <Service> <Name>OGC:WMS</Name> <Title>GeoServer Web Map Service</Title> <Abstract>A compliant implementation of WMS 1.1.1 plus most of the SLD 1.0 extension (dynamic styling). Can also generate PDF, SVG, KML, GeoRSS </Abstract> <KeywordList> <Keyword>WMS</Keyword> <Keyword>GEOSERVER</Keyword> </KeywordList> <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://localhost:8080/geoserver/wms"/> <ContactInformation> <ContactPersonPrimary> <ContactPerson>Claudius Ptolomaeus</ContactPerson> <ContactOrganization>The ancient geographes INC</ContactOrganization> </ContactPersonPrimary> <ContactPosition>Chief geographer</ContactPosition> <ContactAddress> <AddressType>Work</AddressType> <Address/> <City>Alexandria</City> <Country>Egypt</Country> </ContactAddress> <ContactVoiceTelephone/> <ContactFacsimileTelephone/> <ContactElectronicMailAddress>claudius.ptolomaeus@gmail.com </ContactElectronicMailAddress> </ContactInformation> <Fees>NONE</Fees> <AccessConstraints>NONE</AccessConstraints> </Service>...

...<Capability> <Request> <GetCapabilities> <Format>application/vnd.ogc.wms_xml</Format> ... </GetCapabilities> <GetMap> <Format>image/png</Format> ... <Format>application/openlayers</Format> <Format>application/pdf</Format> <Format>image/gif</Format> ... </GetMap> <GetFeatureInfo> <Format>text/plain</Format> <Format>text/html</Format> <Format>application/vnd.ogc.gml</Format> ... </GetFeatureInfo> ... <GetLegendGraphic> <Format>image/png</Format> <Format>image/jpeg</Format> <Format>image/gif</Format> ... <Exception> <Format>application/vnd.ogc.se_xml</Format> </Exception> <UserDefinedSymion SupportSLD="1" UserLayer="1" UserStyle="1" RemoteWFS="1"/>...

<Layer> <Title>GeoServer Web Map Service</Title> <Abstract> … </Abstract> <!--All supported EPSG projections:--> <SRS>EPSG:WGS84(DD)</SRS> <SRS>EPSG:2000</SRS> … (tremila codici dopo) … <Layer queryable="1"> <Name>tiger:poly_landmarks</Name> <Title>Manhattan (NY) landmarks</Title> <Abstract>Manhattan landmarks, identifies water, lakes, parks, interesting buildilngs</Abstract> <KeywordList> <Keyword>DS_poly_landmarks</Keyword> <Keyword>poly_landmarks</Keyword> </KeywordList> <SRS>EPSG:4326</SRS> <LatLonBoundingBox minx="-74.047185" miny="40.679648" maxx="-73.90782" maxy="40.882078"/> <Style> <Name>poly_landmarks</Name> <Title>Manhattan polygon landmarks</Title> <Abstract>Colors NY landmark polygons with different colors according to their contents</Abstract> <LegendURL width="20" height="20"> <Format>image/png</Format> <OnlineResource xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="http://localhost:8080/geoserver/wms/GetLegendGraphic? VERSION=1.0.0&amp;FORMAT=image/png &amp;WIDTH=20&amp;HEIGHT=20&amp;LAYER=tiger:poly_landmarks"/> </LegendURL> </Style> </Layer>

GetMap

• Permette di ottenere una mappa specificando nella chiamata:

– Un elenco di layer da visualizzare

– Un elenco di stili (può essere vuoto per adottare gli stili di defalt)

– L'area da visualizzare

– La dimensione dell'immagine

– Il formato di immagine restituito

– Il colore di sfondo, l'eventuale trasparenza dell'immagine

GetMap, esempio

http://localhost:8080/geoserver/wms?&request=GetMap&bbox=-130,24,-66,50&srs=EPSG:4326&layers=topp:states&styles=population&Format=image/png&width=550&height=250

minx,miny,maxx,maxybbox nel sistema di coordinate spec in SRS(srs è opzionale, se non specificato, si usa il nativo)

GetMap, cambio di proiezionehttp://localhost:8080/geoserver/wms?LAYERS=topp:states&SRS=EPSG:2204&BBOX=-12022399,-4197587,9679320,8107511&WIDTH=582&HEIGHT=330&...

PROJCS["NAD27 / Tennessee", GEOGCS["NAD27", DATUM["North American Datum 1927", SPHEROID["Clarke 1866", 6378206.4, 294.9786982138982, AUTHORITY["EPSG","7008"]], TOWGS84[-4.2, 135.4, 181.9, 0.0, 0.0, 0.0, 0.0], AUTHORITY["EPSG","6267"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AXIS["Geodetic longitude", EAST], AXIS["Geodetic latitude", NORTH], AUTHORITY["EPSG","4267"]], PROJECTION["Lambert Conic Conformal (2SP)", AUTHORITY["EPSG","9802"]], PARAMETER["central_meridian", -86.0], PARAMETER["latitude_of_origin", 34.666666666666664], PARAMETER["standard_parallel_1", 35.25], PARAMETER["false_easting", 2000000.0], PARAMETER["false_northing", 100000.0], PARAMETER["standard_parallel_2", 36.416666666666664], UNIT["foot_survey_us", 0.30480060960121924], AXIS["Easting", EAST], AXIS["Northing", NORTH], AUTHORITY["EPSG","2204"]]

GetMap, layer multipli

http://localhost:8080/geoserver/wms?request=GetMap&layers=tiger:poly_landmarks,tiger:tiger_roads,tiger:poi&styles=,,&bbox=-74.01,40.70,-73.98,40.73&format=image/png&width=800&height=800

GetFeatureInfo

• Chiede al serve informazioni

• Cosa c'é nella mappa al pixel x,y?

• L'output può essere fornito in vari formati:– HTML

– testo

– GML (Geographic Markup Language, una forma di XML)

• L'output HTML è personalizzabile con un template (in GeoServer, non in generale)

GetFeatureInfo, esempiohttp://localhost:8080/geoserver/wms?request=GetFeatureInfo&bbox=-130,24,-66,50&&layers=topp:states&styles=population&format=jpeg&width=550&height=250&info_format=text/plain&query_layers=topp:states&x=170&y=160

Results for FeatureType 'states':--------------------------------------------the_geom = [GEOMETRY (MultiPolygon) with 153 points]STATE_NAME = ArizonaSTATE_FIPS = 04SUB_REGION = MtnSTATE_ABBR = AZLAND_KM = 294333.462WATER_KM = 942.772PERSONS = 3665228.0FAMILIES = 940106.0HOUSHOLD = 1368843.0MALE = 1810691.0FEMALE = 1854537.0WORKERS = 1358263.0DRVALONE = 1178320.0CARPOOL = 239083.0PUBTRANS = 32856.0EMPLOYED = 1603896.0UNEMPLOY = 123902.0SERVICE = 455896.0MANUAL = 185109.0P_MALE = 0.494P_FEMALE = 0.506SAMP_POP = 468178.0-----------------------------

GetMap

Ovvero: cosa c'è alpixel 170,160 di quella mappa?

GetFeatureInfo, secondo esempio

• Esempio nella preview:– usa javascript per

eseguire la GetFeatureInfo

– la chiamata ritorna un documento HTML che viene integrato nella pagina corrente

• La struttura del documento è pilotata da un “template” HTML → porzioni di HTML mescolate a segnaposto per variabili

Template

• Costruiti sulla libreria FreeMarker http://freemarker.sourceforge.net/

• Al template viene dato in pasto un elenco di “feature” (record, geometrie con attributi) ciascuna con un “tipo” (struttura della tabella)

• Il template usa placeholder del tipo $${feature.NOME.value} per estrarre il valore di un certo attributo

• Si tratta di “piccola programmazione”

• Maggiori informazioni qui:

– http://geoserver.org/display/GEOSDOC/Freemarker+templates

Esempio template<table class="featureInfo"> <caption class="featureInfo">${type.name}</caption> <tr> <th>fid</th><#list type.attributes as attribute> <#if !attribute.isGeometry> <th >${attribute.name}</th> </#if></#list> </tr>

<#assign odd = false><#list features as feature> <#if odd> <tr class="odd"> <#else> <tr> </#if> <#assign odd = !odd>

<td>${feature.fid}</td> <#list feature.attributes as attribute> <#if !attribute.isGeometry> <td>${attribute.value?string}</td> </#if> </#list> </tr></#list></table><br/>

sezionetitolo

Corpotabella

Sfondoalternato

Valoreattributi

GetLegendGraphics

• Cosa significano i colori presenti in mappa?

http://localhost:8080/geoserver/wms?SERVICE=WMS&VERSION=1.1.1&REQUEST=GetLegendGraphic&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=topp:states

CQL e WMS

• CQL: Catalog Query Language

• Un linguaggio testuale per la descrizione di semplici filtri su dati (molto semplici, del tipo attributo <opconfronto> valore)

• Mutuato dalla specifica CAT (Catalog Web Services)

• Estensione specifica di GeoServer, permette di effettuare filtri su richieste WMS

• Il protocollo WMS + SLD 1.0 propone altre vie per ottenere un risultato analogo (ma nettamente più complesse)

CQL: esempi

• STATE_NAME = 'Montana'

• MALE > FEMALE

• LAND_KM > 300000

• Nel caso vi siano più layer, si può costruire una lista di filtri, uno per layer, usando INCLUDE per il layer che non si vuole filtrare, esempio:INCLUDE;ATT>10;INCLUDE

Web Feature ServiceLivello “basic”

Andrea Aime, Simone Giannecchini

www.geo-solutions.it

www.geoserver.org

Web Feature Service

• Protocollo per l'accesso e la modifica di “Feature” geografiche

• Al contrario di WMS, si lavora a livello di dato, non di rappresentazione. WFS opera a livello di “codice sorgente” dell'informazione geografica.

• Gli oggetti territoriali di WFS si chiamano Feature:– identificativo (FID, Feature ID),

– una o più geometrie (vettoriali),

– eventuali attributi

• Geoserver è la reference implementation di WFS 1.0 e di WFS 1.1

Dativettoriali

Catalogo layer,capacità del server

Descrizione di ogni layer

Estrazione dati con filtri, selezione attributi, cambio proiezione

Editing dati

GeoServer è referenceimplementation WFS1.0 e 1.1

GeoServerGeoServerWFSWFS

GetCapabilities

DescribeFeatureType

GetFeature

TransactionLock

GetFeatureWithLock

Transaction

WFS 1.0 vs 1.1

• Principali differenze– WFS 1.0 usa GML2 e FILTER 1.0

– WFS 1.1 usa GML3 e FILTER 1.1

• Dal punto di vista delle funzionalità, WFS 1.1 permette di

– cambiare la proiezione dei dati ritornati (GeoServer permette di cambiare il sistema di rif. anche in WFS 1.0, come vendor extension)

– ordinare il risultato in base agli attributi

• WFS 1.0 è supportato dalla maggior parte dei client, WFS 1.1 è praticamente assente dallo scenario dei client open source → vedremo WFS 1.0

Il problema degli assi

• Tutte le realizzazioni open source di WFS 1.0 ritornano i dati geografici in ordine lon/lat

• La specifica non indicava chiaramente quale fosse l'ordine da utilizzare

• WFS 1.1 specifica chiaramente che l'ordine richiesto è l'opposto, lat/lon

• Questo ha creato non poca confusione, limitato notevolmente la diffusione di WFS 1.1

• Modi di esprimere un SRS:– EPSG:<codice>

– http://www.opengis.net/gml/srs/epsg.xml#<codice>

– urn:x-ogc:def:crs:EPSG:<codice>

WFS 1.0

WFS 1.1

La scelta di GeoServer

• Per compatibilità con l'esistente GeoServer WFS 1.0 continua a ritornare dati in ordine lon/lat

• Se si usa WFS 1.1 invece i dati sono ritornati in lat/lon

• In particolare, tutto dipende da come vengono nominati gli SRS

• Il dato viene ritornato in lon/lat per:– EPSG:<codice>

– http://www.opengis.net/gml/srs/epsg.xml#<codice>

• Il dato viene ritornato in lat/lon per:– urn:x-ogc:def:crs:EPSG:<codice>

Profili WFS

• Basic– GetCapabilities

– DescribeFeature

– GetFeature

• Transactional– Transaction

– GetFeatureWithLock

– Lock

Sola lettura

Lettura/Scrittura

GetFeature

A = 'xyx'B like geo%G bbox x1,y1,x2,y2...

GML2GML3Shapefile.zipGeoJSON

WFS 1.1Cambioproiezione

● GetCapabilities → quali layer?

● DescribeFeatureType → quali attributi per il layer X?

● GetFeature → estrazione dati con scelta attributi e filtro

Basic WFS

WFS GetCapabilities

• Strutturalmente simile alla GetCapabilities di WMS, ovvero:

– informazioni generali sul server

– chiamate e relativi formati di uscita

– elenco layer

• Ma questa volta si lavora a livello di dato grezzo, non ci sono stili

• Familiarizziamo con la struttura del documento

<?xml version="1.0" encoding="UTF-8"?><WFS_Capabilities version="1.0.0" xmlns="http://www.opengis.net/wfs" xmlns:cite="http://www.opengeospatial.net/cite" xmlns:it.geosolutions="http://www.geo-solutions.it" xmlns:tiger="http://www.census.gov" xmlns:sde="http://geoserver.sf.net" xmlns:topp="http://www.openplans.org/topp" xmlns:sf="http://www.openplans.org/spearfish" xmlns:nurc="http://www.nurc.nato.int" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs http://localhost:8080/geoserver/schemas/wfs/1.0.0/WFS-capabilities.xsd"> <Service> <Name>WFS</Name> <Title>GeoServer Web Feature Service</Title> <Abstract>This is the reference implementation of WFS 1.0.0 and WFS 1.1.0, supports all WFS operations including Transaction.</Abstract> <Keywords>WFS, WMS, GEOSERVER</Keywords> <OnlineResource>http://localhost:8080/geoserver/wfs</OnlineResource> <Fees>NONE</Fees> <AccessConstraints>NONE</AccessConstraints> </Service> ...

Analogo a WMS

<Capability> <Request> ... <DescribeFeatureType> <SchemaDescriptionLanguage> <XMLSCHEMA /> </SchemaDescriptionLanguage> <DCPType> <HTTP> <Get onlineResource="http://localhost:8080/geoserver/wfs?request=DescribeFeatureType" /> </HTTP> </DCPType> <DCPType> <HTTP> <Post onlineResource="http://localhost:8080/geoserver/wfs?" /> </HTTP> </DCPType> </DescribeFeatureType> <GetFeature> <ResultFormat> <GML3 /> <GML2 /> <SHAPE-ZIP /> <GEOJSON /> </ResultFormat> <DCPType> <HTTP> <Get onlineResource="http://localhost:8080/geoserver/wfs?request=GetFeature" /> </HTTP> </DCPType> <DCPType> <HTTP> <Post onlineResource="http://localhost:8080/geoserver/wfs?" /> </HTTP> </DCPType> </GetFeature>

Quali operazionisono supportate

Informazioni diminima su un layer

<FeatureTypeList> <Operations> <Query /> <Insert /> <Update /> <Delete /> <Lock /> </Operations> ... <FeatureType> <Name>tiger:poly_landmarks</Name> <Title>Manhattan (NY) landmarks</Title> <Abstract>Manhattan landmarks, identifies water, lakes, parks, interesting buildilngs </Abstract> <Keywords> DS_poly_landmarks, poly_landmarks </Keywords> <SRS>EPSG:4326</SRS> <LatLongBoundingBox minx="-74.047185" miny="40.679648" maxx="-73.90782" maxy="40.882078" /> </FeatureType> <FeatureType> <Name>tiger:poi</Name> <Title>Manhattan (NY) points of interset</Title> <Abstract>Points of intereset, Manhattan, New York. One of the attributes contains the name of a file with a picture of the point of interest.</Abstract> <Keywords> poi, DS_poi </Keywords> <SRS>EPSG:4326</SRS> <LatLongBoundingBox minx="-74.0118315772888" miny="40.70754683896324" maxx="-74.00857344353275" maxy="40.711945649065406" /> </FeatureType>

In realtà, lon/lat

Quali filtri sonosupportati da questoserver?

<ogc:Filter_Capabilities> <ogc:Spatial_Capabilities> <ogc:Spatial_Operators> <ogc:Disjoint /> <ogc:Equals /> <ogc:DWithin /> <ogc:Beyond /> <ogc:Intersect /> <ogc:Touches /> <ogc:Crosses /> <ogc:Within /> <ogc:Contains /> <ogc:Overlaps /> <ogc:BBOX /> </ogc:Spatial_Operators> </ogc:Spatial_Capabilities> <ogc:Scalar_Capabilities> <ogc:Logical_Operators /> <ogc:Comparison_Operators> <ogc:Simple_Comparisons /> <ogc:Between /> <ogc:Like /> <ogc:NullCheck /> </ogc:Comparison_Operators> <ogc:Arithmetic_Operators> <ogc:Simple_Arithmetic /> <ogc:Functions> <ogc:Function_Names> <ogc:Function_Name nArgs="1">abs</ogc:Function_Name> <ogc:Function_Name nArgs="1">acos</ogc:Function_Name>...

DescribeFeatureType

• Ritorna la struttura delle Feature in forma di XML schema

• Lo schema estende la AbstractFeature definita nello schema GML (GML2 o GML3 a seconda della versione di WFS)

• Nel caso di GeoServer, questo schema (insieme al nome del FeatureType) è derivato direttamente dalla struttura dati pubblicata (tabella dbms spaziale, shapefile) → se si cambiano i nomi degli attributi o il loro tipo nel database, GeoServer riflette questo cambiamento

Esempio: Tasmania roads<?xml version="1.0" encoding="UTF-8"?><xs:schema targetNamespace="http://www.openplans.org/topp" xmlns:topp="http://www.openplans.org/topp" xmlns:gml="http://www.opengis.net/gml" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0"> <xs:import namespace="http://www.opengis.net/gml" schemaLocation=" … /schemas/gml/2.1.2.1/feature.xsd" /> <xs:complexType name="tasmania_roads_Type"> <xs:complexContent> <xs:extension base="gml:AbstractFeatureType"> <xs:sequence> <xs:element name="the_geom" minOccurs="0" nillable="true" type="gml:MultiLineStringPropertyType" /> <xs:element name="TYPE" minOccurs="0" nillable="true"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:maxLength value="7" /> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <xs:element name="tasmania_roads" type="topp:tasmania_roads_Type" substitutionGroup="gml:_Feature" /></xs:schema>

Quali geometrie?

Point MultiPoint LineString

LinearRing MultiLineString Polygon

MultiPolygon GeometryCollection

GetFeature

• Estrae le Feature di uno o più FeatureType:– scelta degli attributi

– filtro per decidere quali Feature selezionare

• E' possibile estrarre le Feature nei formati dichiarati in GetCapabilities. Per GeoServer:

– GML2 (standard WFS 1.0)

– GML3 (standard WFS 1.1)

– GeoJSon (per client JavaScript)

– SHAPE-ZIP (per tutti gli altri!)

• Cambio di proiezione (solo in WFS 1.1, ma GeoServer lo supporta anche in WFS 1.0 come vendor extension)

GetFeature, filtro su attributi<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>STATE_NAME</ogc:PropertyName> <ogc:PropertyName>LAND_KM</ogc:PropertyName> <ogc:PropertyName>the_geom</ogc:PropertyName> <ogc:Filter> <ogc:PropertyIsBetween> <ogc:PropertyName>LAND_KM</ogc:PropertyName> <ogc:LowerBoundary> <ogc:Literal>140000</ogc:Literal> </ogc:LowerBoundary> <ogc:UpperBoundary> <ogc:Literal>150000</ogc:Literal> </ogc:UpperBoundary> </ogc:PropertyIsBetween> </ogc:Filter> </wfs:Query></wfs:GetFeature>

ovvero: 140000 < LAND_KM < 150000

Scelta attributi

Layer

Filtro

<?xml version="1.0" encoding="UTF-8"?><wfs:FeatureCollection xmlns="http://www.opengis.net/wfs" xmlns:wfs="http://www.opengis.net/wfs" xmlns:topp="http://www.openplans.org/topp" xmlns:gml="http://www.opengis.net/gml" … > <gml:boundedBy> <gml:Box srsName="http://www.opengis.net/gml/srs/epsg.xml#4326"> <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" "> -96.640396,30.361057 -80.89492,48.173923</gml:coordinates> </gml:Box> </gml:boundedBy> <gml:featureMember> <topp:states fid="states.1"> <topp:the_geom> <gml:MultiPolygon srsName="http://www.opengis.net/gml/srs/epsg.xml#4326"> <gml:polygonMember> <gml:Polygon> <gml:outerBoundaryIs> <gml:LinearRing> <gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts=" "> -88.071564,37.51099 -88.087883,37.476273 … (elenco completo delle coordinate omesso) … -88.071564,37.51099</gml:coordinates> </gml:LinearRing> </gml:outerBoundaryIs> </gml:Polygon> </gml:polygonMember> </gml:MultiPolygon> </topp:the_geom> <topp:STATE_NAME>Illinois</topp:STATE_NAME> <topp:LAND_KM>143986.61</topp:LAND_KM> </topp:states> </gml:featureMember> …

Risultato in GML2

GetFeature, alternativa CQL

• Anche in WFS si può usare CQL_FILTER per eseguire rapidamente un filtro

• Attenzione però, è una soluzione specifica di GeoServer, non fa parte dello standard WFS

http://localhost:8080/geoserver/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=topp:states&propertyName=the_geom,STATE_NAME,LAND_KM&cql_filter=LAND_KM between 140000 and 150000

GetFeature, bounding box<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>STATE_NAME</ogc:PropertyName> <ogc:PropertyName>PERSONS</ogc:PropertyName> <ogc:PropertyName>the_geom</ogc:PropertyName> <ogc:Filter> <ogc:BBOX> <ogc:PropertyName>the_geom</ogc:PropertyName> <gml:Box srsName="EPSG:4326"> <gml:coordinates> -75,40 -72,41 </gml:coordinates> </gml:Box> </ogc:BBOX> </ogc:Filter> </wfs:Query></wfs:GetFeature>

Alternative per bounding boxhttp://localhost:8080/geoserver/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=topp:states&propertyName=the_geom,STATE_NAME,LAND_KM&bbox=-75,40,-72,41

http://localhost:8080/geoserver/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=topp:states&propertyName=the_geom,STATE_NAME,LAND_KM&cql_filter=BBOX(the_geom,-75,40,-72,41)

Alternativastandard

Con CQL

GetFeature, filtro geometrico<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:Filter> <ogc:Intersects> <ogc:PropertyName>the_geom</ogc:PropertyName> <gml:Point srsName="EPSG:4326"> <gml:coordinates>-100,32</gml:coordinates> </gml:Point> </ogc:Intersects> </ogc:Filter> </wfs:Query></wfs:GetFeature>

http://localhost:8080/geoserver/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=topp:states&propertyName=the_geom,STATE_NAME,LAND_KM&cql_filter=INTERSECT(the_geom, POINT(-100 32))

GetFeature, filtri con calcoli<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>STATE_NAME</ogc:PropertyName> <ogc:Filter> <ogc:PropertyIsGreaterThan> <ogc:Div> <ogc:PropertyName>UNEMPLOY</ogc:PropertyName> <ogc:PropertyName>WORKERS</ogc:PropertyName> </ogc:Div> <ogc:Literal>0.10</ogc:Literal> </ogc:PropertyIsGreaterThan> </ogc:Filter> </wfs:Query></wfs:GetFeature>

http://localhost:8080/geoserver/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=topp:states&propertyName=the_geom,STATE_NAME,LAND_KM&cql_filter=UNEMPLOY > 0.1 * WORKERS

attrib <op> espressione

Ricerca disoccupazioneoltre il 10% (nel 1990)

Styled Layer Descriptor

Andrea Aime, Simone Giannecchini

www.geo-solutions.it

www.geoserver.org

Styled Layer Descriptor

• SLD è una sofisticata specifica OGC per la vestizione di layer vettoriali e raster

• E' molto flessibile, anche se nella sua generalità risulta di difficile comprensione e non ha sintassi semplificate per i tipi di vestizione più comuni

• Una volta presa padronanza dello strumento si possono realizzare vestizioni piuttosto sofisticate

• Si tratta di documenti XML, dove vengono riusate sia le specifiche GML che le specifiche Filter

• In questo documento si parla di SLD 1.0, nel frattempo OGC ha creato SLD 1.1 / SE 1.1

Generalità sulla struttura

• Un documento SLD è in origine pensato per descrivere la struttura di una mappa

• Contiene quindi un elenco di UserLayer o NamedLayer, ciascuno dei quali contiene uno UserStyle

– UserLayer: definizione del contenuto di un layer come collezione GML

– NameLayer: riferimento a un layer noto al server (per nome)

– UserStyle: insieme delle regole necessarie

• Di fatto ignoreremo tutti gli elementi al di fuori di UserStyle

Esempio di struttura

Interpretazione

• FeatureTypeStyle: ci può essere più di un F.T.S., ciascuno funziona come una sorta di layer trasparente e viene disegnato in pieno prima di passare al successivo

• Rule: ci può essere più di una Rule per F.T.S., ciascuna contiene un filtro sulle feature (OGC Filter) ed eventualmente un filtro sulla scala. La prima Rule che cattura la Feature corrente viene eseguita.

• Symbolizer: ci può essere più di un Symbolizer per Rule. E' il pennello che disegna la Feature corrente.

Il “tratto” può essere semplice o grafico. Le proprietà CSS sono:● color, width, opacity (elementi base)● lineJoin, lineCap (fine linea e congiunzioni)● dashArray, dashOffset (per definire stili a tratti)

Si applica solo a tipi lineari (linestring, multilinestring, ring), se applicato a un poligono ne disegna soltanto il contorno. Su un punto non fa nulla.

LineSymbolizer

<?xml version="1.0" encoding="ISO-8859-1"?><StyledLayerDescriptor version="1.0.0" xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"> <NamedLayer> <Name>Line</Name> <UserStyle> <FeatureTypeStyle> <Rule> <LineSymbolizer> <Stroke> <CssParameter name="stroke">#000000</CssParameter> </Stroke> </LineSymbolizer> </Rule>

</FeatureTypeStyle> </UserStyle> </NamedLayer></StyledLayerDescriptor>

http://www.colorschemer.com/online.html

#RRGGBB

…<LineSymbolizer> <Stroke> <CssParameter name="stroke">#0000FF</CssParameter> <CssParameter name="stroke-width">2</CssParameter> </Stroke></LineSymbolizer>…

…<LineSymbolizer> <Stroke> <CssParameter name="stroke">#0000FF</CssParameter> <CssParameter name="stroke-width">6</CssParameter> <CssParameter name="stroke-linejoin">round</CssParameter> <CssParameter name="stroke-linecap">round</CssParameter> </Stroke></LineSymbolizer>…

butt

square

round

…<LineSymbolizer> <Stroke> <CssParameter name="stroke">#000000</CssParameter> <CssParameter name="stroke-dasharray">10 0</CssParameter> </Stroke></LineSymbolizer>…

…<LineSymbolizer> <Stroke> <CssParameter name="stroke">#000000</CssParameter> <CssParameter name="stroke-dasharray">10 5 1 5</CssParameter> </Stroke></LineSymbolizer>…

…<LineSymbolizer> <Stroke> <CssParameter name="stroke">#0000FF</CssParameter> <CssParameter name="stroke-width">6</CssParameter> <CssParameter name="stroke-linejoin">round</CssParameter> <CssParameter name="stroke-linecap">round</CssParameter> <CssParameter name="stroke-opacity">0.5</CssParameter> </Stroke></LineSymbolizer>…

Si applica solo a tipi poligonali (polygon, multipolyon, ring). Se applicato a un punto nonfa nulla, se applicato a una linea la chiude e latratta come un poligono

PolygonSymbolizer

<?xml version="1.0" encoding="ISO-8859-1"?><StyledLayerDescriptor version="1.0.0" xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"> <NamedLayer> <Name>Polygon</Name> <UserStyle> <FeatureTypeStyle> <Rule> <PolygonSymbolizer> <Fill> <CssParameter name="fill">#AAAAAA</CssParameter> <CssParameter name="fill-opacity">1.0</CssParameter> </Fill> <Stroke> <CssParameter name="stroke">#000000</CssParameter> </Stroke> </PolygonSymbolizer> </Rule> </FeatureTypeStyle> </UserStyle> </NamedLayer></StyledLayerDescriptor>

PointSymbolizer

Un punto si può vestire con una forma nota (Mark, sono cerchio, quadrato, ecc.) o con un file esterno (png, gif, svg, ecc.)

Si sceglie quale geometria vestire.Il point symbolizer si applica a tutte le geometrie (viene trovato un punto adatto nel caso in cui non sia un punto semplice).

PointSymbolizer

Mark

• Un mark è una forma vettoriale che può essere riempita (Fill) e disegnata (Stroke)

• Lo standard prevede pochi mark di nome “ben noto”: square, circle, triangle, star,cross, x

• GeoServer permette di usare anche font TrueType come Wingdings come sorgenti di forme.

– <WellKnownName>ttf://<nomeFont>#<codiceCar>

• I programmatori possono estendere l'insieme noto creando mark propri (si veda “dynamic style objects” in GeoTools)

<?xml version="1.0" encoding="ISO-8859-1"?><StyledLayerDescriptor version="1.0.0" xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd"> <NamedLayer> <Name>Point</Name> <UserStyle> <FeatureTypeStyle> <Rule> <PointSymbolizer> <Graphic> <Mark> <WellKnownName>square</WellKnownName> <Fill> <CssParameter name="fill">#FF0000</CssParameter> </Fill> </Mark> <Size>6</Size> </Graphic> </PointSymbolizer> </Rule>

</FeatureTypeStyle> </UserStyle> </NamedLayer></StyledLayerDescriptor>

…<PointSymbolizer> <Graphic> <Mark> <WellKnownName>star</WellKnownName> <Fill> <CssParameter name="fill">#FFFF00</CssParameter> </Fill> <Stroke> <CssParameter name="stroke">#FF0000</CssParameter> <CssParameter name="stroke-width">2</CssParameter> </Stroke> </Mark> <Size>20</Size> </Graphic></PointSymbolizer>…

…<PointSymbolizer> <Graphic> <Mark> <WellKnownName>square</WellKnownName> <Stroke> <CssParameter name="stroke">#000000</CssParameter> <CssParameter name="stroke-width">2</CssParameter> </Stroke> </Mark> <Size>20</Size> <Rotation>45</Rotation> </Graphic></PointSymbolizer>…

ExternalGraphics

• Riferimento a un disegno esterno:– una immagine: png, gif, jpeg

– un file SVG (Scalable Vector Graphics) che si può produrre, ad esempio, con InkScape o con alcuni prodotti di Adobe

• Occorre specificare il MIME type dell'immagine:– image/png, image/gif, image/jpeg,

image/svg+xml

• L'immagine può essere collocata:– online, si fa riferimento con il suo URL

– sul disco, si fornisce il percorso assoluto

– nella cartella styles, si fornisce solo in nome

…<PointSymbolizer> <Graphic> <ExternalGraphic> <OnlineResource xlink:type="simple" xlink:href="flag.svg" /> <Format>image/svg+xml</Format> </ExternalGraphic> <Size> <ogc:Literal>20</ogc:Literal> </Size> </Graphic></PointSymbolizer>…

…<PointSymbolizer> <Graphic> <ExternalGraphic> <!-- avoid hot linking, this is just a sample --> <OnlineResource xlink:type="simple" xlink:href="http://www.google.com/mapfiles/marker.png" /> <Format>image/png</Format> </ExternalGraphic> </Graphic></PointSymbolizer>…

Graphic in PolygonSymbolizer

• Graphic può essere usato anche per specificare il contenuto di un Fill o di uno Stroke, ovvero:

– specificare uno riempimento mediante la ripetizione di un Mark o di un ExternalGraphics

– disegnare una linea ripetendo un Mark o un ExternalGraphics come uno stampino

• Al momento il Fill non funziona correttamente con i Mark, e lo Stroke ne con Mark ne con ExternalGraphic

…<PolygonSymbolizer> <Fill> <GraphicFill> <Graphic> <ExternalGraphic> <OnlineResource xlink:type="simple" xlink:href="grass_fill.png" /> <Format>image/png</Format> </ExternalGraphic> </Graphic> </GraphicFill> </Fill> <Stroke /></PolygonSymbolizer>…

Si applica a tutti i tipi di geometriaIl centroide viene scelto automaticamente

Da notare che l'etichetta può essere un attributo o il risultato di una espressione complessa (calcoli, concatenazioni di stringhe)

TextSymbolizer

<?xml version="1.0" encoding="ISO-8859-1"?><StyledLayerDescriptor version="1.0.0" … > <NamedLayer> <Name>Point</Name> <UserStyle> <FeatureTypeStyle> <Rule> <PointSymbolizer> <Graphic> <Mark> <WellKnownName>square</WellKnownName> <Fill/> </Mark> <Size>6</Size> </Graphic> </PointSymbolizer> <TextSymbolizer> <Label><ogc:PropertyName>NAME</ogc:PropertyName></Label> <Font> <CssParameter name="font-family">Arial</CssParameter> <CssParameter name="font-weight">bold</CssParameter> <CssParameter name="font-size">12</CssParameter> <CssParameter name="font-style">italic</CssParameter> </Font> </TextSymbolizer> </Rule>

</FeatureTypeStyle> </UserStyle> </NamedLayer></StyledLayerDescriptor>

Risoluzioneconflitti

<TextSymbolizer> <Label><ogc:PropertyName>NAME</ogc:PropertyName></Label> <Font> <CssParameter name="font-size">16</CssParameter> </Font> <LabelPlacement> <PointPlacement> <AnchorPoint> <AnchorPointX>0.5</AnchorPointX> <AnchorPointY>1</AnchorPointY> </AnchorPoint> </PointPlacement> </LabelPlacement></TextSymbolizer> ABCDEFG

0,0 1,0

1,10,1 0.5,1

0,0.5

<TextSymbolizer> <Label><ogc:PropertyName>NAME</ogc:PropertyName></Label> <Font> <CssParameter name="font-size">16</CssParameter> </Font> <LabelPlacement> <PointPlacement> <AnchorPoint> <AnchorPointX>0.5</AnchorPointX> <AnchorPointY>1</AnchorPointY> </AnchorPoint> <Displacement> <DisplacementX>0</DisplacementX> <DisplacementY>-10</DisplacementY> </Displacement> </PointPlacement> </LabelPlacement></TextSymbolizer>

<TextSymbolizer>… <LabelPlacement> <PointPlacement> <Displacement> <DisplacementX>5</DisplacementX> <DisplacementY>0</DisplacementY> </Displacement> <Rotation>-45</Rotation> </PointPlacement> </LabelPlacement></TextSymbolizer>

<TextSymbolizer> <Label><ogc:PropertyName>NAME</ogc:PropertyName></Label> <Font> <CssParameter name="font-family">Arial</CssParameter> <CssParameter name="font-size">12</CssParameter> <CssParameter name="font-weight">bold</CssParameter> </Font> <LabelPlacement> <PointPlacement> <Displacement> <DisplacementX>7</DisplacementX> <DisplacementY>0</DisplacementY> </Displacement> </PointPlacement> </LabelPlacement> <Halo> <Radius>2</Radius> <Fill><CssParameter name="fill">#000000</CssParameter></Fill> </Halo> <Fill><CssParameter name="fill">#FFFFFF</CssParameter></Fill></TextSymbolizer>

<TextSymbolizer> <Label> <ogc:PropertyName>STATE_ABBR</ogc:PropertyName> </Label> <Font> <CssParameter name="font-family">Arial</CssParameter> <CssParameter name="font-size">14</CssParameter> </Font> <LabelPlacement> <PointPlacement> <AnchorPoint> <AnchorPointX>0.5</AnchorPointX> <AnchorPointY>0.5</AnchorPointY> </AnchorPoint> </PointPlacement> </LabelPlacement></TextSymbolizer>

<TextSymbolizer> <Label> <ogc:PropertyName>TYPE</ogc:PropertyName> </Label> <Font> <CssParameter name="font-family">Arial</CssParameter> <CssParameter name="font-size">14</CssParameter> </Font> <LabelPlacement> <LinePlacement> <PerpendicularOffset>10</PerpendicularOffset> </LinePlacement> </LabelPlacement></TextSymbolizer>

<LineSymbolizer> <Stroke> <CssParameter name="stroke"> <ogc:Literal>#AA3333</ogc:Literal> </CssParameter> <CssParameter name="stroke-width"> <ogc:Literal>2</ogc:Literal> </CssParameter> </Stroke></LineSymbolizer><TextSymbolizer> <Label> <ogc:PropertyName>TYPE</ogc:PropertyName> </Label> <Font> <CssParameter name="font-family"> Arial </CssParameter> <CssParameter name="font-size"> 14 </CssParameter> </Font> <LabelPlacement> <LinePlacement/> </LabelPlacement> <Halo> <Radius>2</Radius> <Fill> <CssParameter name="fill"> #FFFFFF </CssParameter> </Fill> </Halo> <VendorOption name="followLine">true</VendorOption></TextSymbolizer>

Rule

• Un FeatureTypeStyle può contenere una o più Rule

• Ciascuna contiene symbolizers sottoposti a due condizioni

– livello di scala

– un filtro OGC

• La prima rule che aggancia una Feature la disegna

• E' possibile usare <ElseFilter/> per catturare tutte le feature non catturate dalle Rule precedenti

• Usi– carte tematiche (vestizione in funzione di

attributi)

– disegno di una sola parte dei dati disponibili

Uso per carte tematiche, esempio

• Abbiamo un campo Type che contiene il tipo di strada. Vogliamo evidenziare “highway” e “road” e disegnare tutte le altre strade nello stesso modo

– Type = “highway” → arancio, 4 px

– Type = “road” → nero, 1 px

– altrimenti → nero tratteggiato, 1px

• Si creano tre Rule, le prime due con un filtro, l'ultima con un ElseFilter, ciascuna con il proprio symbolizer

… <FeatureTypeStyle> <Rule> <ogc:Filter> <ogc:PropertyIsEqualTo> <ogc:PropertyName>TYPE</ogc:PropertyName> <ogc:Literal>highway</ogc:Literal> </ogc:PropertyIsEqualTo> </ogc:Filter> <LineSymbolizer> <Stroke> <CssParameter name="stroke">#F5B800</CssParameter> <CssParameter name="stroke-width">4</CssParameter> </Stroke> </LineSymbolizer> </Rule> <Rule> <ogc:Filter> <ogc:PropertyIsEqualTo> <ogc:PropertyName>TYPE</ogc:PropertyName> <ogc:Literal>road</ogc:Literal> </ogc:PropertyIsEqualTo> </ogc:Filter> <LineSymbolizer> <Stroke> <CssParameter name="stroke-width">2</CssParameter> </Stroke> </LineSymbolizer> </Rule> <Rule> <ElseFilter/> <LineSymbolizer> <Stroke> <CssParameter name="stroke-width">2</CssParameter> <CssParameter name="stroke-dasharray">5 5</CssParameter> </Stroke> </LineSymbolizer> </Rule> </FeatureTypeStyle> …

Rendering relativo alla scala

• Può essere usato in vari modi– per non visualizzare un layer quando si è a scala

troppo bassa (evitare di disegnare troppe Feature)

– per visualizzare solo parte di un layer molto ampio a bassa scala, e tutto il disponibile a scala più elevata (prima solo le autostrade, poi tutto)

– per cambiare la vestizione e l'etichettatura passando a vestizioni più dispendiose ma più gradevoli man mano che si procede nella esplorazione della mappa

… <Rule> <MinScaleDenominator>40000000</MinScaleDenominator> <LineSymbolizer> <Stroke /> </LineSymbolizer> <TextSymbolizer> <Label> <ogc:PropertyName>STATE_ABBR</ogc:PropertyName> </Label>

</TextSymbolizer> </Rule> <Rule> <MaxScaleDenominator>40000000</MaxScaleDenominator> <LineSymbolizer> <Stroke /> </LineSymbolizer> <TextSymbolizer> <Label> <ogc:PropertyName>STATE_NAME</ogc:PropertyName> </Label>

</TextSymbolizer> </Rule> …

1:49M

1:25M

sld/rules/stateslabel.xml

FeatureTypeStyle

• Raccoglie le rule relative a un certo FeatureType

• Ma può essere ripetuta più volte per lo stesso layer

• Ha l'effetto di creare layer trasparenti, impone ordine nel disegno delle Feature

autostrade, linea spessa

autostrade, linea sottile

altre strade

<?xml version="1.0" encoding="ISO-8859-1"?><StyledLayerDescriptor version="1.0.0" … > <NamedLayer> <Name>Highways1</Name> <UserStyle> <FeatureTypeStyle> <Rule> <LineSymbolizer> <Stroke> <CssParameter name="stroke">#F5B800</CssParameter> <CssParameter name="stroke-width">8</CssParameter> <CssParameter name="stroke-linejoin">round</CssParameter> <CssParameter name="stroke-linecap">round</CssParameter> </Stroke> </LineSymbolizer> <LineSymbolizer> <Stroke> <CssParameter name="stroke">#FFFF00</CssParameter> <CssParameter name="stroke-width">4</CssParameter> <CssParameter name="stroke-linejoin">round</CssParameter> <CssParameter name="stroke-linecap">round</CssParameter> </Stroke> </LineSymbolizer> </Rule> </FeatureTypeStyle> </UserStyle> </NamedLayer></StyledLayerDescriptor>

<?xml version="1.0" encoding="ISO-8859-1"?><StyledLayerDescriptor version="1.0.0" … > <NamedLayer> <Name>Highways1</Name> <UserStyle> <FeatureTypeStyle> <Rule> <LineSymbolizer> <Stroke> <CssParameter name="stroke">#F5B800</CssParameter> <CssParameter name="stroke-width">8</CssParameter> <CssParameter name="stroke-linejoin">round</CssParameter> <CssParameter name="stroke-linecap">round</CssParameter> </Stroke> </LineSymbolizer> </Rule> </FeatureTypeStyle> <FeatureTypeStyle> <Rule> <LineSymbolizer> <Stroke> <CssParameter name="stroke">#FFFF00</CssParameter> <CssParameter name="stroke-width">4</CssParameter> <CssParameter name="stroke-linejoin">round</CssParameter> <CssParameter name="stroke-linecap">round</CssParameter> </Stroke> </LineSymbolizer> </Rule> </FeatureTypeStyle> </UserStyle> </NamedLayer></StyledLayerDescriptor>

Esempio carta tematica

• Quante e quali rule?

• Quanti e quali feature type style?

• Quali symbolizer?

Altro esempio, dipendenze da scala

• Quante rule?

• Quanti feature type style?

• Quali symbolizer?

Web Feature Service,transactional WFS

WFS Transactional

• Transactional WFS significa poter:– Aggiungere

– Cancellare

– Modificare

• Attributi:– geometrici

– non geometrici

• La modifica può essere effettuata su singole Feature, o in massa, un filtro decide quali Feature vengono coinvolte

• Si possono modificare più FeatureType in una singola operazione

Generalità

• Inserimento, modifica, cancellazione (combinate anche nella stessa chiamata)

• Proprietà ACID:– Atomicity: verificata su qualunque data store,

anche sugli shapefile

– Consistency: verifica dei vincoli di integrità, quando presenti. Si può attivare un validatore di Feature configurabile!

– Isolation: in funzione di come è configurato il server DBMS (di norma, il livello di isolamento è read-committed)

– Durability: in funzione di quale store è stato scelto (non c'è un log delle transazioni per gli shapefile).

Limitazioni/problematiche

• L'operazione Transaction è tassativamente– espressa in GML

– effettuata come richiesta di tipo POST

• E' necessario disporre di una chiave primaria sulle tabelle di database (il FeatureID deve essere stabile), possibilmente di tipo “auto-incremento”

• Le proprietà ACID sono garantite solo se i backend sono database, e solo se tutti i feature type sono nello stesso database

• Per default GeoServer pubblica tutti i layer in modalità read/write, bisogna agire sul sottostema di sicurezza per limitare la scrittura di alcuni layer, o disabilitare WFS Transaction del tutto

TransactionalWFS

11

22

33

Transactional WFS, chiamate

roads.shp

Geo

Serv

e rG

eoS

erve r

uD

igu

Dig

GetFeature

Transaction

GetFeature

<wfs:Transaction service="WFS" version="1.0.0" ...> <wfs:Insert> <topp:tasmania_roads> <topp:the_geom> <gml:MultiLineString srsName="EPSG:4326"> <gml:lineStringMember> <gml:LineString> <gml:coordinates decimal="." cs="," ts=" "> 494475,5433016 494982,5435041 </gml:coordinates> </gml:LineString> </gml:lineStringMember> </gml:MultiLineString> </topp:the_geom> <topp:TYPE>alley</topp:TYPE> </topp:tasmania_roads> </wfs:Insert></wfs:Transaction>

<?xml version="1.0" encoding="UTF-8"?><wfs:WFS_TransactionResponse version="1.0.0" … > <wfs:InsertResult> <ogc:FeatureId fid="new0" /> </wfs:InsertResult> <wfs:TransactionResult> <wfs:Status> <wfs:SUCCESS /> </wfs:Status> </wfs:TransactionResult></wfs:WFS_TransactionResponse>

RICHIESTA

RISPOSTA

INSERT

<wfs:Transaction service="WFS" version="1.0.0" … > <wfs:Update typeName="topp:tasmania_roads"> <wfs:Property> <wfs:Name>TYPE</wfs:Name> <wfs:Value>street</wfs:Value> </wfs:Property> <ogc:Filter> <ogc:FeatureId fid="tasmania_roads.1" /> </ogc:Filter> </wfs:Update></wfs:Transaction> RICHIESTA

RISPOSTA

UPDATE

<?xml version="1.0" encoding="UTF-8"?><wfs:WFS_TransactionResponse version="1.0.0" … > <wfs:TransactionResult> <wfs:Status> <wfs:SUCCESS /> </wfs:Status> </wfs:TransactionResult></wfs:WFS_TransactionResponse>

Modifica attributo non geometrico

Filtra per identificativo

RICHIESTA

RISPOSTA

DELETE<wfs:Transaction service="WFS" version="1.0.0" xmlns:cdf="http://www.opengis.net/cite/data" xmlns:ogc="http://www.opengis.net/ogc" xmlns:wfs="http://www.opengis.net/wfs" xmlns:topp="http://www.openplans.org/topp"> <wfs:Delete typeName="topp:tasmania_roads"> <ogc:Filter> <ogc:PropertyIsEqualTo> <ogc:PropertyName>topp:TYPE</ogc:PropertyName> <ogc:Literal>alley</ogc:Literal> </ogc:PropertyIsEqualTo> </ogc:Filter> </wfs:Delete></wfs:Transaction>

<?xml version="1.0" encoding="UTF-8"?><wfs:WFS_TransactionResponse version="1.0.0" … > <wfs:InsertResult> <ogc:FeatureId fid="none" /> </wfs:InsertResult> <wfs:TransactionResult> <wfs:Status> <wfs:SUCCESS /> </wfs:Status> </wfs:TransactionResult></wfs:WFS_TransactionResponse>

Dati rasterin GeoServer

Andrea Aime, Simone Giannecchini

www.geo-solutions.it

www.geoserver.org

Struttura e nomenclatura

• I dati raster nel mondo OGC vengono detti coverage

• GeoServer supporta dati raster in vari formati e varie strutture

• Come per i vettoriali:– abbiamo CoverageStore e Coverage (rapporto 1-

1)

– un sistema di riferimento, area coperta

– uno stile di default

• Come per il vettorali, due servizi– WMS per il rendering

– WCS per ritornare direttamente una porzione di raster (analogo a WFS)

Formati supportati

• Nell'installazione standard

– ArcGrid (puro testo, pixel quadrati, semplice, lento)

– GTOPO30 (binario, esempio di formato DEM)

– Immagini + world file + prj

– GeoTiff

– Mosaico di immagini• Con le estensioni GDAL

– MrSID, JPEG2000 (con librerie MrSID)

– DTED, Erdas, Ehdr, NITF

– .... e ECW?

Il caso ECW

• Se il gruppo di sviluppo distribuisse le librerie ECW sarebbe perseguibile per violazione della licenza

• Le librerie ECW sono un prodotto commerciale, per utilizzarle liberamente in un prodotto di classe server occorre pagare una licenza

• E' possibile scaricare l'image SDK di ER-Mapper per effettuare valutazioni personali, ma non è possibile redistribuirlo

• Gli sviluppatori sono al lavoro per trovare un compromesso: il supporto ECW si attiva solo se l'utente aggiunge di persona le librerie ECW

• Questo sposta la responsabilità legale sulle spalle dell'utente

Bande

• Mono banda o multi banda

Singola banda.Caso tipo, la misura di

un fenomeno nello spazio(quota, concentrazioni,

temperature, ecc.)

Multi bandaCasi tipo, immagini nel campo

del visibile (RGB o RBGA)o immagini satellitari multispetralli

Compressione

• Alcuni formati supportano la compressione

• Ad esempio, JPEG, PNG + word file

• O il GeoTiff

• La compressione riduce lo spazio usato dal file anche notevolmente, ma lo spazio guadagnato si paga in termini di prestazioni

• Per i JPEG o i PNG tutto il file deve essere letto per poterne disegnare anche solo una parte

• Per i GeoTiff... dipende dal tiling

Compressione wavelet

• ECW, MrSID e JPEG2000 usano metodi matematici di compressione basati sulle wavelet

• Garantiscono elevati fattori di compressione (10 volte meglio di un GeoTIFF)

• Possono essere lossless or meno

• A seconda della implementazione possono garantire anche prestazioni molto elevate, in particolare permettono estrazione di porzioni di immagini o di risoluzioni intermedie a elevata velocità

• Ma... le librerie a elevate prestazioni sono tutte commerciali, ErMapper per ECW (formato proprietario) e Kakadu per JPEG2000 (formato aperto)

Tiling e overview

• Quando il raster è di grande volume (da centinaia di MB fino a decine di GB) si presentano due seri problemi

– accedere efficientemente a un sottoinsieme delle celle del raster

– visualizzare il raster a scala ridotta senza doverlo leggere tutto

• Tiling → la struttura fisica del raster è spezzata in mattonelle cui si può accedere velocemente

• Overview → il file contiene non solo il raster a risoluzione nativa, ma anche copie a risoluzione ridotta, spesso con dimensioni del pixel che variano con le potenze di due

Accesso a una porzione di celle in un raster tiled

Accesso alla overview con la risoluzione più simile per disegnare il raster a una scala inferiore alla nativa.Quando le overview sono a loro volta tiled, si parla di “piramide”

GeoTiff

• GeoTIFF è un file TIFF con specifiche informazioni geografiche incluse nell'intestazione

– proiezione

– trasformazione image to world (da riga/colonna a x/y reali)

• Un GeoTiff può avere le più varie strutture interne– può essere compresso jpeg senza tiling →

equivalente 1-1 a un jpeg

– può essere tiled, le tile possono essere o meno compresse (vari tipi di compressione)

– può o meno essere dotato di overview

GDAL Utilities

• Insieme di utility a linea di comando per manipolare dati raster e vettoriali

• Open Source

• Supporta decine di formati

• In particolare siamo interessati ai comandi:– gdalinfo: informazioni sulla struttura di un file

raster

– gdal_translate: conversione di formato o modifiche alla struttura

– gdaladdo: aggiunta di overview a un file che non ne sia dotato

gdalinfo http://www.gdal.org/gdalinfo.html

gdalinfo merano.jpg

Driver: JPEG/JPEG JFIFFiles: merano.jpgSize is 6800, 5950Coordinate System is `'Origin = (663991.685767726740000,5172880.986841850000000)Pixel Size = (0.100000000000000,-0.100000000000000)Image Structure Metadata: SOURCE_COLOR_SPACE=YCbCr INTERLEAVE=PIXEL COMPRESSION=JPEGCorner Coordinates:Upper Left ( 663991.686, 5172880.987)Lower Left ( 663991.686, 5172285.987)Upper Right ( 664671.686, 5172880.987)Lower Right ( 664671.686, 5172285.987)Center ( 664331.686, 5172583.487)Band 1 Block=6800x1 Type=Byte, ColorInterp=Red Image Structure Metadata: COMPRESSION=JPEGBand 2 Block=6800x1 Type=Byte, ColorInterp=Green Image Structure Metadata: COMPRESSION=JPEGBand 3 Block=6800x1 Type=Byte, ColorInterp=Blue Image Structure Metadata: COMPRESSION=JPEG

No SRS!

Tre bande

gdalinfo usaNaturalEarth.tif

Driver: GTiff/GeoTIFFFiles: usaNaturalEarth.tifSize is 18458, 9341Coordinate System is:GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.2572235630016, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich",0], UNIT["degree",0.0174532925199433], AUTHORITY["EPSG","4326"]]Origin = (-135.002248347599960,57.002248153302645)Pixel Size = (0.004496695199910,-0.004496306605290)Metadata: AREA_OR_POINT=Area TIFFTAG_SOFTWARE=Adobe Photoshop CS Macintosh TIFFTAG_DATETIME=2005:09:07 14:07:19 TIFFTAG_XRESOLUTION=72 TIFFTAG_YRESOLUTION=72 TIFFTAG_RESOLUTIONUNIT=2 (pixels/inch)Image Structure Metadata: INTERLEAVE=BANDCorner Coordinates:Upper Left (-135.0022483, 57.0022482) (135d 0'8.09"W, 57d 0'8.09"N)Lower Left (-135.0022483, 15.0022482) (135d 0'8.09"W, 15d 0'8.09"N)Upper Right ( -52.0022483, 57.0022482) ( 52d 0'8.09"W, 57d 0'8.09"N)Lower Right ( -52.0022483, 15.0022482) ( 52d 0'8.09"W, 15d 0'8.09"N)Center ( -93.5022483, 36.0022482) ( 93d30'8.09"W, 36d 0'8.09"N)Band 1 Block=256x256 Type=Byte, ColorInterp=Red Overviews: 4615x2336, 2308x1168, 1154x584, 577x292, 289x146Band 2 Block=256x256 Type=Byte, ColorInterp=Green Overviews: 4615x2336, 2308x1168, 1154x584, 577x292, 289x146Band 3 Block=256x256 Type=Byte, ColorInterp=Blue Overviews: 4615x2336, 2308x1168, 1154x584, 577x292, 289x146

WGS84

Overview,tile 256x256

gdal_translate http://www.gdal.org/gdal_translate.html

• Trasformazione di formato, struttura, metadati, estrazione sottoinsiemi di dati

• Alcune opzioni dipendono dal formato, ad esempio: http://www.gdal.org/frmt_gtiff.html (creation options)

gdal_translate -a_srs EPSG:32632 -co "TILED=YES" -co "COMPRESS=JPEG" -co "JPEG_QUALITY=90" merano.jpg merano.tiffInput file size is 6800, 59500...10...20...30...40...50...60....

UTM 32N

Tile compresse

gdaladdo http://www.gdal.org/gdaladdo.html

• Aggiunta di overview a file che le supportano (o overview esterne per altri tipi di file)

gdaladdo -r gauss --config COMPRESS_OVERVIEW JPEG merano.tiff 2 4 8 16 32 64

Algoritmo di riduzione

Compressionedelle overview

Risoluzioni delleoverview → 1/2, 1/4, ...

Raster symbolizer

• Consente di:– attivare la visualizzazione dei raster

– applicare una scala colori a immagini mono-banda

– aumentare il contrasto di immagini in scala di grigi

DataSource: intero GTOPO30 in singolo file, JPEG2000 lossless166.392x21.587 pixels, 386MB(ftp://ftp.microimages.com/pub/outgoing/data/jp2/)

Supporto KMLGeoServer

Andrea Aime, Simone Giannecchini

www.geo-solutions.it

www.geoserver.org

Keyhole Markup Language

• Un dialetto XML promosso da Google e recentemente diventato standard OGC (KML 2.2)

• Un formato che a differenza di GML mescola nella stessa struttura xml:

– geometrie e attributi

– stili (piatti, con riferimenti a modelli 3D, o immagini piatte)

– annotazioni HTML

– specifiche temporali e di estrusione

• KML viene letto sia da Google Maps che da Google Earth, oltre che da un crescente numero di altri prodotti

Documento KML minimo

<?xml version="1.0" encoding="UTF-8"?><kml xmlns="http://www.opengis.net/kml/2.2"> <Placemark> <name>Hello, Earth</name> <description>Here's where we developed Google Earth!</description> <Point> <coordinates>-122.084583,37.42227,0</coordinates> </Point> </Placemark></kml>

Svariate possibilità

• Il KML può essere compresso per ridurne la dimensione. Si parla di KMZ in questo caso

• Il KML può essere– un lungo documento piatto (flat/dump)

– può puntare direttamente a immagini WMS (senza vettoriali)

– può alternare i due schemi di cui sopra a seconda della scala

– può usare una struttura gerarchica in cui ogni mattonella viene caricata solo quando viene raggiunto un certo livello di zoom (questo è il modo usato da Google Stessa) → SuperOverlay

SuperOverlay

• Si assegnano regioni di spazio collegate fra loro

• Ogni regione si attiva da un certo livello di zoom in poi, ed è collegata a sottoregioni che si attivano a livelli di zoom inferiori (e così via)

• I dati vengono caricati un po' alla volta mentre si effettua lo zoom

Esempio super-overlay

• Come si condivide un dataset di centinaia di MB?

• Un pezzo alla volta!

• GE carica ogni regione del SuperOverlay con una richiesta separata

Relazione con lo zoom

Da lontano solo gli edificipiù “importanti” sono visualizzati

Supporto KML in GeoServer

GeoServerGeoServer

Dativettorialie raster

---------------------------------------

---------------------------------------

---------------------------------------

---------------------------------------

---------------------------------------

---------------------------------------

Stili (SLD)

---------------------------------------

---------------------------------------

---------------------------------------

Template(personalizzazione output)

KML

Hmmm...dove ho già vistoquesto diagramma?

In particolare...

• GeoServer usa l'SLD per decidere come disegnare le Feature (output simile a WMS)

• Per i vettoriali:– Usa un template FreeMarker per determinare

name e description

– Crea al volo un SuperOverlay basandosi su un attributo della Feature per determinare le feature più importanti (per default, la dimensione della geometria)

• Per i raster:– crea un SuperOverlay che chiede a GeoServer di

disegnare le tile di una piramide man mano che si effettuano gli zoom

Esempi

• Nessuna personalizzazione dei template

• Non è presente un titolo

• La descrizione è un semplice elenco degli attributi con il Feature ID

• Personalizzazione con template Freemarker

• Il nome viene preso dagli attributi

• La descrizione mette in narrativa alcuni altri attributi, e viene creato un collegamento a una immagine esterna

Web Processing Service

Andrea Aime, Simone Giannecchini

www.geo-solutions.it

www.geoserver.org

Web Processing Service

• Protocollo per l'analisi spaziale

• Al contrario di WFS/WMS non pubblica dati, ma algoritmi (di analisi spaziale) detti Processi

• Gli input possono essere caricati da remoto o essere presenti in locale

• I processi in GeoServer possono manipolare i dati di ingresso a una mappa (rendering transformation)

• Alcune chiamate possono richiedere molto tempo: supporto per richieste asincrone

Dativettoriali

Catalogoprocessi,capacità analitiche del server

Descrizione input e output processo

Esecuzione e scarico risultati

GeoServerGeoServerWPSWPS

GetCapabilities

DescribeProcess

Execute

Datiraster

WCSremoto

WFSremoto

ServerHTTP

WMSWMS

WPSWPS

Tutti i layer di Tutti i layer di GeoServerGeoServer

Interfaccia utente

GeoServer

Client WPS

Client WMS

GetCapabilities

Elenco processi con nome e titolo

DescribeProcess

http://localhost:8080/geoserver/ows?service=wps&version=1.0.0&request=DescribeProcess&identifier=JTS:buffer

Execute<?xml version="1.0" encoding="UTF-8"?><wps:Execute version="1.0.0" service="WPS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.opengis.net/wps/1.0.0" xmlns:wfs="http://www.opengis.net/wfs" xmlns:wps="http://www.opengis.net/wps/1.0.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:wcs="http://www.opengis.net/wcs/1.1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 ..."> <ows:Identifier>JTS:buffer</ows:Identifier> <wps:DataInputs> <wps:Input> <ows:Identifier>geom</ows:Identifier> <wps:Data> <wps:ComplexData mimeType="text/xml; subtype=gml/3.1.1"> <gml:LineString> <gml:posList>0.0 0.0 10.0 0.0 10.0 10.0</gml:posList> </gml:LineString> </wps:ComplexData> </wps:Data> </wps:Input> <wps:Input> <ows:Identifier>distance</ows:Identifier> <wps:Data> <wps:LiteralData>2</wps:LiteralData> </wps:Data> </wps:Input> </wps:DataInputs> <wps:ResponseForm> <wps:RawDataOutput mimeType="text/xml; subtype=gml/3.1.1"> <ows:Identifier>result</ows:Identifier> </wps:RawDataOutput> </wps:ResponseForm></wps:Execute>

Execute<?xml version="1.0" encoding="UTF-8"?><gml:Polygon xmlns:sch="http://www.ascc.net/xml/schematron" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" srsDimension="2"> <gml:exterior> <gml:LinearRing srsDimension="2"> <gml:posList> 8.0 2.0 8.0 10.0 8.03842943919354 10.390180644032258 8.152240934977426 10.76536686473018 8.33706077539491 11.111140466039204 8.585786437626904 11.414213562373096 8.888859533960796 11.66293922460509 9.23463313526982 11.847759065022574 9.609819355967744 11.96157056080646 10.0 12.0 10.390180644032256 11.96157056080646 10.76536686473018 11.847759065022574 11.111140466039204 11.66293922460509 11.414213562373096 11.414213562373096 11.66293922460509 11.111140466039204 11.847759065022574 10.76536686473018 11.96157056080646 10.390180644032256 12.0 10.0 12.0 0.0 11.96157056080646 -0.3901806440322565 11.847759065022574 -0.7653668647301796 11.66293922460509 -1.1111404660392044 11.414213562373096 -1.414213562373095 11.111140466039204 -1.6629392246050905 10.76536686473018 -1.8477590650225735 10.390180644032256 -1.9615705608064609 10.0 -2.0 0.0 -2.0 -0.39018064403225733 -1.9615705608064606 -0.7653668647301807 -1.847759065022573 -1.1111404660392044 -1.6629392246050905 -1.4142135623730954 -1.414213562373095 -1.662939224605091 -1.111140466039204 -1.8477590650225737 -0.7653668647301793 -1.9615705608064609 -0.3901806440322567 -2.0 2.4492935982947064E-16 -1.9615705608064609 0.3901806440322572 -1.8477590650225735 0.7653668647301798 -1.6629392246050907 1.1111404660392044 -1.414213562373095 1.4142135623730951 -1.111140466039204 1.6629392246050907 -0.7653668647301786 1.847759065022574 -0.3901806440322551 1.961570560806461 0.0 2.0 8.0 2.0 </gml:posList> </gml:LinearRing> </gml:exterior></gml:Polygon>

Estrazione isolinee

Frecce del vento<StyledLayerDescriptor version="1.0.0" xmlns="http://www.opengis.net/sld" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/sld ./StyledLayerDescriptor.xsd"> <NamedLayer> <Name>Wind</Name> <UserStyle> <Title>Wind</Title> <FeatureTypeStyle> <Transformation>

<ogc:Function name="gs:RasterAsPointCollection"> <ogc:Function name="parameter"> <ogc:Literal>data</ogc:Literal> </ogc:Function> </ogc:Function> </Transformation> <Rule> <PointSymbolizer> <Graphic> <Mark> <WellKnownName>

windbarbs://default(ogc:PropertyName>speed</ogc:PropertyName>)[m/s] </WellKnownName> <Stroke> <CssParameter name="stroke">#000000</CssParameter> <CssParameter name="stroke-width">1</CssParameter> </Stroke> <Fill> <CssParameter name="fill"> <ogc:Literal>#f5ffff</ogc:Literal> </CssParameter> </Fill> </Mark> <Size>8</Size> <Rotation> <ogc:PropertyName>direction</ogc:PropertyName> </Rotation> </Graphic> </PointSymbolizer> </Rule> </FeatureTypeStyle> </UserStyle> </NamedLayer></StyledLayerDescriptor>