ライン接続に基づくPostGIS再帰クエリ


9

クエリに問題があります。n_type列に値を持つラインストリングのネットワークがあります。これは、いくつかのオプションの1つです。同じタイプで連続したラインを形成するラインストリングをグループ化した新しいテーブルを生成したいと思います。

前:

ここに画像の説明を入力してください

後:

ここに画像の説明を入力してください

これが私がこれまでに得たものです。結果を返しますが、意味がありません。型が一致せず、返される機能が多すぎます。

また、「連続的」とは、その隣から5フィート以内にあり、30度未満の角度で交わる線として定義したことに注意してください。

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

私は再帰クエリが進むべき道であると想定しましたが、それについて間違っていることが証明されてうれしいです。再帰的なことは少し難しいです。

編集:また、ST_UnionとST_Linemergeを使用して集計し、結果をダンプしようとしたことも追加する必要があります。この機能は機能しますが、30度を超える交差点を考慮しておらず、接続の5フィートの許容範囲を守ることができません。


これについて深く掘り下げることなく、いくつかの観察。select句でa.geomとb.geomを結合する必要があります。あなたはおそらく、あなたがしようとしてだけでなく、それ自体へのラインに参加していないことを確認する必要がありますa.pk_uid != b.pk_uid
MickyT

@MickyTありがとう。最後のSELECT句でユニオンを実行できるが、当面はすべての結果を確認できるように*を選択しただけであることを述べたはずです。コードスニペットを変更して、最終的にどのようになるかを示します。
spencerrecneps 2015

再帰的なクエリを理解するのは困難です。笑と+1
ジョンパウエル

ざっと見てみると、ベース/アンカークエリに問題がある可能性があります。A、B、Cなどの各行の開始点を選択する必要があります。これは、再帰部分で作成します。おそらく、何らかの種類の順序をアンカークエリに追加する必要があります(おそらく、xまたはyの方向で、データを見ないと分からないでしょう)。これを分解して、再帰部分を続行する前に、最初に適切な開始点を取得していることを確認します。(ISH)私は最近、時系列の筋を見つけるために再帰クエリを使用して、私はアンカーポイントが正しく識別したら、残りは簡単だった
ジョン・パウエル

@dbaston。良い点ですが、これは再帰クエリでも行うことができ、誰もがそれをインストールしているわけではありません。
John Powell、

回答:


1

あなたの解決策は、少なくとも、JohnBarçaが言ったように、ラインコンポーネントの事前注文が欠けていることです。

再帰クエリは非常に非常に難しいです。

新しいデータベース関数でST_Linemergeの動作を複製する必要があります。まず、ST_Linemerge実装のソースを確認して複製し、それを変更して30度の角度の単収縮を生成します。

角度が30度未満のセグメントを集約から破棄するには、集約ループ内でそれらを比較する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.