Hat Bağlantısına Dayalı PostGIS Özyinelemeli Sorgu


9

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:

resim açıklamasını buraya girin

Sonra:

resim açıklamasını buraya girin

İş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.


Bunun derinliklerine inmeden birkaç gözlem. Seçme maddenizde a.geom ve b.geom'u birleştirmeniz gerekir. Muhtemelen kendisiyle de bir çizgiye a.pk_uid != b.pk_uid
katılmadığınızdan emin olmalısınız

@MickyT teşekkürler. Sendikayı son SELECT yan tümcesinde yapabileceğimi söylemiş olmalıydım, ancak şimdilik seçtim *, böylece tüm sonuçları görebiliyorum. Kod snippet'imi sonunda neye benzemesi gerektiğini göstermek için değiştireceğim.
spencerrecneps

Özyinelemeli sorgulama yapmak zor. Lol ve +1
John Powell

Hızlı bir bakış, temel / bağlantı sorgunuzla ilgili sorun yaşayabileceğinizi gösterir. Daha sonra özyinelemeli kısımda oluşturduğunuz her bir çizgi, A, B, C vb. İçin başlangıç ​​noktasını seçmeniz gerekir. Büyük olasılıkla bağlantı sorgusuna bir tür sipariş eklemeniz gerekir (belki x veya y'de, yön - verileri görmeden bilmek zor). Bunu yıkarım ve özyinelemeli bölümle devam etmeden önce ilk olarak mantıklı başlangıç ​​noktaları elde ettiğimden emin olurdum. Son zamanlarda zaman serilerinde çizgileri bulmak için özyinelemeli bir sorgu kullandım ve bağlantı noktalarını doğru bir şekilde tanımladıktan sonra, geri kalanı kolaydı (ish)
John Powell

@dbaston. İyi bir nokta, ancak bunu yinelemeli bir sorgu ile de yapabilirsiniz ve herkesin henüz yüklememiş olması gerekir.
John Powell

Yanıtlar:


1

John Barça'nın dediği gibi çözümünüzün en azından hat bileşenlerinin ön sırasını kaçırması.

Özyinelemeli sorgulamaların çok, çok zor olduğunu söyleyebilirim.

ST_Linemerge davranışını yeni bir veritabanı işlevinde çoğaltmayı denemelisiniz. Önce bir ST_Linemerge uygulamasının kaynağına bakıp çoğaltarak, 30 derecelik açı seğirmesini üretmek için değiştirmeyi denerdim.

Toplamadan <30 ° 'lik bir açıda olmayan segmentleri atmak için bunları bir toplama döngüsünün İÇİNDE karşılaştırmalısınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.