2011. február 11., péntek

Alapvető topológiai műveletek



Az OpenGis specifikáció két alapvető módot ajánl a térbeli objektumok kifejezésére, ez a WKT
(well-known-text) és a WKB (well-known-binary). A WKT az ember számára, a WKB a gép
számára olvashatóbb. A postgis elsősorban az alábbi 2 dimenziós objektumokat kezeli, de kísérleti
jelleggel a 3d és a 4d objektumokat is támogatja, mivel ez nem OGC ajánláson alapszik, így
EWKT és EWKB (E mint extended, kiterjesztett) jelöléseket használja a postgis ezekre a
formátumokra. Egy térbeli objektumot a vetület (térbeli koordináta rendszer) és az objektum típus
határozza meg, amik a következőek a WKT alapján: POINT (pont), LINESTRING
(vonal),POLYGON (poligon),MULTIPOINT (tömbösített pont) ,MULTILINESTRING
(tömbösített vonal) ,MULTIPOLYGON (tömbösített poligon),GEOMETRYCOLLECTION
(gyűjtemény). Fontos, hogy minden EWKT/EWKB érvényes WKT/WKB formátum is.

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))

(forrás: POSTGIS Manual 15. oldal)

Pont

Pontból vonal:

Vonal létrehozása az ST_LineFromMultiPoint(geometry aMultiPoint) függvény segítségével
lehetséges, mivel a multipoint-on belül nincs sorrendiség megállapítva, így azt az ORDER BY
klauza segítségével lehet beállítani például a timestamp alapján.
Pontból poligon:

Vonalat kell először létrehozni a pontokból!

Vonal

Vonalból pont:

ST_DUMP() funkció segítségével lehet létrehozni:

CREATE TABLE pont AS SELECT (ST_Dump(the_geom)).geom as the_geom FROM vonal;

Vonalláncból poligon:

ST_BuildArea() funkció használatával: 1 db zárt vonalláncból lehet poligont létrehozni, de például
szigetpoligont csak körülményesen lehet kialakítani vele:

CREATE TABLE kivagat AS SELECT (ST_BuildArea(ST_Collect(nagy,kicsi))) FROM (SELECT
d.the_geom as nagy,f.the_geom as kicsi FROM mukter_inverz as d,mukodesi_terulet as f);

ST_MakePolygon() funkció használatával: Poligon külső és belső határát is meg lehet adni, így
egyszerűen lehet szigetpoligont létrehozni, de itt is csak 1 darab poligon hozható létre egyszerre.

ST_Polygonize() funkció használatával: Többszálú, de zárt vonalláncot alakít át poligonná.

CREATE TABLE st_polygonize AS (SELECT (ST_DUMP(ST_Polygonize(geom))).geom as geom
FROM lines);

Poligon

Poligonból pont:

CREATE TABLE pont AS SELECT (ST_DumpPoints(geom)).geom FROM poligon_tabla;

És így nem duplázza a poligonok találkozásánál a pontokat:

CREATE TABLE pont AS SELECT DISTINCT (ST_DUMPpoints(the_geom)).geom as geom
FROM poligon_tabla;


Poligonból vonal:

Poligonból egybefüggő vonal:

CREATE TABLE vonal AS SELECT ST_BOUNDARY(the_geom) FROM poligon;

Vonal feldarabolása vonal darabokra (szegmensek kezdő és végpontjainak megadása):

CREATE TABLE vonal_szegmentalt1 AS SELECT ST_PointN(geom,generate_series(1,ST_NPoints(geom)-1)) as kp, ST_PointN(geom,generate_series(2,ST_NPoints(geom))) as vp FROM vonal;

Szegmensek vonalláncá alakítása:

CREATE TABLE vonal_szegmentalt3 AS SELECT ST_MakeLine(kp,vp) FROM vonal_szegmentalt2;

Összevonva, poligonból vonallánc létrehozása:

CREATE TABLE szegmentalt_vonal AS (SELECT ST_MakeLine(kp,vp) FROM (SELECT
ST_PointN(geom,generate_series(1,ST_NPoints(geom)-1)) as kp,
ST_PointN(geom,generate_series(2,ST_NPoints(geom))) as vp FROM (SELECT
(ST_Dump(ST_BOUNDARY(the_geom))).geom as geom FROM poligon_tabla) as hatar) as
szegmens);

Nincsenek megjegyzések:

Megjegyzés küldése