Bir sorguda zorluk yaşıyorum. Linestrings, her biri n_type sütununda bir değere sahip bir ağ var. Bu birkaç seçenekten biri olabilir. Aynı türden ve sürekli bir çizgi oluşturan herhangi bir linestrings gruplayan yeni bir tablo oluşturmak istiyorum.
Önce:
Sonra:
İşte şimdiye kadar aldığım şey. Sonuç döndürür ancak hiçbir anlam ifade etmez - türler eşleşmez ve çok fazla özellik döndürür.
Ayrıca, "sürekli" yi komşusunun 5 feet içindeki herhangi bir çizgi olarak tanımladığımı ve 30 dereceden daha az bir açıyla tanıştığımı lütfen unutmayın.
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
Özyinelemeli bir sorgu gitmek için yol olduğunu varsaydım, ama bu konuda yanlış kanıtlanmış için mutluyum. Özyinelemeleri grok yapmak biraz zordur.
Düzenleme: Ben de zaten ST_Union ve ST_Linemerge kullanarak toplama ve sonra sonuç damping denedim eklemeniz gerekir. Bu tür çalışır, ancak 30 dereceden fazla kavşakları hesaba katmaz ve ayrıca bağlantı için beş ayak toleransını onurlandıramaz.
a.pk_uid != b.pk_uid