În această secțiune vom intra în detalii despre cum sunt construite geometriile în SQL. În realitate, probabil veți utiliza un GIS cum ar fi QGIS pentru creearea geometriilor complexe folosind instrumentele acestora; cu toate acestea, întelegerea modului cum sunt stocate poate fi utilă pentru scrierea de interogări și înțelegerea modului cum este alcătuită baza de date.
Scopul acestei lecții: De a înțelege mai bine cum să creați entități spațiale direct în PostgreSQL/PostGIS.
Întorcându-ne la baza de date address, să facem tabelul de străzi să se potrivească cu celelalte; de ex., să aibă o constrângere pentru geometrie, un index și o intrare în tabelul geometry_columns.
Modificați tabela streets, astfel încât ea să aibă o coloană de geometrie de tipul ST_LineString.
Nu uitați să faceți actualizarea coloanelor de geometrie!
De asemenea, adăugați o constrângere pentru a preveni adăugarea geometrii care nu sunt null sau de tip LINESTRINGS.
Creați un index spațial în noua coloană de geometrie
Acum, haideți să inserăm un șir de linii în tabela noastră de străzi. În acest caz, vom actualiza o înregistrare existentă de stradă:
update streets set the_geom = 'SRID=4326;LINESTRING(20 -33, 21 -34, 24 -33)'
where streets.id=2;
Aruncați o privire la rezultatele din QGIS. (Poate fi necesar să faceți clic-dreapta pe stratul străzilor din panoul ‘Straturilor’, apoi alegeți ‘Transfocare la extinderea stratului’.)
Acum, creați mai multe intrări de străzi - unele în QGIS, iar altele din linia de comandă.
Crearea de poligoane este la fel de simplă. De reținut că, prin definiție, poligoanele au cel puțin patru vârfuri, primul și ultimul suprapuse:
insert into cities (name, the_geom)
values ('Tokyo', 'SRID=4326;POLYGON((10 -10, 5 -32, 30 -27, 10 -10))');
Note
Un poligon necesită acolade duble în jurul listei sale de coordonate; aceasta pentru a permite poligoane complexe având multiple zone neconectate. De exemplu
insert into cities (name, the_geom)
values ('Tokyo Outer Wards', 'SRID=4326;POLYGON((20 10, 20 20, 35 20, 20 10),
(-10 -30, -5 0, -15 -15, -10 -30))');
Dacă ați urmat acest pas, puteți verifica rezultatul prin încărcarea setului de date orașe în QGIS, deschizând tabelul de atribute al acestuia, și selectând noua intrare. Remarcați cum cele două noi poligoane se comportă ca unul singur.
Pentru acest exercițiu ar trebui să faceți următoarele:
Ștergeți toate datele din tabela de personal.
Adăugați o coloană de cheie străină în tabela de personal, care face referire la cheia primară a tabelei orașelor.
Utilizați QGIS pentru a captura unele orașe.
Utilizați SQL pentru a introduce câteva înregistrări de personal, verificând că fiecare are asociate o stradă și un oraș.
Schema de personal actualizată ar trebui să arate cam așa:
\d people
Table "public.people"
Column | Type | Modifiers
-----------+-----------------------+--------------------------------------------
id | integer | not null
| | default nextval('people_id_seq'::regclass)
name | character varying(50) |
house_no | integer | not null
street_id | integer | not null
phone_no | character varying |
the_geom | geometry |
city_id | integer | not null
Indexes:
"people_pkey" PRIMARY KEY, btree (id)
"people_name_idx" btree (name)
Check constraints:
"people_geom_point_chk" CHECK (st_geometrytype(the_geom) =
'ST_Point'::text OR the_geom IS NULL)
Foreign-key constraints:
"people_city_id_fkey" FOREIGN KEY (city_id) REFERENCES cities(id)
"people_street_id_fkey" FOREIGN KEY (street_id) REFERENCES streets(id)
Acum, schrma noastră ar trebui să arate în felul următor:
Creați marginile orașelor prin calucularea înfășurătorii convexe pentru toate adresele din acel oraș și calcularea unei zone tampon în jurul acesteia.
Folosind funcțiile SFS-Model, aveți la dispoziție o largă gamă de opțiuni pentru accesarea sub-obiectelor geometriilor SFS. Când doriți să selectați primul punct vertex al fiecărei geometrii poligon în tabelul myPolygonTable, trebuie să o faceți în felul acesta:
Transformarea limitei poligonale într-un șir de linii:
select st_boundary(geometry) from myPolygonTable;
Selectați primul vertex al șirului de inii rezultant:
select st_startpoint(myGeometry)
from (
select st_boundary(geometry) as myGeometry
from myPolygonTable) as foo;
PostGIS suportă toate funcțiile conforme standardelor OGC SFS/MM. Toate aceste funcții încep cu ST_.
Pentru a decupa o parte din date puteți utiliza funcția ST_INTERSECT(). Pentru evitarea geometriilor vide, folosiți:
where not st_isempty(st_intersection(a.the_geom, b.the_geom))
select st_intersection(a.the_geom, b.the_geom), b.*
from clip as a, road_lines as b
where not st_isempty(st_intersection(st_setsrid(a.the_geom,32734),
b.the_geom));
Plecând de la de la un tabel de puncte dat, doriți să generați un linestring. Ordinea punctelor este dată de valoarea id. O altă metodă de ordonare ar putea fi marca de timp, cum ar fi cea pe care o primiți când capturiați puncte cu un receptor GPS.
Pentru a creea un șir de linii dintr-un strat nou numit ‘points’, puteți rula comanda următoare:
select ST_LineFromMultiPoint(st_collect(the_geom)), 1 as id
from (
select the_geom
from points
order by id
) as foo;
Pentru a vedea cum funcționează fără a crea un nou strat, puteți executa această comandă în stratul ‘people’, deși desigur nu ar avea prea mult sens în lumea reală.
Puteți obține mai multe informații pentru acest subiect în această intrare de blog.
Pentru a vedea diferențele între două tabele având aceeași structură puteți utiliza cuvântul cheie PostgreSQL EXCEPT:
select * from table_a
except
select * from table_b;
Ca rezultat, veți obține toate acele înregistrări din table_a care nu se regăsesc și în table_b.
Puteți defini în care loc de pe disc ar trebui să stocheze Postgres datele, prin crearea numelor de spații:
CREATE TABLESPACE homespace LOCATION '/home/pg';
Atunci când creați o bază de date, aveți posibilitatea să specificați care spațiu de tabelă să fie utilizat, de exemplu:
createdb --tablespace=homespace t4a
Ați învățat cum să creeați geometrii mai complexe folosing instrucțiuni PostGIS. Rețineți că aceasta folosește la îmbunătățirea cunoștințelor pentru lucrul cu o bază de date spațială printr-o interfață GIS. În mod curent nu veți avea nevoie să folosiți aceste instrucțiuni manual, dar o înțelegere generală vă va ajuta la utilizarea unui GIS, în special dacă întâlniți erori care ar putea să pară altfel criptice.