Mam problem z zapytaniem. Mam sieć łączników, każdy z wartością w kolumnie n_type. Może to być jedna z kilku opcji. Chciałbym wygenerować nową tabelę, która grupuje wszystkie linie tego samego typu i tworzące linię ciągłą.
Przed:
Po:
Oto co mam do tej pory. Zwraca wyniki, ale nie mają one sensu - typy nie pasują do siebie i zwraca zbyt wiele funkcji.
Należy również pamiętać, że zdefiniowałem „ciągły” jako każdą linię w odległości 5 stóp od swojego sąsiada i spotykającą się pod kątem mniejszym niż 30 stopni.
WITH RECURSIVE all_links (i, pk_uid, n_type, geom) AS (
SELECT 1 AS i,
pk_uid,
n_type,
geom
FROM network
WHERE n_type != 'none'
UNION ALL
SELECT a.i + 1,
b.pk_uid,
b.n_type,
b.geom
FROM network b, all_links a
WHERE b.n_type = a.n_type
AND b.geom <#> a.geom <= 5 --lines are continuous if within 5 feet of neighbor
AND ABS( DEGREES( 3*pi() - st_azimuth(st_startpoint(a.geom),st_endpoint(a.geom)) + st_azimuth(st_startpoint(b.geom),st_endpoint(b.geom)))::int % 360 - 180) <= 30 ) --only take links within 30 degrees of the same angle
SELECT i, n_type, ST_Union(the_geom) FROM all_links GROUP BY i, n_type
Założyłem, że właściwym rozwiązaniem jest zapytanie rekurencyjne, ale cieszę się, że udowodniono mi błąd. Rekursywne są trochę trudne do zdobycia.
Edycja: Powinienem również dodać, że próbowałem już agregować przy użyciu ST_Union i ST_Linemerge, a następnie zrzucić wynik. Ten rodzaj działa, ale nie uwzględnia przecięć> 30 stopni, a także nie może honorować tolerancji pięciu stóp dla łączności.
a.pk_uid != b.pk_uid