回答:
これは、必要な出力の種類に応じていくつかの異なる方法で実現できますが、概念は同じです。通常、座標を1ステップで計算するよりも、単純な回転とそれに続く平行移動を行う方が簡単です。
この場合、基本的な手順は次のとおりです。
次のPostGISビューは、サンプルシナリオからラインを作成します。いくつかのことが想定されています。
shape
データは、測定に使用するのと同じ単位(つまり、メートル)で投影されます。
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)
)ST_rotate
にし、時計回りに回転させます。radians(<angle> * -1)