16.2. Lesson: Il modello Simple Feature
Come puoi memorizzare o rappresentare delle entità geografiche in un database? In questa lezione tratteremo di uno dei possibili approcci, il Modello delle entità di base definito da OGC.
Obiettivo di questa lezione: Imparare cosa è il modello SFS e come usarlo.
16.2.1. Cos’è OGC
Open Geospatial Consortium (OGC) è un’organizzazione internazionale no-profit, basata sul consenso volontario, che si occupa di definire specifiche tecniche per i servizi geospaziali e di localizzazione (location based). OGC è formato da oltre 370 membri (governi, industria privata, università) con l’obiettivo di sviluppare ed implementare standard per il contenuto, i servizi e l’interscambio di dati geografici (GIS - Sistema informativo geografico) che siano «aperti ed estensibili». Le specifiche definite da OGC sono pubbliche (PAS) e disponibili gratuitamente. - Wikipedia
16.2.2. Cos’è il modello SFS
Il modelle delle entità di base per SQL (SFS) è un modo non-topologico per l’uso di dati geospaziali in un database e definisce le funzioni per l’accesso, il funzionamento e la costruzione di questi dati.
Il modello definisce dati geospaziali provenienti da vettori di punti, linee e poligoni (e aggregazioni multioggetto).
Per ulteriori informazioni, consultare lo standard OGC Simple Feature for SQL.
16.2.3. Aggiungi un campo geometria alla tavola
Aggiungi un campo punto alla tabella people:
alter table people add column the_geom geometry;
16.2.4. Aggiungi un vincolo in base al tipo di geometria
Noterai che il tipo di campo della geometria non specifica in modo implicito quale tipo di geometria per il campo - per questo abbiamo bisogno di un vincolo:
alter table people
add constraint people_geom_point_chk
check(st_geometrytype(the_geom) = 'ST_Point'::text
OR the_geom IS NULL);
Questo aggiunge un vincolo alla tabella in modo che accetterà solo una geometria punto o un valore nullo.
16.2.5. Try Yourself
Crea una nuova tabella denominata cities e inserisci alcune colonne appropriate, tra cui un campo geometry per poligoni (i confini della città). Assicurarti che esiste un vincolo per rispettare geometrie poligoni.
Soluzione
create table cities (id serial not null primary key,
name varchar(50),
the_geom geometry not null);
alter table cities
add constraint cities_geom_point_chk
check (st_geometrytype(the_geom) = 'ST_Polygon'::text );
16.2.6. Compila la tabella geometry_columns
A questo punto dovresti aggiungere nella tabella geometry_columns
:
insert into geometry_columns values
('','public','people','the_geom',2,4326,'POINT');
Perché? geometry_columns viene utilizzato da alcune applicazioni per sapere quali tabelle del database contengono dati geometrici.
Nota
Se la precedente istruzione INSERT
causa un errore, esegui prima questa interrogazione:
select * from geometry_columns;
Se la colonna f_table_name contiene il valore people, allora questa tabella è già stata registrata e non è necessario fare altro.
Il valore 2
si riferisce al numero di dimensioni; in questo caso, due: X e Y.
Il valore 4326 si riferisce alla proiezione che stai utilizzando; in questo caso, WGS 84, riferita con il numero 4326 (vedere la precedente discussione sul EPSG).
Try Yourself
Aggiung un’appropriata geometry_columns per il tuo vettore new cities
Soluzione
insert into geometry_columns values
('','public','cities','the_geom',2,4326,'POLYGON');
16.2.7. Aggiungi una riga alla tabella usando SQL
Ora che le tabelle sono spazialmente abilitate, puoi archiviare le geometrie in esse:
insert into people (name,house_no, street_id, phone_no, the_geom)
values ('Fault Towers',
34,
3,
'072 812 31 28',
'SRID=4326;POINT(33 -33)');
Nota
Nei nuovi dati inseriti, dovrai specificare la proiezione (SRID) che desideri utilizzare. Questo è perché hai inserito la geometria del nuovo punto utilizzando una stringa di testo semplice ma che non aggiunge automaticamente le informazioni di proiezione corrette. Ovviamente, il nuovo punto deve utilizzare lo stesso SRID come i dati aggiunti, quindi devi specificarlo.
Se a questo punto staI utilizzando una interfaccia grafica, per esempio, specificando la proiezione per ciascun punto dovrebbe essere automatico. In altre parolenon ti preoccupererai di usare la proiezione corretta per ogni punto che desideri aggiungere, se lo hai già specificato.
Adesso apri QGIS e prova a vedere la tua tabella people. Puoi modificare/aggiungere/cancellare righe e interrogare il database per vedere come è cambiato.
Per caricare un layer PostGIS in QGIS usa l’opzione dal menu
oppure l’icona:Queesto aprirà la finestra di dialogo:
Scegli New per aprire questa finestra:
Quindi definisci una nuova connessione, per esempio:
Name: myPG
Service:
Host: localhost
Port: 5432
Database: address
User:
Password:
Per vedere se QGIS ha trovato il database address e che il tuo username e password sono corretti, scegli Test Connect. Se funziona scegli Save Username e Save Password. Quindi scegli OK per creare questa connessione.
Torna alla finestra Add PostGIS Layers , scegli Connect e aggiungi i layer al tuo progetto.
Try Yourself
Formulate un’interrogaazione che mostre il nome di una persona, la strada e la posizione (da the-geom coloumn) come testo
Soluzione
select people.name,
streets.name as street_name,
st_astext(people.the_geom) as geometry
from streets, people
where people.street_id=streets.id;
Risultato:
name | street_name | geometry
--------------+-------------+---------------
Roger Jones | High street |
Sally Norman | High street |
Jane Smith | Main Road |
Joe Bloggs | Low Street |
Fault Towers | Main Road | POINT(33 -33)
(5 rows)
Come puoi vedere, il nostro vincolo consente di aggiungere i nulli nel database.
16.2.8. In Conclusion
hai visto come aggiungere oggetti spaziali database e visualizzarli nel GIS.
16.2.9. What’s Next?
Nel prossimo vedrai come importare ed esportare i dati da e per il database.