Identyfikacja zależności topologicznych za pomocą PostGIS

16

Próbuję przeprowadzić podstawową analizę typologii za pomocą PostGIS. Moim celem jest znalezienie dowolnych wielokątów, które dotykają innych wielokątów. Aby to zrobić, pomyślałem, że ST_GetFaceEdgesto zadziała ( odniesienie ). Chcę sprawdzić każdy wielokąt w mojej bazie danych i wyświetlić listę wszystkich innych wielokątów, które go dotykają. Na poniższym obrazie spodziewałbym się, że wynik powie, że dwa wielokąty (które są budynkami) dotykają jednego budynku, a wyniki pozostałych 4 stwierdzą, że dotykają 0 wielokątów.

wprowadź opis zdjęcia tutaj

Mam jednak trudności ze zrozumieniem, co robić. Kiedy próbowałem skopiować przykład, było kilka jego części, których nie rozumiałem.

-- Returns the sequence, edge id
-- , and geometry of the edges that bound face 1
-- If you just need geom and seq, can use ST_GetFaceGeometry
SELECT t.seq, t.edge, geom
FROM topology.ST_GetFaceEdges('tt',1) As t(seq,edge)
    INNER JOIN tt.edge AS e ON abs(t.edge) = e.edge_id;

Nie jestem pewien, czy topologyjest to nazwa tabeli, kolumny czy części funkcji. Zakładałem, że to był stół, ale nie jestem pewien.

-- try out on sample of data
-- Table is called 'TestArea', column used is 'fid_1'
SELECT t.seq, t.edge, geom
FROM  TestArea.ST_GetFaceEdges('fid_1', 1) As t(seq,edge)
    INNER JOIN tt.edge AS e ON abs(t.edge) = e.edge_id;

Nie jestem również pewien, jaka jest funkcja sprzężenia wewnętrznego - czy to łączy wynik z oryginalnym obiektem?

djq
źródło
4
Wiem, że podmrok odpowiedział na to swoimi charakterystycznie czystymi diagramami, ale nie jestem pewien, czy twoje wielokąty są przede wszystkim spokrewnione topologicznie. Topologia w tym przypadku implikuje logiczny związek między jednostkami jako oddzielnymi od ich wizualnej reprezentacji i (w PostGIS) wymaga skonfigurowania schematu z CreateTopologyitd. ( Bit.ly/oLk8QY ) Ale sposób, w jaki budynki są zdigitalizowane, wydaje mi się jakby były topologicznie odrębne pomimo wizualnej bliskości ich krawędzi. Tylko coś, o czym powinni wiedzieć przyszli pytający.
MerseyViking,
Czy to oznacza, że ​​muszę dodać AddTopoGeometryColumntabelę przed uruchomieniem zapytania? W oparciu o wyniki z ST_Toucheswartości, które sprawdziłem, wszystkie miały sens, ale być może było to przypadkiem.
djq
1
Nie tylko będziesz musiał zadzwonić AddTopoGeometryColumn, ale Twoje dane będą musiały zostać zdigitalizowane w spójny topologicznie sposób. Na przykład, tradycyjnie digitalizowałbyś dwa bliźniacze domy jako dwa wielokąty i używałeś „przyciągania do wierzchołka” w swoim GIS, aby zapewnić, że wspólna ściana dotyka się, ale będzie przechowywana jako dwie zbieżne linie ze zbieżnymi punktami na każdym końcu. Ale digitalizacja ich topologicznie oznacza, że ​​wspólna ściana to tak naprawdę tylko jedna linia i dwa węzły wspólne dla każdego wielokąta. ST_Touchespo prostu sprawdza przestrzennie bliskość, a nie topologiczną.
MerseyViking

Odpowiedzi:

19

Zamiast tego możesz użyć ST_Touches :

ST_Touches - Zwraca wartość PRAWDA, jeśli geometrie mają co najmniej jeden wspólny punkt, ale ich wnętrza się nie przecinają.

ST_Touches zwraca PRAWDA dla np

wprowadź opis zdjęcia tutaj

Obliczanie liczby powinno działać mniej więcej tak:

SELECT a.id, count(*)
FROM polygon_table as a
JOIN polygon_table as b
  ON ST_Touches(a.the_geom,b.the_geom)
GROUP BY a.id
podmrok
źródło
Interesuje mnie jednak to, ile wielokątów dotknie każdy wielokąt. W przeciwnym razie jest idealny i mam go uruchomić!
djq
1
Właśnie zdałem sobie sprawę, że zwraca wartość prawda / fałsz dla każdego przypadku, więc wszystko, co muszę zrobić, to policzyć, ile jest prawdziwych wartości. Dzięki!
djq
5
Dodano możliwe zapytanie zliczające.
podmroku