PostGISで中心線に沿って平行線を計算する


10

PostgreSQLデータベースに通り(道路の中心線)とポリゴンテーブルを作成しています。サンプルシナリオは次のとおりです。

シナリオ例

問題:

通りの周りの50メートルのバッファーと両側の最も近い建物のポリゴンの交点で、通りに沿った平行線を計算する必要があります。望ましい出力シナリオは次のとおりです。

望ましい出力シナリオ

私が試したこと:

私のアプローチは:

 1) Generate 50m buffer around street layer
 2) get the intersection of buffer and polygons
 3) Compute the distance
 4) Draw offset curves (parallel lines) at both sides of street layer
 5) Merge both curves to get parallel lines at the intersection

これが私の試みです:

    WITH street_buffer AS (
     SELECT
      street.gid street_id,
      street.geom street_geom,
      ST_Buffer(street.geom, 50, 'endcap=square join=round') geom1,
      building.geom  geom2  
     FROM street
     LEFT JOIN building on ST_DWithin(building.geom, street.geom, 50)
     ORDER BY street_id
    ),
    selected_buildings AS (
     SELECT
      street_id,
      street_geom,
      ST_Intersection(geom1, geom2) geom
     FROM street_buffer
    ),
    distance AS (
     SELECT 
      street_id,
      street_geom,
      ST_Distance(street_geom, geom) as dist
     FROM selected_buildings 
    ),
    curves AS (
     SELECT 
      street_id,
      ST_OffsetCurve(ST_LineMerge(street_geom), dist) as curve1,
      ST_OffsetCurve(ST_LineMerge(street_geom), -dist) as curve2
     FROM distance
     ORDER BY street_id
    )
    SELECT 
     street_id,
     ST_Union(curve1, curve2) geom 
    FROM curves
    ORDER BY street_id

上記のコードの問題は、目的の出力に従って平行線が返されないことです。つまり、最も近いポリゴンの交点ではなく、すべてのポリゴンの交点に平行線が生成されます。

EDIT_1:

上記のコードの実際の出力は次のとおりです。

code_output

一方、上記の出力では、黄色の平行線(道路の両側にある最も近いポリゴンへのオフセット曲線)のみが必要です。

実際の出力に必要な行

誰もが私に望ましい出力を得る方法を提案できますか?


実際の出力の画像も追加できますか?問題の理解に役立ちます。
傾斜

@tilt:質問を編集しました。実際の出力と必要な平行線を実際の出力に追加しただけです。
khajlk

問題はあなたが考えるよりも複雑です。喉の渇きは、家が通りのどちら側にあるかを知る必要があります。そうしてあなたは上の最も近い見つけることができます両方の側面。ここでは、正しい側を見つけるためのサンプルコードを持っている投稿は、次のとおりです。gis.stackexchange.com/questions/156578/...
チルト

実際には、建物が片側だけにある場合もあります(例外と呼びます)。目的の出力に到達したら、コードを変更して例外を処理できます。上の図では、まだ両側に建物のポリゴンが表示されています。この時点で、私の要件は、(図で示したような)通りの両側に平行な線を引くことです。リンクに関しては、サンプルコードを使用して、おそらく後で上記のコードを改善できます。
khajlk

私が目にすることの1つは、バッファが冗長であることです。stdwithinを使用し、距離として50を使用できます。(st_dwithin(通り、建物、50)である通り、建物を選択)
jbalk 2017

回答:


1

距離CTEを次のように変更した場合:

distance AS (
 SELECT 
  street_id,
  street_geom,
  MIN(ST_Distance(street_geom, geom)) as dist
 FROM selected_buildings
 GROUP BY street_id, street_geom
)

次に、各ストリートの最短距離のみが返され、その距離で1組のオフセットラインが生成されます。


提案ありがとうございます。私はそれをテストし、それが期待される結果を与えるかどうかを確認します。私はこの問題を解決するためにいろいろと調べてきました。私は1つの奇妙なアイデアを発見しました:通りの周りの1 mのバッファーから開始し、プログラムでバッファーをインクリメントし、建物の数が2になるまで両側の建物を検索し、このバッファーの距離を通りの幅として返します。上記のすべてのエクササイズの最終的な目的。
khajlk 2017

提案を使用して生成されるオフセットのペアは1つだけです。ただし、上に表示されている黄色の平行線はまだありません:(
khajlk
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.