Przestrzenne bazy danych Typy obiektów przestrzennych
Typy obiektów przestrzennych Obiekty geometryczne Obiekty geograficzne Obiekty rastrowe
Typ geometryczny i geograficzny GEOMETRY_COLUMNS opis danych typu geometry pozwalającego przechowywać dane w postaci współrzędnych płaskich GEOGRAPHY_COLUMNS opis danych typu geography pozwalającego przechowywać dane w postaci współrzędnych geograficznych i wykonywać obliczenia na sferze wyniki otrzymamy w metrach SELECT ST_Distance('POINT(16.9 52.399)'::geography, 'POINT(-74.5 40.7)':: geography); --6650462.04710672 wynik w metrach SELECT ST_Distance('POINT(16.9 52.399)'::geometry, 'POINT(-74.5 40.7)':: geometry); -- 92.145681401789wynik w stopniach
Widok GEOMETRY COLUMNS F_TABLE_CATALOG, F_TABLE_SCHEMA, F_TABLE_NAME lokalizacja danych F_GEOMETRY_COLUMN nazwa kolumny z geometrią w tabeli przestrzennej COORD_DIAMENSION wymiary przestrzennych danych ( 2-D, 3-D, 4-D) SRID układ odniesienia TYPE typ danych (zgodne z OGC Simple Feature)
Kolumna COORD_DIAMENSION COORD_DIAMENSION wymiary układu współrzędnych (ilość osi układu współrzędnych) 2 X-Y 3 X-Y-Z, X-Y-M 4 X-Y-Z-M Wymiary obiektów geometrycznych - każdy typ geometryczny posiada własne wymiary: point, multipoint (0D) linestring, multistring (1D) polygon, multipolygon (2D) bryły: sześciany, kule, obiekty amorficzne (3D) wspierany w PostGIS 2+
Kolumna SRID SRID (Spatial Reference Identifier) dane pobrane z katalogu wszystkich układów odniesienia dostępnych w bazie danych - SPATIAL_REF_SYS Domyślny SRID w PostGIS 2.0 to 0 reprezentuje nieoznaczony układ odniesień (wersjach Postgis1.* to -1)
Tabela SPATIAL_REF_SYS SRID identyfikator układu odniesienia AUTH_NAME nazwa standardu do opisu układu odniesienia np. EPSG (European Petroleum Survey Group) AUTH_SRID identyfikator układu odniesienia wg standardu określonego w poprzednim polu SRTTEXT reprezentacja WKT układu odniesienia PROJ4TEXT definicja układu współrzędnych zgodna z biblioteką Proj4
Tworzenie tabeli z danymi przestrzennymi CREATE TABLE wyk2.my_geometries ( id serial NOT NULL PRIMARY KEY, name varchar(20), my_points geometry(point), my_linestrings geometry(linestring), my_polygons geometry(polygon), my_multipoints geometry(multipoint), my_multilinestrings geometry(multilinestring), my_multipolygons geometry(multipolygon) );
Wstawianie punktów na podstawie współrzędnych INSERT INTO wyk2.my_geometries (name,my_points) VALUES ( 'Home', ST_GeomFromText('POINT(0 0)') ); INSERT INTO wyk2.my_geometries (name,my_points) VALUES ( 'Pizza1', ST_GeomFromText('POINT(1 1)') ) ; INSERT INTO wyk2.my_geometries (name,my_points)values ( 'Pizza2', ST_GeomFromText('POINT(1-1)') );
Punkty
Wstawianie linii INSERT INTO wyk2.my_geometries (name,my_linestrings) VALUES ( 'Linestring Open', ST_GeomFromText('LINESTRING(0 0,1 1,1-1)') ); INSERT INTO wyk2.my_geometries (name,my_linestrings) VALUES ( 'Linestring Closed', ST_GeomFromText('LINESTRING(0 0,1 1,1-1, 0 0)') );
Linie
Wstawianie poligonu INSERT INTO wyk2.my_geometries (name, my_polygons) VALUES ( 'Triangle', ST_GeomFromText('POLYGON((0 0, 1 1, 1-1, 0 0))') );
Poligon
Wstawianie obiektów multi INSERT INTO wyk2.my_geometries (my_multipoints, my_multilinestrings, my_polygons) VALUES (ST_GeomFromText('MULTIPOINT(-1 1, 0 0, 2 3)'), ST_GeomFromText('MULTILINESTRING((0 0,0 1,1 1),(-1 1,-1-1))'), ST_GeomFromText(MULTIPOLYGON(((2.25 0,1.25 1,1.25-1,2.25 0)),((1-1,1 1,0 0,1-1))) ') );
Obiekty multi
Poligon złożony INSERT INTO wyk2.my_geometries (name,my_polygons) VALUES ('Square with 2 holes',st_geomfromtext('polygon((-0.25-1.25,-0.25 1.25,2.5 1.25,2.5-1.25,-0.25-1.25),(2.25 0,1.25 1,1.25-1,2.25 0),(1-1,1 1,0 0,1-1))'));
Obiekty w wielu wymiarach MULTIPOINT(-1 1, 0 0, 2 3) wielopunkt ze współrzędnymi x, y (2d) MULTIPOINTZ(-1 1 3, 0 0 1, 2 3 1)- wielopunkt ze współrzędnymi x, y, z (3d) MULTIPOINTZM(-1 1 3 4, 0 0 1 2, 2 3 1 2)- wielopunkt ze współrzędnymi x, y, z,m (3dm) MULTIPOINTM(-1 1 4, 0 0 2, 2 3 2)- wielopunkt ze współrzędnymi x, y, m (2dm) MULTILINESTRING((0 0,0 1,1 1),(-1 1,-1-1)) MULTILINESTRINGZM((0 0 1 1,0 1 1 2,1 1 1 3),(-1 1 1 1,-1-1 1 2)) MULTILINESTRINGM((0 0 1,0 1 2,1 1 3),(-1 1 1,-1-1 2)) MULTIPOLYGON(((2.25 0,1.25 1,1.25-1,2.25 0)),((1-1,1 1,0 0,1-1))) MULTIPOLYGONZ(((2.25 0 1,1.25 1 1,1.25-1 1,2.25 0 1)),((1-1 2,1 1 2,0 0 2,1-1 2)) ) MULTIPOLYGONZM(((2.25 0 1 1,1.25 1 1 2,1.25-1 1 1,2.25 0 1 1)),((1-1 2 1,1 1 2 2,0 0 2 3,1-1 2 4)) MULTIPOLYGONM(((2.25 0 1,1.25 1 2,1.25-1 1,2.25 0 1)),((1-1 1,1 1 2,0 0 3,1-1 4)) )
Wymiar M Wymiar M służy do przechowywania wartości typu zmiennoprzecinkowego (double-precision) powstałych w wyniku pomiarów dodatkowych zmiennych nie zależnych od zmiennych przestrzennych. Dane mogą być przechowywane w postaci dwóch wymiarów 2DM x,y,m 3DM x,y,z,m.
Obiekty 3d SELECT ST_GeomFromText( 'POLYHEDRALSURFACE Z ( ); ((12 0 10, 8 8 10, 8 10 20, 12 2 20, 12 0 10)), ((8 8 10, 0 12 10, 0 14 20, 8 10 20, 8 8 10)), ((0 12 10, -8 8 10, -8 10 20, 0 14 20, 0 12 10)) )'
Kolekcje obiektów geometrycznych Kolekcja obiektów - typ danych mogący zawierać w sobie punkty, wielopunkty, linie, wielolinie, poligony i wielopoligony. SELECT ST_AsText(ST_Collect(the_geom)) FROM ( SELECT ST_GeomFromText('MULTIPOINT(-1 1, 0 0, 2 3)') As the_geom UNION ALL SELECT ST_GeomFromText('MULTILINESTRING((0 0,0 1,1 1),(-1 1,-1-1))') As the_geom UNION ALL SELECT ST_GeomFromText('POLYGON((-0.25-1.25,-0.25 1.25,2.5 1.25,2.5-1.25,- 0.25-1.25), (2.25 0,1.25 1,1.25-1,2.25 0), (1-1,1 1,0 0,1-1))') As the_geom) As foo;
Kolumna niejednorodna
Krzywe CIRCULARSTRING ALTER TABLE wyk2.my_geometries ADD COLUMN my_circular_strings geometry(circularstring); INSERT INTO wyk2.my_geometries(name,my_circular_strings) VALUES ('Circle', ST_GeomFromText('CIRCULARSTRING(0 0,2 0, 2 2, 0 2, 0 0)')), ('Half Circle', ST_GeomFromText('CIRCULARSTRING(2.5 2.5,4.5 2.5, 4.5 4.5)')), ('Several Arcs', ST_GeomFromText('CIRCULARSTRING(0 0, 2 0, 2 1, 2 3, 4 4)'));
Transformacja krzywej w linię SELECT name, ST_NPoints(my_circular_strings) As cnpoints, ST_NPoints(ST_CurveToLine(my_circular_strings)) As lnpoints FROM wyk2.my_geometries WHERE my_circular_strings IS NOT NULL; Kontrola ilości punktów kontrolnych obiektów
Krzywe i linie złączone ALTER TABLE wyk2.my_geometries ADD COLUMN my_compound_curves geometry(compoundcurve); INSERT INTO wyk2.my_geometries(name,my_compound_curves) VALUES ('Road with curve', ST_GeomFromText('COMPOUNDCURVE((2 2, 2.5 2.5), CIRCULARSTRING(2.5 2.5,4.5 2.5, 3.5 3.5), (3.5 3.5, 2.5 4.5, 3 5))'));
Funkcje obsługi geometrii WKT WKB ST_GemFromText(text,srid) zwraca geometrię ST_AsText(geometry) zwraca text ST_AsEWKT(geometry) zwraca text ST_As_Binary(geometry) zwraca bytea ST_As_Binary(geometry) zwraca bytea ST_GeomFromWKB(bytea) zwraca geometrię
Modele przechowywania danych Kolumny niejednorodne kolumny pozwalające przechowywać obiekty geometryczne różnego typu np. poligony, linie i punkty (typ geometry) Kolumny jednorodne kolumny pozwalające przechowywać obiekty tylko jednego typu geometrycznego
Zalety kolumn niejednorodnych Pozwalają pojedynczym zapytaniem powiązać cechy różnych typów obiektów bez utraty możliwości modelowania Pozwala umieszczać dowolne obiekty geometryczne w jednej tabeli jeżeli ich atrybuty niezależne od przestrzeni są takie same (takie same atrybuty poligonu i punktu) Szybsze tworzenie tabeli bez konieczności tworzenia dodatkowych kolumn i poręczne w przypadku ładowania różnych danych bez konieczności kontroli typu geometrycznego
Wady kolumn niejednorodnych Ryzyko umieszczenia nieodpowiedniej geometrii dla obiektu (błędnie zdefiniowany obiekt lub brak systemu odniesienia) Wiele zewnętrznych aplikacji i ich narzędzi nie radzi sobie z kolumnami heterogenicznymi (ominięciem tego problemu jest utworzenie widoków z informacją o typach geometrycznych lub wykonanie odpowiedniego zapytania dotyczącego jednego typu geometrii) W przypadku wyodrębnienia jednego typu geometrii potrzebne są czynności filtrowania tabeli (wyzwalacze i reguły) co w przypadku dużych tabel może być czynnością wolną. Umieszczanie wszystkich obiektów geometrycznych w jednej tabeli może doprowadzić do nieodpowiednich samo-połączeń obiektów. ( W przypadku posiadania zbioru 100 punktów i 2 poligonów, chcemy ustalić które punkty zawierają się w danym poligonie otrzymamy łączenie 102 wierszy do 102 wierszy, w przypadku obdzielenia mamy łączenie 100 wierszy jednej tabeli do 2 wierszy drugiej tabeli)
Zalety kolumn jednorodnych Wymusza spójność i zapobiega niezamierzonemu mieszaniu rodzajów geometrii Narzędzia innych aplikacji opierają się często na spójności typu geometrycznego: jeden typ na jedną tabelę (np. ESRI shapefile wspiera jedynie jeden typ geometrii na plik. Aby eksportować dane do ESRI trzeba zastosować zasadę jednego typu geometrii na tabelę) Aby uzyskać lepsze wyniki podczas łączenia należy łączyć tabele z dużymi geometriami i kilkoma rekordami z tabelami z mniejszymi geometriami i wieloma rekordami niż na odwrót. W przypadku rysowania różnych obiektów lepszą wydajność zapewniają obiekty zapisane w tabelach z geometrią jednego typu W przypadku olbrzymich danych, oddzielne tabele pozwalają na zapisywanie danych na oddzielnych dyskach (PostgreSQL tablespace fizyczny folder do przechowywania dodatkowych danych inaczej niż w schema która jest lokalizacją logiczną, Oracle file groups)
Wady kolumn jednorodnych W przypadku zapytań, rysujących w systemach GIS różne typy geometryczne na warstwie, należy zastosować zapytania łączące. Co może mieć wpływ na złożoność i szybkość wykonania zapytania. Należy ograniczać stosowanie tabel z wieloma kolumnami różnego typu geometrycznego. Dłuższe wiersze powodują obniżenie szybkości zapytań takich jak select i update.
Typ rastrowy Wysokość i szerokość kafla rastrowego np. 50x50px (jeden wiersz w tabeli) Ilość kanałów w rastrze (max do 255 w PostGIS) Typ pixela w kanale: 1 bit Boolean - 1BB Unsigned integer of 2, 8, 16, or 32 bits - 2BUI, 8BUI, 16BUI, 32BUI Signed integers of 8, 16, or 32 bits - 8BSI, 16BSI, 32BSI float types: 32, 64 bits - 32BF and 64BF Układ współrzędnych rastra Wysokość i szerokość pixela np. 30x30m Skala pixela - X pixela 1:30, Y pixela 1:30
Ładowanie danych rastrowych raster2pgsql -s 2180 -I -C -M C:\sciezka_do_pliku\pozdem.tif -F -t 50x50 raster.pozdem psql -U postgres -d geodb W efekcie otrzymujemy tabelę zawierającą 1400 wierszy czyli kafli o rozmiarze 50x50px
Ładowanie danych rastrowych
Funkcje do obsługi geometrii (PostGIS 1.5) AddGeometryColumn dodaje kolumnę geometrii to tabeli danych przestrzennych i odpowiednik - metadane w geometry_columns DropGeometryTable usuwa tabelę danych przestrzennych a także metadane związane z tą tabelą w geometry_columns UpdateGeometrySRID zmienia typ układu odniesienia SRID w tabeli danych przestrzennych i w geometry_columns