PostGISポリゴンエッジ分析(方向、エッジ長)


9

私はGISの世界、特にPostGISの世界にはかなり慣れていないので、答えが明らかな場合は失礼します...

多くの建物の分析をしたいと思います。私が興味を持っていることの1つは、それぞれの方向に沿ったファサードの表面です。下の図に示すように、一連のポリゴンのすべてのエッジの長さと(通常の)方向を設定したいと思います。この例では、1つのサーフェスのみを強調表示しています。

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

結果テーブルは次のようになります。

building_id | edge_id | orientation | edge_length
-------------------------------------------------
      1     |    1    |     315     |    10.0
      1     |    2    |      45     |     7.0
      1     |   ...   |     ...     |     ...

しかし、それをさらに処理するために結果を格納するスマートな方法であるかどうかはわかりません(たとえば、エッジから次の建物までの距離を計算するなど)。だから私の質問は2つあります:

  1. ポリゴンのエッジを分析できる効率的なPostGIS関数はありますか?ネイティブのPostGIS関数がない場合は、代わりにPythonベースのアプローチに興味があります。
  2. ポリゴンには異なる数のエッジがある可能性があるため、結果をPostGISテーブルに格納するためのスマートな方法は何でしょうか?

2
まず、ポリゴンのセグメントを作成します。stackoverflow.com/questions/7595635/...を次に始点と終点の座標がx1、y1とx2、y2とST_Azimuthより(ST_Startpoint(ジオメトリ)、ST_Endpoint(ジオメトリ))のような列に行くべき。(postgis.org/docs/ST_Azimuth.html
タマス黄砂

1
@TamasKosa:あなたは良い答えの本質を持っています。一つに拡大してみませんか?また、法線の場合、方位角には+/- pi / 2が必要です。
マーティンF

1
@TamasKosaこれも私が考えていたアプローチです。ST_ExteriorRingを使用してから、方位角を取得します。建物にはさまざまな数のエッジがあるため、理想的には結果をどのように保存しますか?私が上記のようなテーブルで?MartinFに同意します。これはほぼ答えです;)
n1000

ちょうど好奇心が強い、なぜあなたは法線...太陽の露出をしたいのですか?
マーティンF

1
質問の最初の部分が回答されました。ST_DumppointsとST_Azimuthを使用できます。2番目の部分では、出力への空間要素がないため、ポリゴンIDとedge_idへのリンクがあると思います。
John Powell

回答:


10

昨日私はそれを詳細に作成する時間がありませんでした... 4つのステップで私の解決策を参照してください:

CREATE OR REPLACE VIEW bd_segment AS
SELECT
      ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) AS sp,
      ST_PointN(geom, generate_series(2, ST_NPoints(geom)  )) AS ep
    FROM
       -- extract the individual linestrings
       (SELECT (ST_Dump(ST_Boundary(the_geom))).geom
       FROM bd) AS linestrings;

CREATE OR REPLACE VIEW bd_segment_geom AS
SELECT sp, ep, st_makeline(sp, ep) 
FROM bd_segment;

CREATE OR REPLACE view bd_segment_id AS 
SELECT bd.gid, row_number() 
    OVER (order by bd.gid), degrees(st_azimuth(ff.sp, ff.ep)-1.57079633) AS az_deg,
    ST_LENGTH(ff.st_makeline) , ff.st_makeline FROM bd_segment_geom ff
JOIN bd ON st_touches(ff.st_makeline, bd.the_geom)
GROUP BY bd.gid, ff.sp, ff.ep, ff.st_makeline;

UPDATE bd_segment_id
SET az_deg = az_deg + 360
WHERE az_deg < 0;

最後のクエリは、st_touchesを使用した空間結合で建物IDを提供します。それが役に立てば幸い。更新-qgisでは、ソリューションは次のようになります。 ここに画像の説明を入力してください


1
印象的!うまくいきました。どうもありがとうございます!建物が多いと少し遅くなります。現在、方位角は法線ではありません。また、それに対処する方法について考えがありますか?ポリゴンの「外側」の辺を見つける方法がわかりません。
n1000

1
次のように、ラジアンの方位角に90度を追加します。degrees(st_azimuth(ff.sp、ff.ep)+1.57079633)。360より大きい値が生成されることもありますが、更新クエリを使用すると、それらを置き換えることができます。静的ビューとして使用したい場合は、 "CREATE MATERIALIZED VIEW"を作成します。これは、最初から遅くなることはありません。
Tamas Kosa

2
結構です。北が0°であると仮定すると、これはポリゴン/建物の内側に向かって法線を与えます(スクリーンショットにも表示されています)。しかし、あなたは正しいです-単純なUPDATEトリックをする必要があります。この素晴らしい解決策を再びありがとう。他の回答が表示された場合は、受け入れるまでにさらに数日待ちます。
n1000

1
どうST_ForceRHRですか?この答えは実際には大丈夫だと思われます。
Jakub Kania

@JakubKania私はST_ForceRHR解決策を考え出そうとしましたが、成功しませんでした。ヒントに感謝します...私は試しましたST_Dump(ST_Boundary(ST_ForceRHR(the_geom)))
n1000
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.