Przestrzenne bazy danych Funkcje geometryczne
SQL/MM SQL/MM (SQL Multimedia and Application Packages) standard uzupełniający język SQL o obsługę zaawansowanych typów danych, składa się części: Framework zawiera ona definicje i koncepcje wspólne dla pozostałych, specjalistycznych części standardu. Dotyczy między innymi sposobu, w jaki inne części standardu SQL/MM wykorzystują mechanizm obiektowych typów SQL. Full-Text definiuje typy danych do składowania dużych obiektów tekstowych, skupiając się na wsparciu dla operacji wyszukiwania zadanych wzorców w tekście. Spatial definiuje typy danych wspierające aplikacje przetwarzające dane przestrzenne. W obecnej wersji standardu wsparcie ograniczone jest do obiektów 0- wymiarowych (punktów), 1-wymiarowych (linii) i 2-wymiarowych (figur płaskich). Still Image definiuje typy danych do obsługi obrazów w bazie danych, ze szczególnym naciskiem na wyszukiwanie obrazów ze względu na zawartość. Data mining eksploracja danych, wyszukiwanie wzorców i reguł w dużych zbiorach danych
SQL/MM Spatial Zgodnie z standardem SQL/MM wszystkie obiekty i funkcje posiadają prefix ST_ (spatial type) Hierarchia typów obiektów zgodna z SQL
Funkcje geometryczne (jednoobiektowe) Funkcje konstruujące Funkcje exportujące dane do zewnętrznych formatów Funkcje pobierające i ustawiające atrybuty geometrii Funkcje rozdzielające obiekty geometryczne Funkcje łączące obiekty geometryczne Funkcje pomiarowe Funkcje kontrolujące poprawność geometrii
Funkcje konstruujące Tworzenie obiektów geometrycznych z WKT i WKB (well-known text i binary) Tworzenie obiektów geometrycznych z istniejących już obiektów
Tworzenie obiektów geometrycznych z WKT i WKB (well-known text i binary) ST_GeomFromText - funkcja do tworzenia obiektów 2d (dostępna w innych SQL/MM) INSERT INTO my_geometries (geom) VALUES (ST_GeomFromText('POINT(-100 28)',4326)), (ST_GeomFromText('LINESTRING(-80 28, -90 29)',4326)), (ST_GeomFromText('POLYGON((10 28, 9 29, 7 30, 10 28)),4326)); ST_GeomFromEWKT - funkcja dekodująca układ odniesienia i obsługująca wymiary 3d i 4d (dostępna jedynie w PostGIS) INSERT INTO my_geometries (geom) VALUES (ST_GeomFromEWKT('SRID=4326;POINT(-100 28)')), (ST_GeomFromEWKT('SRID=4326;LINESTRING(-80 28,-90 29)')), (ST_GeomFromEWKT('SRID=4326;POLYGON((10 28, 9 29, 7 30, 10 28)); ST_GeomFromWKB funkcja do tworzenia obiektów na podstawie binarnej reprezentacji danych (dostępna w innych SQL/MM) SELECT ST_GeomFromWKB(E'\\001\\001\\000\\000\\000\\321\\256B\\312O\\304Q\\300\\34 7\\030\\220\\275\\336%E@',4326);
Funkcje exportujące Funkcje eksportujące do WKT i WKB (ST_AsText, ST_AsBinary) Keyhole markup language (KML) format oparty XML stosowany w Google Maps Geography markup language (GML) format oparty na XML zgodny z OGC Geometry JavaScript object notation (GeoJSON) Scalar vector graphics (SVG) format geometrii 2d bez SRID Geohash format przechowujący informacje o współrzędnych SELECT ST_AsGML(geom,5) As GML, ST_AsKML(geom,5) As KML, ST_AsGeoJSON(geom,5) As GeoJSON, ST_AsSVG(geom,0,5) As SVG_Absolute, ST_AsSVG(geom,1,5) As SVG_Relative, ST_GeoHash(geom) As Geohash FROM (SELECT ST_GeomFromText('LINESTRING(2 48, 0 51)', 4326) As geom) foo;
Funkcje zarządzające atrybutami geometrii Ustawiania układu odniesienia (SRID) Transformacja współrzędnych Nazwa typu geometrii Ustawianie współrzędnych i wymiarów przestrzennych
Ustawianie układu odniesienia (SRID) ST_SRID() pobieranie układu odniesienia (zgodna z SQL/MM) ST_SetSRID() ustawianie układu odniesienia (zgodna z SQL/MM)
Transformacja współrzędnych ST_Transform() konwertuje współrzędne z jednego układu współrzędnych do drugiego przy użyciu biblioteki proj4 Zmiana współrzędnych z układu WGS-84 Lon Lat na WGS-84 UTM Zone 18N SELECT ST_AsEWKT(ST_Transform(ST_GeomFromEWKT('SRID=4326;LINES TRING(-73 41, -72 42)'), 32618)); Wynik działania to nowe współrzędne: SRID=32618;LINESTRING(668207.88519421 4540683.52927698, 748464.920715711 4654130.89132385)
Nazwa geometrii ST_geometryType zwraca nazwę typu POLYGON jako ST_Polygon zgodnie z SQL/MM SELECT ST_GeometryType(geom) As new_name, GeometryType(geom) As old_name FROM (VALUES (ST_GeomFromText('POLYGON((0 0, 1 1, 0 1, 0 0))')), (ST_Point(1, 2)), (ST_MakeLine(ST_Point(1, 2), ST_Point(1, 2))), (ST_Collect(ST_Point(1, 2), ST_Buffer(ST_Point(1, 2),3))), (ST_LineToCurve(ST_Buffer(ST_Point(1, 2), 3))), (ST_LineToCurve(ST_Boundary(ST_Buffer(ST_Point(1, 2), 3)))), (ST_Multi(ST_LineToCurve(ST_Boundary(ST_Buffer(ST_Point(1, 2),3))))) ) As foo (geom);
Wymiary układu i wymiary obiektu ST_CoordDim() pobiera wymiary układu odniesiona ST_Dimension() pobiera wymiary obiektu geometrycznego
Funkcje pomiarowe Pomiary obiektów geometrycznych na powierzchni płaskiej (planar measures) Pomiary obiektów geometrycznych na powierzchni kuli (spherical measures)
Pomiary obiektów geometrycznych na powierzchni płaskiej ST_Length, ST_Length3D pomiary linii, w 3D dodatkowo w wymiarze z, wyniki pomiarów są uzależnione od układu odniesienia ST_Distance odlegośći między obiektami ST_Area powierzchnia poligonów ST_Perimeter obwód poligonów i zamkniętych linii
ST_Length SELECT feature_type, sum(st_length(geom))/1000 AS length_km FROM gis.wp_linestrings GROUP BY feature_type ORDER BY length_km DESC;
Pomiary obiektów geometrycznych i geograficznych na powierzchni kuli i geoidy Pomiary typu geograficznego są wykonywane w przestrzeni układu w stopniach WGS-84 lan lat ale wyniki zwracane są w metrach ST_Length(geography, boolean) pomiar długości linii na geoidzie (true) lub idealnej kuli (false) ST_Length_Spheroid(geometry,boolean) pomiar długości linii na geoidzie lub idealnej kuli (false) ST_Distance(geography, geography) - pomiar najkrótszej odległości na modelu geoidy, ST_Distance_Spheroid(geometry, geometry,spheroid) - pomiar na modelu geoidy, ST_Distance_Sphere(geometry,geometry) - pomiar na idealnej kuli
Pomiary długości na powierzchni kuli i geoidy
Pomiary odległości na powierzchni kuli i geoidy
Funkcje dekompozycyjne ST_Box2D, ST_Envelope ST_X, ST_Y ST_Boundary ST_Centroid, ST_PointOnSurface ST_Dump, ST_GeometryN
ST_Box2D Funkcja ST_Box2D generuje najmniejszy prostokąt (nie jest on obiektem geometrycznym), do którego można wpisać obiekt. Aby uzyskać prostokąt jako obiekt geometryczny należy zastosować funkcję ST_Envelope
Rozdzielanie obiektów ST_Boundary ST_Boundary pobiera dowolny obiekt geometryczny i zwraca obiekty będące składnikami pobieranego obiektu np. Otwarta linia zwraca wielopunkt składający się z punktu początkowego i punktu końcowego Poligon zwraca linię obejmującą obszar poligonu Poligon z pustymi polami zwraca wielolinię
Rozdzielanie obiektów ST_Boundary
Rozdzielanie obiektów (ST_Boundary) INSERT INTO polygon_poznan(name,way) VALUES ('obwód Jeziora Maltańskiego', (SELECT ST_Boundary(way) FROM planet_osm_polygon WHERE name='jezioro Maltańskie'));
Rozdzielanie obiektów ST_Centroid ST_Centroid, ST_PointOnSurface zwracają punkt centralny obiektu geometrycznego Gwiazdka pokazuje umiejscowienie punktu ST_Centroid ST_PointOnSurface
Rozdzielanie obiektów ST_Centroid INSERT INTO point_poznan(name,way) VALUES ('Jezioro Maltańskie', (SELECT ST_Centroid(way) FROM planet_osm_polygon WHERE name='jezioro Maltańskie'));
Rozbijanie obiektów złożonych ST_Dump() -rozbija złożone do najprostszej postaci ST_GeometryN() - rozbija obiekty złożone na prostsze tylko o jeden poziom
ST_Dump
ST_GeometryN
Tworzenie poligonów z innych obiektów ST_MakePolygon tworzy poligon z zamkniętej linii, akceptuje dodatkowo zamknięte linie wewnętrzne ST_BuiltArea tworzy poligon z linnii, wielolinii, poligonów i wielopoligonów w efekcie powstają poligony i wielopoligony ST_Polygonize funkcja agregująca, pobiera linie i zwraca wszystkie możliwe kombinacje poligonów INSERT INTO polygon_poznan(name,way) VALUES ('obręb_gdańskiej', (SELECT ST_AsEWKT(ST_Polygonize(way)) FROM planet_osm_line WHERE name='gdańska'));
Kontrola poprawności geometrii (validity) 6 5 7 2 3 4 1 9 8
Funkcje geometryczne relacyjne
Przestrzenne relacje między obiektami W zwykłych bazach danych można wykonywać analizy relacji między takimi obiektami jak liczby (dodawanie, mnożenie i inne obliczenia), łańcuchy znaków (łączenie, rozdzielanie, porównywanie i inne) W przestrzennej bazie danych można dokonywać analiz relacji pomiędzy obiektami geometrycznymi umiejscowionymi w przestrzeni geograficznej Funkcje do analiz przestrzennych relacji akceptują na wejściu dwa obiekty geometryczne, a na wyjściu zawracają wartość logiczną lub inny obiekt geometryczny Jeżeli chcemy np. sprawdzić czy jeden obiekt zwiera w swoim obszarze inny obiekt możemy użyć funkcji ST_Contains ST_Contains(geom1, geom2) co można czytać geom1 contains geom2
Analiza relacji między obiektami Przecinanie się obiektów Porównywanie obiektów Najbliższe sąsiedztwo Relacje warunkowe
Relacja przecinania się Interior - wnętrze obiektu Boundary - granica Exterior - obszar zewnętrzny
Przecinanie się obiektów ST_Intersects funkcja pobiera dwa obiekty i zwraca prawdę, jeżeli obiekty przecinają się ST_Intersection funkcja pobiera dwa obiekty i zwraca obiekt geometryczny będący wspólnym obszarem SELECT ST_Intersects(g1.geom1,g1.geom2) As they_intersect, GeometryType(ST_Intersection(g1.geom1, g1.geom2)) As intersect_geom_type FROM (SELECT ST_GeomFromText('POLYGON((2 4.5,3 2.6,3 1.8,2 0,- 1.5 2.2,0.056 3.222,-1.5 4.2,2 6.5,2 4.5))') As geom1, ST_GeomFromText('LINESTRING(-0.62 5.84,-0.8 0.59)') As geom2) As g1;
Specyficzne przypadki przecinania się obiektów Funkcja ST_Contains - Jeżeli obiekt A jest w wewnątrz obiektu B to obiekt B zawiera (contains) obiekt A - Obiekt A nie może przecinać (intersects) się z granicą obiektu B - Obiekt geometryczny nie zawiera swojej granicy tylko to co znajduje się wewnątrz
Przykład zastosowania ST_Contains CREATE TABLE example_set(ex_name varchar(150) PRIMARY KEY, the_geom geometry); INSERT INTO example_set(ex_name, the_geom) VALUES ('A polygon with hole', ST_GeomFromText('POLYGON ((110 180, 110 335, 184 316, 260 335, 260 180, 209 212.51, 110 180), (160 280, 200 240, 220 280, 160 280))') ), ('A point',st_geomfromtext('point(110 245)')), ('A linestring',st_geomfromtext('linestring(110 245,200 260, 227 309)')), ('A multipoint',st_geomfromtext('multipoint(110 245,200 260)')) ;
Przykład ST_Contains SELECT A.ex_name As a_name, B.ex_name As b_name, ST_Contains(A.the_geom, B.the_geom) As a_co_b, ST_Intersects(A.the_geom, B.the_geom) As a_in_b FROM example_set As A CROSS JOIN example_set As B;
ST_Contains: Wnioski Wszystkie obiekty przecinają się Poligon nie zawiera wielopunktu, ale wielopunkt przecina się z poligonem Linia nie zawiera punktu znajdującego się na jej końcu ale zawiera wielopunkt Jeżeli obiekt B znajduje się na granicy obiektu A, to obiekt A nie zawiera obiektu B Wszystkie obiekty zawierają samych siebie