Geoserver, protocollo WMS - laboratorio di...
Transcript of Geoserver, protocollo WMS - laboratorio di...
Geoserver, protocollo WMS
Como 22/01/2007Geoserver, un server OpenSDI a standard OGC
Andrea Aime
Geoserver lead developerThe Open Planning Project
2
WMS, Web Map Service
Protocollo per la creazione di mappe a standard OGC
Abbiamo una idea di layer e di stile, ma non è noto cosa siano internamenteNel caso di Geosever, un layer è un feature type WFS o una coverage WCSLo stile è sempre una descrizione in SLD (Styled Layer Descriptor)
Supportato il protocollo WMS 1.1.1, ma non l'1.3 (non è prevista una sua realizzazione).CITE compliant
3
WMS, operazioni
GetCapabilities
GetMapGetFeatureInfo
GetLegendGraphicDescribeLayerGetStyle
PutStyle
WMS
Estensioni SLD a WMS
WMS
5
WMS GetCapabilities
E' analoga alle GetCapabilities di WFS e WCS
La risposta elenca I soliti metadati sul serverLe chiamate supportateL'elenco dei layer, con lo stile di default e l'elenco dei sistemi di riferimento in cui possono essere restituiti
La parte relativa ai layer è interessante per quanto riguarda i sistemi di riferimentoL'elenco dei layer è gerarchico, si può definire un layer padre astratto che contiene definizioni comuni ai layer figli
Geoserver usa questa capacità per fornire una sola volta il lungo elenco di SRS supportati
6
WMS GetCapabilities, i layer<Layer> <Title>My GeoServer WMS</Title> <Abstract>This is a description of your Web Map Server.</Abstract> <!--common SRS:--> <SRS>EPSG:4326</SRS> <!--All supported EPSG projections:--> <SRS>EPSG::2000</SRS> <!-- altri 3000 e più SRS... --> <SRS>EPSG::69036405</SRS> <LatLonBoundingBox minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0" /> <Layer queryable="1"> <Name>topp:tasmania_roads</Name> <Title>tasmania_roads_Type</Title> ... <SRS>EPSG:4326</SRS> <!-- WKT definition of this CRS: GEOGCS["WGS 84", DATUM["World Geodetic System 1984", SPHEROID["WGS 84", 6378137.0, 298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich", 0.0, AUTHORITY["EPSG","8901"]], UNIT["degree", 0.017453292519943295], AXIS["Geodetic longitude", EAST], AXIS["Geodetic latitude", NORTH], AUTHORITY["EPSG","4326"]]--> <LatLonBoundingBox minx="145.19754" miny="-43.423512" maxx="148.27298000000002" maxy="-40.852802" /> <BoundingBox SRS="EPSG:4326" minx="145.19754" miny="-43.423512" maxx="148.27298000000002" maxy="-40.852802" /> <Style> ... </Style> </Layer>
Layer generale
Singolo layer
7
WMS GetCapabilities, time and dimension
La specifica WMS permette di allegare “dimensioni” ai layer, in modo da poter estrarre una specifica vista“Time” viene usata per layer di cui si dispongono varie versioni, valide in diversi istanti temporali“Elevation” consente invece di accedere allo stesso layer “affettato” su una certa quota (da voxel a semplice raster, ad esempio)
Geoserver non supporta queste estensioni al momento, probabilmente verranno aggiunte nella versione 1.6.x
8
WMS GetMap
Permette di ottenere una mappa specificando nella chiamata:
Un elenco di layer da visualizzareUn elenco di stili (può essere vuoto per adottare gli stili di defalt)L'area da visualizzareLa dimensione dell'immagineIl formato di immagine restituitoIl colore di sfondo, l'eventuale trasparenza dell'immagine
Lo standard base richiede di supportare le richieste di tipo GET, Geoserver ha una estensione che consente di usare anche POST (per richieste molto lunghe/complesse)
9
GetMap, esempio
http://localhost:8080/geoserver/wms?&request=GetMap&bbox=-130,24,-66,50&layers=topp:states&styles=population&Format=image/png&width=550&height=250
10
GetMap, esempio 2
http://localhost:8080/geoserver/wms?request=GetMap&layers=tiger:poly_landmarks,tiger:tiger_roads,tiger:poi&bbox=-74.01,40.70,-73.98,40.73&format=image/png&width=800&height=800&srs=EPSG:4326
Antialiasing
Risoluzione conflitti etichette
11
GetMap, formati supportati
Dal documento GetCapabilities di Geoserver 1.5.x (in blu le novità non presenti in 1.4.0):
image/jpegimage/png (png 24 bit)image/gifimage/tiff
image/geotiff
image/svg+xmlapplication/pdf
application/vnd.google-earth.kml+xmlapplication/vnd.google-earth.kmz
Raster classici
Raster georeferenziati
Vettoriali
Google Earth
12
GetFeatureInfo
Permette di realizzare un tool “info”, ovvero sapere cosa c'é in un determinato punto e quali sono le sue proprietà
Si possono interrogare solo i layer con queryable=”true” nella risposta di GetCapabilities
Vari formati di uscita, puro testo e un HTML fissoI layer di tipo raster al momento non sono interrogabiliNella prossima release (1.6) aggiungeremo un sistema di templating per consentire di ottenere output ad hoc per la propria applicazione
13
GetFeatureInfo, esempio
http://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--------------------------------------------
SLD, Styled Layer Descriptor
15
SLD, Styled Layer Descriptor
SLD è una sofisticata specifica OGC per la vestizione di layer vettoriali e rasterE' molto flessibile, anche se nella sua generalità risulta di difficile comprensione e non ha sintassi semplificate per i tipi di rendering più comuni
Una volta presa padronanza dello strumento si possono realizzare styling piuttosto sofisticatiSi tratta di documenti XML, dove vengono riusate sia le specifiche GML che le specifiche Filter
16
SLD schema, UserStyle, FeatureTypeStyle, Rule
Un foglio di stile definisce stili per diversi FeatureType
Ogni regola descrive come vestire le Feature che soddisfano un certo filtro OGC, in un certo intervallo di scale
Ogni FeatureType viene vestitoapplicando in sequenza una o più regole
Il Symbolizer contiene le informazioni di vestizione
17
SLD schema, line symbolizer
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)
18
SLD schema, polygon symbolizer
Si applica solo a tipi poligonali (polygon, multipolyon, ring)
19
SLD schema, point symbolizer
Un punto si può vestire con una forma nota (Mark, sono cerchio, quadrato, ecc.) o con un file esterno (png, gif, svg, ecc.)
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).
20
SLD schema, text symbolizer
Si applica a tutti i tipi di geometriaIl centroide viene scelto automaticamenteAbbiamo un semplice algoritmo di risoluzione dei conflitti (il primo vince)
Da notare che l'etichetta può essere un attributo o il risultato di una espressione complessa (calcoli, concatenazioni di stringhe)
21
SLD Schema, Raster symbolizer
Specifica piuttosto riccaAl momento Geoserver supporta color map e opacity
22
Come creare file SLD
SLD è potente, ma allo stesso tempo, è una giungla...
Per crearlo si possono adottare varie strategie:Usare un editor SLD capace di creare gli stili più comuni. Udig ne possiede uno.Usare un editor XML con supporto per XML schema, in grado di creare uno scheletro di partenza e di auto-completare il codicePartire da esempi già fatti e effettuare piccole modifiche
23
Esempi SLD, linea semplice
<?xml version="1.0" encoding="ISO-8859-1"?><StyledLayerDescriptor version="1.0.0" xsi:schemaLocation="http://www.opengis.net/sld StyledLayerDescriptor.xsd" 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"> <NamedLayer> <Name>Default Line</Name> <UserStyle> <FeatureTypeStyle> <Rule> <LineSymbolizer> <Stroke> <CssParameter name="stroke">#AA3333</CssParameter> <CssParameter name="stroke-width">2</CssParameter> </Stroke> </LineSymbolizer> </Rule> </FeatureTypeStyle> </UserStyle> </NamedLayer></StyledLayerDescriptor>Una semplice linea, colore definito come in HTML, spessore 2.Si applica a qualunque feature type, poiché non abbiamo specificato un nome di feature type.Un color chooser online: http://www.december.com/html/spec/colorchooser.html
24
Esempi SLD, con etichette
...<FeatureTypeStyle> <Rule> <LineSymbolizer> <Stroke> <CssParameter name="stroke">#50B050</CssParameter> <CssParameter name="stroke-width">2</CssParameter> </Stroke> </LineSymbolizer> <TextSymbolizer> <Label> <ogc:PropertyName>TYPE</ogc:PropertyName> </Label> <Font> <CssParameter name="font-family">Times New Roman</CssParameter> <CssParameter name="font-size">16</CssParameter> <CssParameter name="font-weight">bold</CssParameter> </Font> <LabelPlacement> <LinePlacement> <PerpendicularOffset>5</PerpendicularOffset> </LinePlacement> </LabelPlacement> </TextSymbolizer> </Rule></FeatureTypeStyle>....
25
Esempi SLD, con filtri
<FeatureTypeStyle> <!-- Rule 1 --> <Rule> <ogc:Filter> <ogc:Not> <ogc:PropertyIsEqualTo> <ogc:PropertyName>TYPE</ogc:PropertyName> <ogc:Literal>highway</ogc:Literal> </ogc:PropertyIsEqualTo> </ogc:Not> </ogc:Filter> <LineSymbolizer> <Stroke> <CssParameter name="stroke">#50B050</CssParameter> <CssParameter name="stroke-width">2</CssParameter> </Stroke> </LineSymbolizer> <TextSymbolizer> <Label> <ogc:PropertyName>TYPE</ogc:PropertyName> </Label> <Font> <CssParameter name="font-family">Times New Roman</CssParameter> <CssParameter name="font-size">12</CssParameter> <CssParameter name="font-weight">bold</CssParameter> </Font> </TextSymbolizer> </Rule> .... continua --->
26
Esempi SLD, con filtri, 2
<Rule> <ogc:Filter> <ogc:PropertyIsEqualTo> <ogc:PropertyName>TYPE</ogc:PropertyName> <ogc:Literal>highway</ogc:Literal> </ogc:PropertyIsEqualTo> </ogc:Filter> <LineSymbolizer> <Stroke> <CssParameter name="stroke">#444444</CssParameter> <CssParameter name="stroke-width">8</CssParameter> <CssParameter name="stroke-linecap">round</CssParameter> </Stroke> </LineSymbolizer> <LineSymbolizer> <Stroke> <CssParameter name="stroke">#999999</CssParameter> <CssParameter name="stroke-width">4</CssParameter> <CssParameter name="stroke-linecap">round</CssParameter> </Stroke> </LineSymbolizer> ... continua -->
27
Esempi SLD, con filtri, 3
<TextSymbolizer> <Label> <ogc:PropertyName>TYPE</ogc:PropertyName> </Label> <Font> <CssParameter name="font-family">Times New Roman</CssParameter> <CssParameter name="font-size">18</CssParameter> <CssParameter name="font-weight">bold</CssParameter> </Font> <Halo> <Radius> <ogc:Literal>2</ogc:Literal> </Radius> <Fill> <CssParameter name="fill">#FFF88B</CssParameter> <CssParameter name="fill-opacity">0.85</CssParameter> </Fill> </Halo> <Fill> <CssParameter name="fill">#FF0000</CssParameter> </Fill> </TextSymbolizer></Rule>That's all folks!
28
Esempi SLD, raster symbolizer
<FeatureTypeStyle> <Rule> <RasterSymbolizer> <Opacity>1.0</Opacity> <ColorMap> <ColorMapEntry color="#000000" quantity="-500" opacity="0.0"/> <ColorMapEntry color="#00ff00" quantity="-500" /> <ColorMapEntry color="#00fa00" quantity="-417" /> ... <ColorMapEntry color="#c85000" quantity="1400" /> <ColorMapEntry color="#be4100" quantity="1600" /> <ColorMapEntry color="#963000" quantity="2000" /> <ColorMapEntry color="#3c0200" quantity="3000" /> <ColorMapEntry color="#ffffff" quantity="5000" /> <ColorMapEntry color="#ffffff" quantity="13000" /> </ColorMap> </RasterSymbolizer>...
Gtopo30 w020n90, particolare vestito con la color map specificata nell'SLD
29
Sigma, un esempio complesso
Demo di sigma.openplans.org
Le strade principali sono un layer Postgis di alcuni gigabyte, con tre geometrie a tre diversi livelli di generalizzazione, e vari attributiIl foglio di stile che le disegna contiene 21 FeatureTypeStyle, ciascuno con una o più regoleSceglie lo styling in base alla scala (e di conseguenza adotta la geometria più adatta) e alle caratteristiche della stradaIn totale, è oltre 2000 righe... di fatto è un piccolo programma
WMS – estensioni SLD
31
DescribeLayer
Quando si scrive un SLD, occorre conoscere gli attributi dei feature type e le caratteristiche delle grid coverage
Queste informazioni sono fornite dai rispettivi servizi WFS e WCS
DescribeLayer consente di chiedere dove trovare il layer nel WFS e nel WCS, o se al contrario questo non è possibile (layer che rappresentano raggruppamenti di altri layer, ad esempio)
http://localhost:8080/geoserver/wms?request=DescribeLayer&layers=topp:tasmania_roads<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE WMS_DescribeLayerResponse SYSTEM ...><WMS_DescribeLayerResponse version="1.0.0"> <LayerDescription name="topp:tasmania_roads" wfs="http://localhost:8080/geoserver/wfs/WfsDispatcher?"> <Query typeName="topp:tasmania_roads" /> </LayerDescription></WMS_DescribeLayerResponse>
32
GetStyle/PutStyle/GetLegendGraphic
GetStyle e PutStyle consentono rispettivamente di ottenere il codice SLD di uno stile, e di caricare un nuovo stile sul server
Un client avanzato può sfruttare questa possibilità per ottenere un rendering specifico per le sue necessità
GetLegendGraphic permette di ottenere elementi grafici per creare la legenda di una mappa
33
Pratica
Preview di layer in MapBuilder
Caricamento di SLDSemplice uso di OpenLayer per ottenere mappe tiledUso di uDig per visualizzare mappe e creare SLD