Przestrzenne bazy danych Funkcje relacji przestrzennych
Rodzaje relacji Analiza przecinania się Analiza różnic (ST_Difference, ST_SymDifference) Analiza najbliższego sąsiedztwa (ST_DWithin) Analiza obwiedni i porównawcza Analiza podobieństwa obiektów Macierze relacji (ST_Relate)
Relacja przestrzenna przecinanie się ST_Intersects, ST_Intersection, ST_Disjoin ST_Conatins(A,B), ST_Within(B,A) ST_Covers ST_Crosses ST_Touches
Przykrywanie ST_Covers ST_Covers różni się od funkcji ST_Contains tym że obiekt B może znajdować się na granicy obiektu A SELECT A.ex_name As a_name, B.ex_name As b_name, ST_Covers(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 WHERE NOT (ST_Covers(A.the_geom, B.the_geom) = ST_Contains(A.the_geom, B.the_geom));
Stykanie się obiektów ST_Touches SELECT A.ex_name As a_name, B.ex_name As b_name, ST_Touches(A.the_geom, B.the_geom) As a_tou_b, ST_Contains(A.the_geom, B.the_geom) As a_co_b FROM example_set As A CROSS JOIN example_set As B WHERE ST_Touches(A.the_geom, B.the_geom) ;
Analiza relacji przecinania się WITH example_set(ex_name,the_geom) AS( SELECT ex_name, the_geom FROM ( VALUES ('A 2d line', ST_GeomFromText('LINESTRING(3 5, 2.5 4.25, 1.6 5)') ), ('A point',st_geomfromtext( 'POINT(3 5 )')), ('A triangle',st_geomfromtext('polygon((3 5, 2.5 4.25, 1.9 4.9, 3 5))') ) ) AS foo(ex_name, the_geom) ) SELECT A.ex_name As a_name, B.ex_name As b_name, ST_Covers(A.the_geom, B.the_geom) As cover, ST_Contains(A.the_geom, B.the_geom) As contain, ST_Intersects(A.the_geom, B.the_geom) As inter, ST_Touches(A.the_geom, B.the_geom) As touch FROM example_set As A CROSS JOIN example_set As B;
Łączenie obiektów ST_Union SELECT ST_AsText(ST_Union( ST_GeomFromText( 'MULTIPOLYGON(((-77 56,-52 18,-88-27,-10-13,-11 38,-77 56)))'), ST_GeomFromText( 'MULTIPOLYGON(((-49 63,-32 24,-39-7,-66-19,-72-9,-74 31,-49 63)))')));
Przecinanie się ST_Intersection SELECT ST_AsText(ST_Intersection( ST_GeomFromText( 'MULTIPOLYGON(((-77 56,-52 18,-88-27,-10-13,-11 38,-77 56)))'), ST_GeomFromText( 'MULTIPOLYGON(((-49 63,-32 24,-39-7,-66-19,-72-9,-74 31,-49 63)))')));
Analiza Różnic Funkcja ST_Difference ST_Difference(A,B) = A Intersection(A,B) SELECT ST_Intersects(g1.geom1,g1.geom2) As they_intersect, GeometryType(ST_Difference(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;
Funkcja ST_Difference ST_Difference(obiektA, obiektb) SELECT ST_Intersects(g1.geom1,g1.geom2) As they_intersect, GeometryType(ST_Difference(g1.geom2, g1.geom1)) 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;
Funkcja ST_Difference (dwa poligony) SELECT ST_AsText(ST_Difference( ST_GeomFromText( 'MULTIPOLYGON(((-77 56,-52 18,-88-27,-10-13,-11 38,-77 56)))'), ST_GeomFromText( 'MULTIPOLYGON(((-49 63,-32 24,-39-7,-66-19,-72-9,-74 31,-49 63)))')))
Różnica symetryczna Funkcja ST_SymDifference ST_SymDifference(A,B) = Union(A,B) Intersection(A,B) SELECT ST_Intersects(g1.geom1,g1.geom2) As they_intersect, GeometryType(ST_SymDifference(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;
Różnica symetryczna Funkcja ST_SymDifference SELECT ST_AsText(ST_SymDifference( ST_GeomFromText( 'MULTIPOLYGON(((-77 56,-52 18,-88-27,-10-13,-11 38,-77 56)))'), ST_GeomFromText( 'MULTIPOLYGON(((-49 63,-32 24,-39-7,-66-19,-72-9,-74 31,-49 63)))')));
Najbliższe sąsiedztwo Relację najbliższego sąsiedztwa realizuje funkcja ST_DWithin Funkcja ST_DWithin zastępuje funkcję ST_Intersects wtedy gdy obiekty są blisko siebie ale nie przecinają się SELECT ST_DWithin( ST_GeomFromText('LINESTRING(1 2, 3 4)'), ST_Point(3.00001,4.000001), 0.0001 ) ;
Wyszukiwanie N najbliższych obiektów
Obwiednia (bounding box) Każdy obiekt geometryczny posiada swoją obwiednię w postaci prostokąta w całości przykrywającego obiekt Przestrzenne bazy danych wykorzystują obwiednię obiektów geometrycznych do porównywania obiektów SELECT ex_name, ST_Box2D(the_geom) As bbox2d, the_geom FROM ( VALUES ('A line', ST_GeomFromEWKT('LINESTRING (3 5, 3.4 4.5, 4 5)')), ('A multipoint',st_geomfromtext('multipoint (4.4 4.75, 5 5)')), ('A triangle', ST_GeomFromText('POLYGON ((2 5, 1.5 4.5, 2.5 4.5, 2 5))') ) ) AS foo(ex_name, the_geom);
Obwiednia i operatory geometrii Operator Co sprawdza BOX(A) operator BOX(B) index && &< &> Zwraca TRUE jeżeli obwiednie obiektów A i B przecinają się Zwraca TRUE jeżeli obwiednia obiektu A przykrywa lub jest na lewo obwiedni obiektu B Zwraca TRUE jeżeli obwiednia obiektu A przykrywa lub jest na prawo obwiedni obiektu B = Zwraca TRUE jeżeli obwiednia obiektu A jest taka sama jak obwiednia obiektu B @ Zwraca TRUE jeżeli obwiednia obiektu A jest zawarta w obwiedni obiektu B ~- Zwraca TRUE jeżeli obwiednia obiektu A jest zawiera obwiednię obiektu B >> Zwraca TRUE jeżeli obwiednia obiektu A jest dokładnie na prawo obwiedni obiektu B << Zwraca TRUE jeżeli obwiednia obiektu A jest dokładnie na lewo obwiedni obiektu B gist gist gist btree gist gist gist gist
Obwiednia i operatory geometrii SELECT ST_GeomFromText( 'MULTIPOLYGON(((-77 56,-52 18,-88-27,-10-13,-11 38,-77 56)))') && ST_GeomFromText( 'MULTIPOLYGON(((-49 63,-32 24,-39-7,-66-19,-72-9,-74 31,-49 63)))') As Compare;
Podobieństwo obiektów Podobieństwo przestrzenne (obiekty zajmują tą samą przestrzeń ale mogą różnić się kolejnością punktów) ST_Equals Podobieństwo geometryczne (ta sama przestrzeń ta sama kolejność punktów) ST_Ordering_Equals Podobieństwo obwiedni obiekty mają te same zawierające się w sobie obwiednie (=)
Podobieństwo geometryczne ST_OrderingEquals i przestrzenne ST_Equals
Podobieństwo geometryczne ST_OrderingEquals i przestrzenne ST_Equals Wszystkie obiekty są podobne do siebie geometrycznie Poligon samo-przecinający się jest podobny do siebie geometrycznie ale nie przestrzennie, pozostałe obiekty są do siebie podobne przestrzennie Do swojej wersji po odwróceniu kolejności punktów podobny geometrycznie jest jedynie punkt Żaden z obiektów nie jest podobny geometrycznie do swojej wersji wielopunktowej
Podobieństwo obwiedni Podobieństwo obwiedni (=) Podobieństwo geometrii ST_OrderingEquals Obiekty mają takie same obwiednie ale różnią się pod względem geometrii
Macierze przecinania się obiektów geometrycznych Macierz przecinania się jest oparta na standardzie DE-9IM (Dimensionally Extended 9 Intersection matrix) zgodnym z OpenGIS OGC/SQL-MM Macierz przecinania się to macierz 3x3 między polami wnętrze(interior), granica(boundary) i obszar zewnętrzny (Exterior) dla dwóch obiektów A i B Możliwe wartości w macierzy to: T przecinanie musi zaistnieć F przecinanie nie może zaistnieć * - nie ma znaczenia czy przecinanie zaistnieje 0 przecinanie musi zaistnieć w wymiarach dla punktu (dim=0) 1 - przecinanie musi zaistnieć w wymiarach dla linii (dim=1) 2- przecinanie musi zaistnieć w wymiarach dla poligonu (dim=2)
Podobieństwo przestrzenne Spatial equality ST_Equals Podobieństwo przestrzenne w macierzy przecinania się dla obiektów A i B występuje wtedy gdy obiekty geometryczne zbudowane z różnych punktów lub punktów w odwróconej kolejności zajmują tę samą przestrzeń (T*F**FFF*)
Testowanie ST_Equals
Testowanie ST_Equals Wszystkie obiekty z wyjątkiem poligonu samo-przecinającego się spełniają warunki macierzy podobieństwa (T*F**FFF*) w stosunku do swoich odwrotności
Macierz przecinania z ST_Relate Metody zastosowania ST_Relate Pobiera dwa obiekty geometryczne i zwraca macierz relacji np. ST_Relate(A.geom, B.geom) Pobiera dwa obiekty geometryczne i macierz relacji i zwraca prawdę lub fałsz, w zależności czy obiekty spełniają ograniczenia określone przez macierz np. ST_Relate(A.geom, B.geom, FF*FF****)
Macierz przecinania z ST_Relate
Macierz przecinania z ST_Relate
Macierz przecinania z ST_Relate Wnętrza trójkąta i linii nie przecinają się Wnętrze trójkąta nie przecina się z granicą linii (granice linii to punkty początkowy i końcowy) ale wnętrze linii przecina się z granicą trójkąta i wymiarem tego jest linia Tylko w przecięciu obszarów zewnętrznych linii i wewnętrznych i zewnętrznych trójkąta uzyskujemy przecięcie powierzchniowe (dim=2)
ST_Relate http://workshops.boundlessgeo.com/postgis-intro/de9im.html
ST_Relate 1 0 1 0 F 0 2 1 2