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:
上記のコードの実際の出力は次のとおりです。
一方、上記の出力では、黄色の平行線(道路の両側にある最も近いポリゴンへのオフセット曲線)のみが必要です。
誰もが私に望ましい出力を得る方法を提案できますか?
実際の出力の画像も追加できますか?問題の理解に役立ちます。
—
傾斜
@tilt:質問を編集しました。実際の出力と必要な平行線を実際の出力に追加しただけです。
—
khajlk
問題はあなたが考えるよりも複雑です。喉の渇きは、家が通りのどちら側にあるかを知る必要があります。そうしてあなたは上の最も近い見つけることができます両方の側面。ここでは、正しい側を見つけるためのサンプルコードを持っている投稿は、次のとおりです。gis.stackexchange.com/questions/156578/...
—
チルト
実際には、建物が片側だけにある場合もあります(例外と呼びます)。目的の出力に到達したら、コードを変更して例外を処理できます。上の図では、まだ両側に建物のポリゴンが表示されています。この時点で、私の要件は、(図で示したような)通りの両側に平行な線を引くことです。リンクに関しては、サンプルコードを使用して、おそらく後で上記のコードを改善できます。
—
khajlk
私が目にすることの1つは、バッファが冗長であることです。stdwithinを使用し、距離として50を使用できます。(st_dwithin(通り、建物、50)である通り、建物を選択)
—
jbalk 2017