CORSO GEODATABASE PostgreSQL, PostGIS e software ausiliari

Transcript

CORSO GEODATABASE PostgreSQL, PostGIS e software ausiliari
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
PostgreSQL, PostGIS e software
ausiliari
Fabio Zottele – SIG – Fondazione E. Mach
Marco Ciolli – DICA – Università degli Studi di Trento
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
Software...
PostGIS integra PostgreSQL con il supporto per le primitive geometriche. L'RDBMS può
essere connessi ai GIS che riescano a interpretarne I contenuti.
PostGIS segue le OpenGIS "Simple Features Specification for SQL" ed è stato certificato
come aderente al profilo "Types and Functions" il 1 settembre 2006.
Client
Client GIS
(pgAdmin3,phpPgAdmin...)
(GRASS,Qgis,UDig...)
PostgreSQL
PostGIS
GEOS
proj
MAPSERVER
PostgreSQL, PostGIS e software ausiliari
OGR
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
Software...
PostgreSQL: RDBMS per la gestione dei dati, dei linguaggi, delle transazioni e dei tipi di
dato fondamentali;
●
PostGIS: estensione spaziale. Fornisce 663 funzioni, 3 trigger, 9 operatori, 2 classi di
operatori per l'indicizzazione spaziale e 7 tipi di dato che agiscono su entità di tipo vettoriale
aderendo agli standard OGC. Fornisce anche le API per lo sviluppo di interfacce, i dumper per
l'importazione e l'esportazione di shapefile. Lo sviluppo prevede: pieno supporto topologico,
supporto ai dati raster, supporto alle reti e algoritmi per il calcolo dei costi dei flussi (routing),
superfici tridimensionali;
●
GEOS (Geometry Engine Open Source): libreria per la gestione della topologia e per la
validazione cel dato geometrico. Sono disponibili funzionalità per “pulire” la topologia;
●
proj: software per la collezionare e gestire i sistemi di riferimento geografici. comprende il
supporto per gli shift dei datum (3 0 7 parametri). Trasforma le coordinate geografiche in
coordinate cartesiane (proj) o direttamente da un sistema di coordinate all'altro (cs2cs).
Fornisce una libreria che mappa la grande parte dei sistemi di coordinate EPSG;
●
OGR/GDAL: fornisce le funzionalità di accesso in lettura (e talvolta in scrittura) per formati di
file vettoriali tra cui ESRI Shapefile, S-57, SDTS, PostGIS, Oracle Spatial e Mapinfo mid/mif e
TAB, GML, KML, GRASS, Informix DataBlade...
PostgreSQL, PostGIS e software ausiliari
●
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
Installazione (da sorgente) di PostGIS su LINUX
Prerequisiti:
● installazione completa di postgreSQL (>= 7.2)
● compilatore C (GNU)
● make (GNU)
● Proj (opzionale): qualora siano necessarie operazioni di riproiezione sui propri dataset
● GEOS (opzionale): qualora vengano utilizzati test geometrici (Touches(), Contains(), Intersects()) e
operazioni (Buffer(), GeomUnion(), Difference(), ST_Buffer())
Installazione:
● scompattare i codici sorgenti di PostGIS nella directory “contrib” della directory dei sorgenti di
PostgreSQL. (tar xvfz postgis-x.x.x.tar.gz)
● cd postgis-x.x.x
● ./configure (possibilità di ottimizzare gli eseguibili per la propria architettura e a seconda delle
funzionalità volute)
● make
● make install
● Installare il linguaggio procedurale al proprio database (createlang plpgsql spatialdb)
● caricare le funzioni ed i tipi di dato geometrici nel database (psql -d spatialdb -f
postgis.sql)
● caricare il set di sistemi di riferimento geografici (psql -d spatialdb -f
spatial_ref_sys.sql)
PostgreSQL, PostGIS e software ausiliari
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
Installazione (da pacchetto) di PostGIS su LINUX
Per installare i “binari” precompilati di PostGIS basta avviare la procedura d'installazione per la
propria distribuzione Linux. Per le Debian (e Debian-derived):
apt-get install postgis
Questo comando installa tutte le dipendenze necessarie (compreso PostgreSQL se non
già installato nel sistema). Occorre poi caricare manualmente l'estensione spaziale.
Pro:
● semplificazione della procedura di installazione;
● processo istanteaneo e ready-to-use.
Contro:
● spesso le versioni di PostGIS presenti nelle repository non sono sincronizzate con le
versioni stabili aggiornate;
i “binari” sono stati compilati abilitando (o disabilitando) delle funzionalità o delle
dipendenze non necessarie (eseguibili più “corposi” e lenti...)
PostgreSQL, PostGIS e software ausiliari
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
Installazione di PostGIS su Microsoft WINDOWS
L'installer per Windows di PostgreSQL contiene le librerie, installabili opzionalmente, di
PostGIS. Anche in questo caso, raramente la versione dell'estensione spaziale
installabile corrisponde alla versione correntemente stabile.
Si procede così:
● si installa solamente PostgreSQL (e tutte le estensioni necessarie tranne quella
spaziale);
●
si scarica l'installer dell'ultima release stabile di PostGIS e lo si installa
successivamente all'installazione di PostgreSQL;
● si applica l'estensione spaziale laddove è necessario.
PostGIS viene installato con ogni sua funzionalità: non è possibile ottimizzare
l'estensione spaziale in fase di installazione.
PostgreSQL, PostGIS e software ausiliari
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
Interoperabilità
La struttura modulare con cui è pensata l'architettura dei software Open Source, permette di integrare
PostGIS con un elevato numero di applicazioni. Le più importanti sono:
● Cadcorp SIS
● FME (Free manipulation Engine, ESRI Interoperability Extension)
● Geotools (Geoserver, uDig)
● GRASS
● gvSIG
● Ionic Redspider
● Jump (OpenJump, Kosmo)
● Mapserver
● OGR/GDAL
● Qgis
● tutti i linguaggi che possono interfacciarsi con PostgreSQL possono interfacciarsi anche con PostGIS:
perl, php, python, tcl, C, C++, Java, C#...
PostGIS permette anche lo scambio di informazioni georeferenziate tra applicativi non-OGC attraverso
l'uso del loader e del dumper.
Il loader è un programma (da riga di comando) chiamato shp2pgsql che converte ESRI Shapefiles in
una serie di comandi SQL da ridirezionare all'RDBMS
Analogamente, il dumper è chiamato pgsql2shp e converte tabelle di PostGIS (o query) in ESRI
Shapefile.
Esistono numerose interfacce grafiche al loader/dumper.
PostgreSQL, PostGIS e software ausiliari
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
Tipi di dato
Gli oggetti geometrici supportati da PostGIS sono un'estensione di quelli definiti dall'OGC
“Simple Features”. Postgis supporta tutti gli oggetti e le funzioni de “Simple Features for
SQL” ed estende lo standard con il supporto 3DZ, 3DM e 4D.
PostGIS si rende aderente all'ISO SQL/MM inserendo il tipo geometrico Curve e le
separando le funzioni che agiscono sul tipo geometry con il nome ST_*.
Per quanto riguarda le funzionalità :
●AsKML per l'interazione con GoogleEarth, AsGeoJSON, AsSVG, AsGML....
●La compilazione con GEOS abilita l'analisi topologica
●Funzionalità per operazioni topologiche complesse (analisi dei grafi)
●Creazione dei file PRJ nell'esportazione dei dati.
PostgreSQL, PostGIS e software ausiliari
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
OGC compliant
Le specifiche OGC definiscono due modalità standard per esprimere costrutti spaziali:
Well-Known Text (WKT);
● Well-Known Binary (WKB).
●
Entrambi includono il tipo di oggetto e le coordinate (WKT):
●
●
●
●
●
●
●
POINT(0 0)
LINESTRING(0 0,1 1,1 2)
POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))
MULTIPOINT(0 0,1 2)
MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))
MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))
GEOMETRYCOLLECTION(POINT(2 3),LINESTRING((2 3,3 4)))
Inoltre, lo standard prevede che il formato di immagazzinamento dei dati (internal
storage format) includa un identificatore per il sistema di riferimento adottato per
materializzare le coordinate.
INSERT INTO SPATIALTABLE ( THE_GEOM, THE_NAME ) VALUES ( GeomFromText('POINT(-126.4 45.32)', 312),
'A Place')
PostgreSQL, PostGIS e software ausiliari
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
Estensione dello standard OGC
Le specifiche OGC definiscono solamente tipi geometrici 2D e lo SRID non viene mai associato
nell'input/output dei dati (ma solamente nel formato interno).
I formati estesi di postGIS sono un superset si quelli definiti dall'OGC ed ogni geometria valida in
formato WKB/WKT lo è anche in EWKB/EWKT.
PostGIS EWKB/EWKT aggiunge coordinate 3DM,3DZ,4D e “embedded SRID information”.
Esempi di notazione (EWKT) dei costrutti spaziali estesi sono:
POINT(0 0 0)
XYZ
SRID=32632;POINT(0 0)
XY con SRID
● POINTM(0 0 0)
XYM
● POINT(0 0 0 0)
XYZM
● SRID=4326;MULTIPOINTM(0 0 0,1 2 1)
XYM CON SRID
● MULTILINESTRING((0 0 0,1 1 0,1 2 1),(2 3 1,3 2 1,5 4 1))
● POLYGON((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0))
● MULTIPOLYGON(((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0)),((-1 -1 0,-1 -2 0,2 -2 0,-2 -1 0,-1 -1 0)))
● GEOMETRYCOLLECTIONM(POINTM(2 3 9), LINESTRINGM(2 3 4, 3 4 5))
●
●
La forma canonica (internal storage format) è l'HEXEWKB (Extended Well-Known Binary in
notazione esadecimale:
SELECT 'SRID=4;POINT(0 0)'::geometry;
geometry ---------------------------------------------------01010000200400000000000000000000000000000000000000 (1 row)
PostgreSQL, PostGIS e software ausiliari
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
Tipi ISO/SQL-MM
Lo standard SQL Multimedia Applications Spatial specification estende il “Simple Features for SQL”
definendo un numero di primitive geometriche interpolate attraverso archi di circonferenza.
L'ISO/SQL-MM include coordinate 3DM, 3DZ e 4D coordinates, ma non consentono di associare
l'informazione riguardo il sistema di riferimento.
Alcuni esempi di Curve in PostGIS:
CIRCULARSTRING(0 0, 1 1, 1 0)
COMPOUNDCURVE(CIRCULARSTRING(0 0, 1 1, 1 0),(1 0, 0 1))
● CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1))
● MULTICURVE((0 0, 5 5),CIRCULARSTRING(4 0, 4 4, 8 4))
● MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1)),((10 10,
14 12, 11 10, 10 10),(11 11, 11.5 11, 11 11.5, 11 11)))
●
●
Attualmente Postgis non supporta l'uso delle Compound Curves nella definizione di un Curve
Polygon.
L'interpolazione avviene attraverso l'applicazione di un fattore di tolleranza: 1E-8.
PostgreSQL, PostGIS e software ausiliari
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
Il tipo geography
Questo tipo di geometria supporta tutte le primitive viste precedentemente, ma
rappresentate da coordinate geografiche.
La base delle geometrie OGC è il piano, il percorso più breve tra due punti è una linea
retta. Aree, distanze, lunghezze, intersezioni sono calcolate utilizzando la geometria
euclidea.
La base delle geometrie geography è la sfera: Il percorso più breve tra due punti è un arco
di circonferenza. Ciò significa che I calcoli devono venire eseguiti su una sfera, usando
una matematica più complicata. Per avere misure più accurate, I calcoli devono utilizzare
l'ellissoide e la matematica diventa ancora più complicata.
Se il dataset da utilizzare copre un'area piccola
(rispetto al mondo) il tipo geometry è la soluzione
migliore
Se il dataset copre tutto il mondo o un continente
meglio usare il tipo geography.
Se non si sa nulla di proiezioni, non si ha voglia di
imparare e I dati sono tutti in lon/lat allora meglio
usare geography.
PostgreSQL, PostGIS e software ausiliari
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
Come assicurarsi della correttezza dei dati?
PostGIS segue le Specifiche OGC, perciò molte funzioni di PostGIS assumono che le
geometrie che sono processate siano sia SIMPLE che VALID: non ha senso calcolare
l'area di un poligono che ha un buco al di fuori del poligono, o costruire un poligono
utilizzando una linea a forma di “otto”.
Per l'OGC una geometria è SIMPLE se non ha punti anomali (self-intersections, selftangency) e si riferisce alle geometrie (MULTI)POINT e (MULTI)LINESTRING.
La VALIDITA' si riferisce ai (MULTI)POLYGON e la sua definizione è un po' più
complicata.
LINESTRING
simple
valid
LINESTRING
not valid
LINESTRING
simple
valid
CLOSED RING
LINESTRING
not valid
PostgreSQL, PostGIS e software ausiliari
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
Come assicurarsi della correttezza dei dati?
PostGIS dispone di 3 funzioni per verificare la correttezza: ST_IsSimple, ST_IsValid,
ST_IsValidReason
SELECT ST_IsSimple(ST_GeomFromText('LINESTRING(1 1,2 2,2 3.5,1 3,1 2,2 1
)')); (non Valido)
SELECT ST_IsValid(ST_GeomFromText('POLYGON((0 0, 1 1, 1 2, 1 1, 0 0))'))
(Self-intersection at or near point 0 0)
SELECT ST_IsValidReason('LINESTRING(220227 150406,2220227 150407,222020
150410)');
VALID
NOT VALID POLYGON, ma
VALID MULTIPOLYGON
VALID
NOT VALID POLYGON, ma
VALID MULTIPOLYGON
NOT
VALID
NOT
VALID
PostgreSQL, PostGIS e software ausiliari
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
OGC – Tabella dei metadati
Per mantenere la consistenza dei metadati (referenzialità), gli standard OGC prevedono due tabelle che
collezionano le informazioni riguardanti i dataset georeferenziati.
CREATE TABLE roads( gid serial NOT NULL, cat int8, label varchar(80), the_geom geometry,
CONSTRAINT roads_pkey PRIMARY KEY (gid),
CONSTRAINT enforce_dims_the_geom CHECK (ndims(the_geom) = 2),
CONSTRAINT enforce_geotype_the_geom CHECK (geometrytype(the_geom) = 'MULTILINESTRING'::text OR the_geom IS
NULL),
CONSTRAINT enforce_srid_the_geom CHECK (srid(the_geom) = 26713))
CREATE INDEX roads_the_geom_gist ON roads USING gist(the_geom);
geometry_columns
roads
gid
(PK)
f_table_catalog
(PK)
f_table_schema
(PK)
f_table_name
(PK)
spatial_ref_sys
srid
f_geometry_column(PK)
auth_name
cat
coord_dimension
(PK)
auth_srid
label
srid
(PK)
srtext
the_geom
type
(PK)
proj4text
PostgreSQL, PostGIS e software ausiliari
(PK)
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
Indicizzazione spaziale
Gli indici vengono utilizzati per rendere più veloce l'accesso ai dati.
Lo scopo di un'estensione spaziale è quello di effettuare analisi sui dati immagazzinati nel database
analogamente ad un qualsiasi GIS. L'utilizzo appropriato degli indici forniscono un miglioramento delle
performance del sistema.
l'indice GiST agisce solamente con le funzioni bounding-box-based, mentre funzioni come distance() non
possono utilizzare l'indice per velocizzare le operazioni di estrazione dei dati. Per una tabella contenente
un gran numero di geometrie, la seguente query risulterebbe lenta:
SELECT the_geom FROM table WHERE ST_distance(the_geom, GeomFromText('POINT(100000 200000)', -1)) <
100
La query risulta lenta perché misura la distanza tra il punto specificato ed ogni altro punto della tabella. Per
evitare lo spreco di operazioni si utilizza l'operatore && che calcola l'intersezione tra le bounding box delle
geometrie.
SELECT the_geom FROM table WHERE the_geom && 'BOX3D(90900 190900,100100 200100)'::box3d AND
ST_distance(the_geom, GeomFromText('POINT(100000 200000)', -1 )) < 100
La query restituisce lo stesso risultato, ma in modo più efficiente. Se esiste un indice GiST sulla colonna
delle geometrie, il query-planner ridurrà il numero di righe da processare prima di calcolare il risultato di
distance(). La riduzione avviene per mezzo dell'operatore &&: se la query-box è molto più piccola della
regione definita dalla tabella, il numero di operazioni viene drasticamente ridotto.
PostgreSQL, PostGIS e software ausiliari
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
Esempio
Quali sono i tratti di strada che arrivano sui poderi di proprietà signor Biggam?
SELECT
r.the_geom
FROM
roads AS r,
fields AS f
WHERE
r.the_geom && f.the_geom
AND
overlaps(r.the_geom,f.the_geom)
PostgreSQL, PostGIS e software ausiliari
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
Il tipo raster
Analogamente al tipo geometry e geography PostGIS dispone del tipo raster per
immagazzinare informazioni di questo tipo aderendo il piùpossibile allo standard ISO
19123 “Abstract Specification Schema for Coverage Geometry and Functions”.
Esiste un loader, raster2pgsl.py, che importa in PostGIS tutti I formati supportati da
GDAL
Ogni raster o tile è una riga in una tabella del database. PostGIS gestisce internamente i
metadati (width,height, bands, pixeltype, nodata per ogni banda) e la geolocalizzazione
(pixelsize, upper left pixel center, rotation, SRID).
Il tipo raster “astrae” il formato e la struttura del dato: l’utente può applicare
direttamente funzioni pensate per geometrie vettoriali (ST_Intersect) su dati di tipo
raster.
Sebbene il supporto ai raster sia recente esistono già decine di funzionalità per
analizzare e gestire questo tipo di dati (es: ST_SummaryStats, ST_MapAlgebra,
ST_AsGDAL, ST_AsPNG, ST_AsTiff, ST_Reclass, ST_Histogram...)
PostgreSQL, PostGIS e software ausiliari
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
Supporto topologico avanzato
Dalla versione 2.0 sarà possibile associare ai layer vettoriali
presenti in PostGIS informazioni topologiche come
connettività, adiacenza, contenuto/contenente, prossimità,
direzioni relative.
Queste informazioni vengono associate alle entità vettoriali in
tabelle aggiuntive nello schema topology
Con il supporto alla topologia si potranno costruire in maniera
efficiente sistemi di routing (pgRouting) e di flowing, editare le
geometrie in maniera dipendente dalle geometrie adiacenti,
analisi di visibilità (una geometria può nascondere
parzialmente un'altra a seconda del punto e della direzione di
osservazione),
PostgreSQL, PostGIS e software ausiliari
Trento, venerdì 24 giugno 2011, CORSO GEODATABASE
Per concludere...
PostGIS rappresenta l'estensione spaziale più matura nel mondo dell'Open Source.
Grazie all'adesione agli standard OGC viene garantito l'efficiente scambio di informazioni
tra applicazioni.
Inoltre gli standard semplificano la gestione del dato georiferito.
Poligono in PostGIS:
POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))
Poligono in Oracle Spatial:
MDSYS.SDO_GEOMETRY(
2003, NULL, NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1),
MDSYS.SDO_ORDINATE_ARRAY(0,0, 0,1, 1,1, 1,0, 0,0)
)
PostgreSQL, PostGIS e software ausiliari