Przestrzenne bazy danych PostGIS
OGC (ang. Open Geospatial Consortium) OGC międzynarodowa organizacja standaryzacyjna w dziedzinie GIS. Powstała w roku 1994 roku. W jej skład wchodzą organizacje komercyjne, rządowe, uniwersytety oraz jednostki badawcze. Celem organizacji jest rozwój i wdrażania standardów dotyczących systemów GIS (przetwarzania i zapisu danych, udostępniania danych itp.) Standardy proponowane i ustalane przez OGC, są uwzględniane przez najbardziej liczące się na rynku GIS firmy i instytucje. Specyfikacje OGC są otwarte i darmowe.
PostGIS PostGIS to rozszerzenie PostgreSQL, dodające możliwość zapisywania danych geograficznych wprost do bazy danych zgodnie z specyfikacją OpenGIS Simple Features dla profilu SQL. PostGIS m.in.: Powstał w ramach projektu organizacji Refraction Research Inc Umożliwia tworzenie prostej topologii. Sprawdza poprawność danych przestrzennych. Pozwala na transformacje układów współrzędnych. Wyposażony jest w funkcje do analizy danych przestrzennych. Umożliwia przechowywanie i analizę danych rastrowych (PostGIS 2.0) Program wydany jest na licencji GNU GPL. Projekt nadal rozwijany przez Project Steering Committee.
PostGIS W PostGIS mamy dane typu: geometry(układ odniesienia to płaszczyzna) geographic (układ odniesienia to elipsoida, współrzędne podajemy w stopniach, minutach i sekundach kątowych) (WGS84) raster (w wersji PostGIS 2.0) Obiekty przestrzenne obsługiwane przez PostGIS: A. zbiór obiektów prostych 2D ( Simple Features ) zdefiniowanych przez OGC; B. zbiór obiektów zdefiniowanych w układach 3DZ, 3DM i 4D;
PostGIS Specyfikacja OGC pozwala na definicjęobiektów przestrzennych z wykorzystaniem: formy tekstowej WKT(ang. Well-Known Text), formy binarnej WKB(ang. Well-Known Binary). WKT oraz WKB zawierają informacje na temat: typu obiektu (np. punkt, poligon itp.) współrzędnych obiektu. W WKT i WKB brak informacji o układzie współrzędnych! Jeżeli obiekt przestrzenny chcemy umieścić w bazie danych to musimy dodatkowo podać numer SRID (ang. Spatial Referencing System Identifier), który jednoznacznie identyfikuje układ współrzędnych (SRS, ang. Spatial Referencing System). Dla układu WGS84 SRID = 4326. SDRID= -1 oznacza, że układ współrzędnych nie jest zdefiniowany. EWKT/EWKB zawiera informacje o układzie współrzędnym.
PostGIS Przykłady definicji elementów przestrzennych przy pomocy WKT: POINT (00) LINESTRING(0 0, 11, 12) POLYGON((0 0, 40, 44, 04, 00)) MULTIPOINT(0 0, 11) MULTILINESTRING((0 0,11, 12)(23,32,54)) MULTIPOLYGON((0 0, 40, 44,04, 00)(55, 56, 66, 65, 55)) GEOMETRYCOLLECTION(POINT(1 2), LINESTRING(0 0,11, 12)) Typ geometrii Współrzędne BRAK informacji o SRID!
PostGIS Prefiks ST (standard spatial type) zapis funkcji zgodnie ze standardem SQL/MM (SQL Multimedia Application Packages). bytea ST_AsBinary(geometry); text ST_AsText(geometry); geometry ST_GeomFromWKB(WKB, SRID); geometry ST_GeomFromText(WKT, SRID); np. ST_GeomFromText( POINT(1 3), -1) integer ST_SRID(geometry); Nie zwracają informacji o SRID
PostGIS INSERT INTO geotable( the_geom, the_name ) VALUES ( ST_GeomFromText( POINT(1 3), 312), Building ); SRID
PostGIS Obiekty przestrzenne obsługiwane przez PostGIS: A. zbiór obiektów prostych 2D ( Simple Features ) zdefiniowanych przez OGC; B. zbiór obiektów zdefiniowanych w układach 3DZ, 3DM i 4D; Definiowane za pomocą EWKT(Extended WKT) lub EWKB(Extended WKB). Połączony zapis z informacjąo SRID. Możliwość wystąpienia błędów. 3DZ : (X Y Z-Wysokośćn.p.m.) 3DM : (X Y M-Pomierzony parametr) 4D : (X Y Z M) bytea ST_AsEWKB(geometry); Zwracają informację o SRID text ST_AsEWKT(geometry); geometry ST_GeomFromEWKB(EWKB); geometry ST_GeomFromEWKT(EWKT);
PostGIS 3DZ POINT(000) LINESTRING(000,1 10,121) POLYGON(000, 400, 440,040,000)... 3DM POINTM(001) LINESTRINGM(000,1 10,121)... 4D POINT(0001) LINESTRING(0003,1 106,1217)... INSERT INTO geotable(the_geom, the_name) VALUES (ST_GeomFromEWKT( SRID=312;POINTM(1 3 4) ), Building );
PostGIS Simple Features Specification for SQL definiuje: typy danych przestrzennych, funkcje niezbędne do zarządzania danymi, metadane. Mamy dwie tabele metadanych: SPATIAL_REF_SYS GEOMETRY_COLUMNS SPATIAL_REF_SYS SRID (np. 4326-WGS84) AUTH_NAME AUTH_SRID SRTEXT PROJ4TEXT EPSG (European Petroleum Survey Group) organizacja ta opracowała szeroko stosowane kody identyfikujące poszczególne układy współrzędnych GEOMETRY_COLUMNS F_TABLE_CATALOG F_TABLE_SCHEMA F_TABLE_NAME F_GEOMETRY_COLUMN COORD_DIMENSION SRID TYPE
PostGIS SPATIAL_REF_SYS Tabela SPATIAL_REF_SYS zawiera informacje o ponad 3000 najczęściej wykorzystywanych układach współrzędnych. Zawiera również szczegóły umożliwiające transformację jednego układu współrzędnych w inny. Często wykorzystywane układy to: WGS84 Long Lat (SRID=4326) WGS84 World Mercator(SRID=3395) Informacje o układach współrzędnych można znaleźć: http://spatialreference.org
PostGIS GEOMETRY_COLUMNS CREATE TABLE geometry_columns( ) f_table_catalog VARCHAR (256) NOT NULL, f_table_schema VARCHAR (256) NOT NULL, f_table_nam VARCHAR (256) NOT NULL, f_geometry_column VARCHAR (256) NOT NULL, coord_dimension INTEGER NOT NULL, srid INTEGER NOT NULL, type VARCHAR (256) NOT NULL f_geometry_column nazwa kolumny zawierającej geometrię; coord_dimension wymiar przestrzenny (2, 3 lub 4); type typ geometrii (POINT, LINESTRING, POLYGON,..., GEOMETRY);
PostGIS Tworzenie bazy danych przestrzennych CREATE DATABASE my_spatial_db TEMPLATE=template_postgis;
PostGIS Wczytywanie danych Dane do bazy PostGIS/PostgeSQL możne wprowadzać: A. w formacie SQL; B. Shape file loader A. INSERT INTO house(id, geom, name) VALUES ( 1, ST_GeomFromText( POINT(12 34), -1), GreenH ); psql-d [database] -fhouse.sql
PostGIS Wczytywanie danych B. shp2pgsql Parametry: -d : usuń tabelę bazy danych przed utworzeniem tabeli z danymi zawartymi w shapefile; -a : dołącz dane z shapefile do istniejącej tabeli; -c : utwórz nową tabelę z danymi z Shapefile; (opcja domyślna); -i : tworzenie indeksu geometrii; shp2pgsql shaperoads myschema.roadstable > roads.sql psql-droadsdb-froads.sql
PostGIS Pobieranie danych Dane można pobrać korzystając: A. Z formatu SQL; B. Shape file dumper A. SELECTroad_id, ST_AsText(road_geom) ASgeom,road_nameFROMroads;
PostGIS Pobieranie danych B. pgsql2shape pgsql2shp [<options>] <database> [<schema>.]<table> pgsql2shp [<options>] <database> <query> Parametry: -f <filename> -h <host> -p <port> -P <password> pgsql2shp -f myfile p 5555 new_baza table_1 pgsql2shp -f "/path/to/streets" -h myserver -u apguser -P apgpassword mygisdb ma.streets
PostGIS ST_Box2D- zwraca BOX2D reprezentujący maksymalny zasięg obiektu przestrzennego. ST_Box3D- zwraca BOX3D reprezentujący maksymalny zasięg obiektu przestrzennego. ST_XMIN, ST_XMAX, ST_YMIN, ST_YMAX, ST_ZMIN, ST_ZMAX
PostGIS
PostGIS Metody PostGIS wymagają, aby geometrie obiektów na których operują były proste i poprawne. Geometria prosta (według specyfikacji OGC) to geometria, w której nie występują anomalne punkty (np. wewnętrzne przecięcia, wewnętrzna styczność). Najczęściej dotyczą obiektów zero- i jednowymiarowych. Poprawność geometrii odnosi się głównie do dwuwymiarowych obiektów (MULTI(POLYGON)) i definiuje zestaw twierdzeń charakteryzujących poprawny poligon. Przykład: POINT geometria prosta (zawsze). MULTIPOINT geometria prosta, jeżeli punkty nie mają identycznych współrzędnych.
PostGIS Tak Nie LINESTRING geometria prosta jeżeli linia nie przechodzi przez ten sam punkt wielokrotnie (oprócz punktu końcowego). Tak Nie MULTILINESTRING geometria prosta tylko wtedy jeżeli elementy multilinii mają geometrię prostą i punkty przecięcia występują tylko i wyłącznie na końcach (początkach) elementów. Tak Tak Nie
PostGIS POLYGON z definicji ma geometrię prostą; Tak Tak Nie Pierścienie poligonu muszą się zamykać. Pierścienie wewnętrzne definiujące okna muszą się znajdowaćwewnątrz pierścienia zewnętrznego poligonu. Pierścienie nie mogą się wewnętrznie przecinać. Pierścienie mogąsięstykaćale tylko w jednym punkcie. Granice to elementy proste. Nie Nie Nie Mogąreprezentowaćpoprawny MULTIPOLYGON
PostGIS MULTIPOLYGON jest poprawny jeżeli wszystkie jego elementy mają poprawną geometrię oraz wnętrza dwóch elementów nie przecinają się. Granice poligonów mogą się stykać ale jedynie w skończonej liczbie punktów. Nie
Sprawdzanie geometrii obiektów: ST_IsSimple(geometry) ST_IsValid(geometry)
Funkcje dla typu geometry ST_Length(); ST_Area(); ST_Perimeter(); ST_Distance(); ST_Buffer(); ST_Contains(); ST_Difference(); ST_SymDifference(); ST_Intersection(); ST_Disjoint(); ST_Intersects(); ST_Overlaps(); ST_Touches(); ST_Within(); ST_NRings(); ST_NumInteriorRings(); ST_AsText(); ST_GeomFromText(); ST_DWithin ST_Equals ST_RemoveRepeatedPoints ST_Union
float ST_Length(geometry geoma) Oblicza długość LINESTRING lub MULTILINESTRING. float ST_Area(geometry geoma) Oblicza pole powierzchni POLIGON lub MULTIPOLYGON.
float ST_Perimeter(geometry geoma) Oblicza obwód POLIGON lub MULTIPOLYGON. float ST_Distance(geometry geoma, geometry geomb) float ST_MaxDistance(geometry g1, geometry g2)
geometry ST_Buffer(geometry geoma, distance, options) Tworzy bufor o zadanej wielkości. Tylko 2D! 'quad_segs=#' 'endcap=round flat square' 'join=round mitre bevel'
boolean ST_Contains(geometry geoma, geometry geomb) Nie należy stosować tej funkcji do GEOMETRYCOLLECTION. Geometrie muszą być poprawne! TRUE FALSE
geometry ST_Difference (geometry geoma, geometry geomb) Nie należy stosować tej funkcji do GEOMETRYCOLLECTION. Przykład:
geometry ST_SymDifference (geometry geoma, geometry geomb) Nie należy stosować tej funkcji do GEOMETRYCOLLECTION.
geometry ST_Intersection(geometry geoma, geometry geomb) Nie należy stosować tej funkcji do GEOMETRYCOLLECTION. geometry ST_Union(geometry geoma, geometry geomb) Wynik: MULTI geometry SINGLE geometry GEOMETRYCOLLECTION
boolean ST_Disjoint (geometry geoma, geometry geomb) Zwraca TRUE jeżeli obiekty nie przecinają się. Nie należy stosować tej funkcji do GEOMETRYCOLLECTION.
boolean ST_Intersects (geometry geoma, geometry geomb) Zwraca TRUE jeżeli obiekty się przecinają.
boolean ST_Touches (geometry geoma, geometry geomb) Zwraca TRUE jeżeli obiekty mają chociaż jeden punkt wspólny i ich wnętrza nie przecinają się. Nie stosujemy dla par: punkt-punkt.
integer ST_NRings (geometry geoma) Jeżeli obiekt to POLYGON lub MULTIPOLYGON to zwracana jest liczba pierścieni, które te obiekty tworzą. integer ST_NumInteriorRings (geometry geoma) Zwraca liczbę wewnętrznych pierścieni dla pierwszego zdefiniowanego poligonu. Funkcję można stosować dla obiektów typu POLYGON oraz MULTIPOLYGON.
boolean ST_Within (geometry geoma, geometry geomb) Zwraca TRUE jeżeli obiekt geoma całkowicie znajduje się w obiekcie geomb. Jeżeli ST_Within(A,B) = T i ST_Within(B,A)=T t oznacza, że geometrie geoma i geomb są identyczne. geometry ST_RemoveRepeatedPoints (geometry geoma) Zwraca geometrię z pominięciem punktów powtarzających się.
boolean ST_Overlaps (geometry geoma, geometry geomb) Zwraca TRUE jeżeli obiekty dzielą wspólną przestrzeń, mają ten sam wymiar ale jedna nie zawiera się całkowicie w drugim. TRUE boolean ST_Equals (geometry geoma, geometry geomb) Zwraca TRUE jeżeli obiekty mają tą samą geometrię. Kolejność definiowania punktów charakterystycznych jest ignorowana. /ST_Within(A,B) = true and ST_Within(B,A)/
Obiekty w PostGIS POINT LINESTRING POLYGON MULTIPOLYGON MULTILINESTRING MULTIPOLYGON GEOMETRY COLLECTION WKT 3dm, 3dz, 4d EWKT + krzywe gładkie Brak wbudowanej definicji o SRID
Obiekty w PostGIS CIRCULARSTRING COMPOUNDCURVE CURVEPOLYGON MULTICURVE MULTISURFACE ------------------------- POLYHEDRALSURFACE TRIANGLE TIN
CIRCULARSTRING CIRCULARSTRING(0 0, 1 1, 1 0) punkt początkowy punkt na łuku punkt końcowy CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0) środek łuku Przy CIRCULARSTRING zawsze mamy zdefiniowaną nieparzystą(>1) liczbę punktów.
COMPOUNDCURVE COMPOUNDCURVE(CIRCULARSTRING(),()) łuk element liniowy COMPOUNDCURVE(CIRCULARSTRING(0 0, 0 1, 1 0),(1 0, 0 1)) Współrzędne muszą być identyczne!
CURVEPOLYGON CURVEPOLYGON może składać się z: CIRCULARSTRING LINESTRING COMPOUNDCURVE CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3),(4 3,4 5, 1 4, 0 0)),CIRCULARSTRING(1.7 1, 1.4 0.4, 1.6 0.4, 1.6 0.5, 1.7 1))
MULTICURVE MULTICURVE może składać się z: LINESTRING CIRCULARSTRING COMPOUNDCURVE MULTICURVE((0 0, 5 5),CIRCULARSTRING(4 0, 4 4, 8 4))
MULTSURFACE MULTISURFACE składa się ze zbioru obiektów, które mogą być typu: POLYGON CURVEPOLYGON MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 00),(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))) ST_LineToCurve ST_CurveToLine