Próbuję ustalić, gdzie drogi się przecinają, i wskazać punkt na tym skrzyżowaniu, podając liczbę dróg, które tworzą skrzyżowanie.
Zastanawiałem się, czy istnieje jakiś sposób wykorzystania ST_NumPoints, aby to osiągnąć, ale nie do końca wiem, co powinienem zrobić. Zrobiłem to, aby utworzyć tabelę punktów, w których linie przecinają się przy użyciu następującego kodu:
CREATE TABLE test_points as
SELECT
ST_Intersection(a.geom, b.geom),
a.gid
FROM
roads as a,
roads as b
WHERE
ST_Touches(a.geom, b.geom);
Jeśli uruchomię to na próbce dróg, otrzymam następującą siatkę punktów (drogi są pokazane dla ilustracji):
Jeśli sprawdzę jeden z punktów, zauważę, że na sobie ustawionych jest wiele punktów:
GID tutaj jest identyfikatorem drogi, ale nie rozumiem, dlaczego istnieje wiele punktów. Rozumiem, że 4 punkty są liczone za centralne skrzyżowanie dróg, ale jest tutaj 12 punktów. Czy istnieje lepszy sposób na wykonanie tego obliczenia w PostGIS?
COUNT()
takich jakCOUNT(ST_Touches(..))
i,COUNT(ST_Intersection(..))
ale wydaje się, że to nie działa, ponieważ wszystkie wartości są12
.Jest to trochę trudniejsze niż można się spodziewać. Jest tak, ponieważ nie ma dobrego sposobu analizowania relacji dla więcej niż par. Nie możesz wstawić trzech linii do funkcji i zapytać, czy wszystkie się przecinają.
Ale przynajmniej jednym podejściem może być znalezienie skrzyżowań, a następnie sprawdzenie, ile dróg styka się na każdym skrzyżowaniu (wszystko można zrobić w tym samym zapytaniu).
Jeśli twoje drogi idealnie się ze sobą łączą i nie ma żadnych dróg przechodzących przez skrzyżowanie, możesz zrobić coś takiego (nie testowane):
edytowane z zapomnianą klauzulą grupy (wciąż nie testowane):
Jeśli drogi nie są właściwie połączone i / lub niektóre drogi przechodzą przez skrzyżowanie, jest to bardziej skomplikowane.
HTH
Nicklas
źródło
distinct_crosspoints ,roads
moją nazwę tabeli (roads_test
)? Próbowałem tego, ale potem wystąpił błąd dotyczącygeom
niejednoznaczności.Jeśli linia A (id 1) przecina linię B (id 2), to potrzebujemy punktu przecięcia. Ale linia B przecina także linię A w tym samym punkcie. Ale nie potrzebujemy tego punktu dwa razy. Dlatego używam
a.gid < b.gid
zamiasta.gid != b.gid
źródło