交差する線をPostGISで結合する


15

これは私が尋ねることをほとんど恥じているものですが、私はそれが私の人生のために機能するように思えません。

セグメントを持つ道路レイヤーがあり、各セグメントにはRoad IDとセグメントがありますtype

すべてのセグメントRoad IDを1つのラインストリングに結合しますが、それらが同じでtypeあり、接触している場合のみ(すべてのラインがスナップされます)。

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

Road ID - Type
   1       L
   1       L
   1       T
   1       L

回答:


11

以下のコードは、いくつかの理由で選択された答えよりも少しきれいなソリューションだと思います。最初にテーブル結合が不要であるため、各ストリート属性に 'ON'句の補遺は必要ありません。次に、上記の方法論は、複数の非連続的なストリートのクラスターがある場合に複数のラインストリングを生成する可能性があります。 ST_Dumpはこのソリューションでこの問題を処理しますが、すべて同じ属性値です。

SELECT (ST_Dump(geom)).geom AS geom, "road_id", "road_type"
FROM (
    SELECT ST_LineMerge(ST_Union(geom)) AS geom, "road_id", "road_type"
    FROM "RoadCentreLines"
    GROUP BY "road_id", "road_type"
) AS street_union

私のジオメトリはどちらのクエリともマージされません
-Luffydude

@Luffydudeがもっと情報を提供してくれますか?それは、それがマージされるため、使用しているジオメトリは、それが可能であるように整列されていない可能性があります
グラントハンフリーズ

これは、道路IDに基づいて道路データセットをマージするのに非常に役立ちました。これにより、隙間のある道路がきれいに処理されました(隙間部分に線がありません)。私はOPではありませんが、これは素晴らしい答えです。これは受け入れられた答えでなければなりません。ありがとう。
jbalk

これがベストアンサーです!
アボルソ

6

これは動作しているようです

SELECT a."Road_ID",a."Road_Type", ST_LineMerge(ST_Collect(a.the_geom))
FROM "RoadCentreLines" as a 
LEFT JOIN "RoadCentreLines" as b ON 
ST_Touches(a.the_geom,b.the_geom) 
    AND a."Road_Type" = b."Road_Type" 
    AND a."Road_ID" = b."Road_ID"
GROUP BY ST_Touches(a.the_geom,b.the_geom), a."Road_Type", a."Road_ID"

0

ただ吐き出しますが、私は他のいくつかの解決策を考えることができます。彼らが良いか悪いかはわかりませんが、他の人たちだけです。

まず、道路の種類が数種類しかない場合は、次のようにタイプごとに移動できます。

WITH type As (SELECT "Road_ID" As id WHERE "Road_Type" = 'type')
SELECT ST_LineMerge (ST_Collect(the_geom))
FROM "RoadCentreLines"
WHERE ST_StartPoint(the_geom) && ST_EndPoint(the_geom) IS TRUE
AND "Road_ID" IN (SELECT id FROM type);

多数の型がある場合、FORループの変数としてRoad_Typeを使用して上記のほとんどを使用することもできます。

私の最後の考えは、すべてのジオメトリをマージしてから、ST_Line_Substring関数(Link-Link)を使用して道路タイプを呼び出すことでしたが、まったく機能しません。

頑張って、ロブ

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