Post on 07-Jul-2015
description
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&FORMAT=image/png &WIDTH=20&HEIGHT=20&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>