点に固定された、一定の角度と長さを持つ折れ線を作成する方法


8

一定の角度(例:160°)と長さ(例:2m)で、別の線ストリングのポイント数に固定された線ストリングを作成したい。そのため、ST_DumpPoints関数を使用してポイントを検索し、作成されたラインストリングをそれらにバインドします。ラインストリングの作成中に角度(α)を宣言する方法はありますか?以下は画像の例です。

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

青い線を作成したい。

編集

写真の角度(α2)は実際の例ではありません。ただし、方位角は160°(α1のように)です。

更新

Evil Geniusからの回答は、特定のアスペクトのポリゴンの最大幅を計算するのに役立ちました。

回答:


11

これは、必要な出力の種類に応じていくつかの異なる方法で実現できますが、概念は同じです。通常、座標を1ステップで計算するよりも、単純な回転とそれに続く平行移動を行う方が簡単です。

この場合、基本的な手順は次のとおりです。

  • 原点(0,0)に目的の長さの線を作成します。この線は、角度を測定する軸に沿って走り、原点を中心とする必要があります。
  • 原点を中心に線を回転させます。
  • 中心にしたいポイントの座標でラインを移動します。

次のPostGISビューは、サンプルシナリオからラインを作成します。いくつかのことが想定されています。

  • ジオメトリ列が呼び出されます shape
  • 角度はx軸から測定されます。最初の40度について言及し、点線の垂直線を描画したため、サンプルの図面は少し混乱しましたが、その後、約160度になるはずだと述べました。私は、実際にx軸から測定したいという意味で解釈しました。
  • データは、測定に使用するのと同じ単位(つまり、メートル)で投影されます。

    CREATE OR REPLACE VIEW <viewname> AS
    WITH vertices AS
    (SELECT 
          objectid, 
          (ST_DumpPoints(shape)).path[1] AS v_id, 
          (ST_DumpPoints(shape)).geom AS vertex
    FROM <source_data>
    )
    SELECT
        objectid,
        v_id,
        ST_SetSRID(ST_Translate(ST_Rotate(ST_MakeLine(ST_MakePoint( 1.0,0.0), 
                                                      ST_MakePoint(-1.0,0.0)),
                                          radians(40)), ST_X(vertex), ST_Y(Vertex)),
                                          ST_SRID(vertex)) AS newline
    FROM vertices

最後の行で実際に何が起こっているかを、最も内側から始めて分析するには: ST_SetSRID(ST_Translate(ST_Rotate(ST_MakeLine(ST_MakePoint( 0,1.0), ST_MakePoint(0,-1.0)), radians(40)), ST_X(vertex), ST_Y(Vertex)), ST_SRID(vertex)) AS newline

  • ST_MakePoint(1.0,0.0)and ST_MakePoint(-1.0,0.0):目的の長さであり、原点を中心とする水平線の端点を作成します。
  • ST_MakeLine(...):新しく作成したエンドポイントを使用して線を作成します。
  • ST_Rotate(..., radians(40)):新しい線を原点を中心に回転させます。
  • ST_Translate(..., ST_X(vertex), ST_Y(vertex)):回転した線を基準(入力)ポイントの中央に配置します。
  • ST_SetSRID(..., ST_SRID(vertex)):新しいラインに入力ジオメトリと同じSRIDを与えます。

PostGIS 2.0を使用している場合は、に別の原点を指定できるため、これを簡略化できますST_Rotate。線の傾きに基づいた角度に回転したい場合は、最初にそれを計算し、それを回転角度に追加する必要があります。

測定したい単位と同じ単位でデータが投影されていない場合でも、同様のことを実行できますが、追加の手順が必要になります。

  • ラインを作成します(測定したいものを使用して何かに投影されます)
  • 回転
  • ターゲットの投影に再投影します
  • ターゲットポイントに平行移動

編集する

角度の意味がわかりました。基本的に、Y軸から時計回りの回転が必要です(0が上、90が右、180が下など)。

ラジアンでの角度を想定しているため、radians関数を使用する必要がありますST_Rotate。2つの小さな変更で正しい角度を取得できるはずです。

  • 縦線から始めます(ST_MakePoint(0.0,1.0)およびを使用ST_MakePoint(0.0,-1.0)
  • 角度に-1を掛けます。これはそれを負ST_rotateにし、時計回りに回転させます。radians(<angle> * -1)

あなたは邪悪な天才です!ありがとうございました。完璧に動作しますが、正しい角度を設定します。私は角度(列に格納されています)を操作します。これは、説明またはアスペクト(0〜360度)のようなものです。たとえば200°のアスペクト(地理方向SSWなど):折れ線をプロットすると、直角ではありません。degree()を使用すると、地理方向はSSEのようになり、radians()をSWのように使用します。
ステファン

@StefanB。お役に立てて嬉しいです!私は自分の回答(一番下)を編集して、希望の角度を達成する方法を示しています。
Evil Genius

できます。素晴らしいアイデア!
ステファン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.