qgsAffine(または他の方法)でQGISのベクターレイヤーを回転させますか?


10

QGISの一連のベクトル点を、中心点(または任意の点)を中心に任意の角度で回転させたいのですが。

これは、通常のグリッドの作成に関する最近の質問に似てます。そこでは、「アフィン変換」ツール(私はプラグインを意味すると思います)を使用して、点のグリッドを任意の角度または距離で回転またはシフトすることが提案されました。私はそれがどのように機能するのか理解していないと思います、そしてそれを機能させることができませんでした。

QGISでポイントの通常のグリッドを作成し、レイヤーとプロジェクトの両方でUTMゾーンが正しく設定されていることを確認し、レイヤーの編集を有効にしてから、プラグインダイアログ(qgsAffine)を開きます。 アフィン変換ダイアログ

「レイヤー全体」を選択し、ポイントのフィールド全体を15度回転させたい場合は、両方の「回転」ボックスに15を入力します(問題が発生している可能性があります)。操作の結果、点が惑星外のどこかに回転します。

これは仕事に適したツールですか?理想的には、共通の中心を中心に一連のポイントを回転させたいと思います。

更新:qgsAffineは単なる考えです。私たちがこれを行うことができれば任意の QGISツール私は幸せになります!

更新2:qgsAffineは、プラグインする正しい番号がわかっている場合に使用できます(Mikeに感謝して、以下の回答を参照してください)。スプレッドシート/電卓は正常に動作します。または、数値を直接取得するR関数を次に示します。

## Compute correct affine numbers for qgsAffine plugin
affine <- function(originX, originY, rotAngle) {
  A <- rotAngle * pi / 180
  scaleX <- scaleY <- cos(A)
  rotX <- sin(A)
  rotY <- -sin(A)
  transX <- originX - cos(A) * originX + sin(A) * originY
  transY <- originY - sin(A) * originX - cos(A) * originY
  aff <- data.frame(scaleX, scaleY, rotX, rotY, transX, transY)
  return(aff)
}

したがって、ウガンダ北部(UTM 36N)で点のグリッドを回転させると、次のようになりaffine(578988, 419210, 30)ます。

     scaleX    scaleY rotX rotY   transX    transY
1 0.8660254 0.8660254  0.5 -0.5 287174.7 -233330.5

... qgsAffineダイアログに入力すると、ポイントが正しく回転します。


いいR適応!
Mike T

回答:


10

PostGISでは、ST_Affineを使用してこれを行うことができます。ST_Rotate for PostGIS 2.0には、任意の点を中心に回転する機能が追加されました。

以前のバージョン(PostGIS 1.5など)をお持ちの場合は、次の関数を追加できます。

CREATE OR REPLACE FUNCTION st_rotate(geometry, double precision, geometry)
  RETURNS geometry AS
'SELECT ST_Affine($1,  cos($2), -sin($2), 0,  sin($2),  cos($2), 0, 0, 0, 1, ST_X($3) - cos($2) * ST_X($3) + sin($2) * ST_Y($3), ST_Y($3) - sin($2) * ST_X($3) - cos($2) * ST_Y($3), 0)'
  LANGUAGE sql IMMUTABLE STRICT
  COST 100;
COMMENT ON FUNCTION st_rotate(geometry, double precision, geometry) IS 'args: geomA, rotRadians, pointOrigin - Rotate a geometry rotRadians counter-clockwise about an origin.';

CREATE OR REPLACE FUNCTION st_rotate(geometry, double precision, double precision, double precision)
  RETURNS geometry AS
'SELECT ST_Affine($1,  cos($2), -sin($2), 0,  sin($2),  cos($2), 0, 0, 0, 1,    $3 - cos($2) * $3 + sin($2) * $4, $4 - sin($2) * $3 - cos($2) * $4, 0)'
  LANGUAGE sql IMMUTABLE STRICT
  COST 100;
COMMENT ON FUNCTION st_rotate(geometry, double precision, double precision, double precision) IS 'args: geomA, rotRadians, x0, y0 - Rotate a geometry rotRadians counter-clockwise about an origin.';

ST_Rotateの例を参照して、それを使用して、重心(共通中心)を含むxy点を中心にジオメトリを回転させる方法についてのアイデアを入手してください。

私たちはみな数学が好きなので、上記の関数の変換行列は次のように表されます。

[ cos(θ)  | -sin(θ)  ||  x0 - cos(θ) * x0 + sin(θ) * y0 ]
[ sin(θ)  |  cos(θ)  ||  y0 - sin(θ) * x0 - cos(θ) * y0 ]

ここで、θは原点を中心とした反時計回りの回転、x0は原点の東座標/経度、y0は北座標/緯度です。この数学は、あらゆるアフィン変換ツールに適用できる可能性があります。


qgsAffineツールを使用するには、行列の値がどこに流れるかを理解する必要があります。事前計算を行うには、優れたスプレッドシートテンプレートも必要です。qgsAffineダイアログは次のようになります。

              X   Y
            +---+---+
      Scale | a | e |
            +---+---+
   Rotation | d | b |
            +---+---+
Translation | c | f |
            +---+---+

どこ:

  • a:cos(θ)
  • b:-sin(θ)
  • c:x0-cos(θ)* x0 + sin(θ)* y0
  • d:sin(θ)
  • e:cos(θ)
  • f:y0-sin(θ)* x0-cos(θ)* y0

たとえば、ポリゴンを時計回りに30°回転させて42°S、174°Eにしたい場合、スプレッドシートへの入力は次のようになります。

  • x0 = 174
  • y0 = -42
  • θ = -30度または-0.523598776ラジアン

次に、スプ​​レッドシートから右側のボックスに結果をコピーして貼り付けます。ダイアログからのタブオーダーの使用:

  • a:0.866025404
  • d:-0.5
  • c:44.31157974
  • e:0.866025404
  • b:0.5
  • f:81.37306696

qgsAffine

PostGISの同じ例は次のようになります。

SELECT ST_Rotate(geom, -30*pi()/180, 174.0, -42.0)

それはかなりよさそうだ。Spatialiteでそれを実行できる場合、QGISプラグインを介してSpatialiteファイルでSQLを実行できるため、「QGISで実行する」と見なされます。PostGISは、私が知りたくないユーザーのためのインストールのもう1つのステップです。スペーシャライトの機能が重心の周りを回転できるかどうか、何か考えはありますか?
シンバマング2012年

ああ、私はqgsAffineをわかりやすく説明しましたが、期待どおりに動作します...スプレッドシートからのコピー/貼り付けの多くだけ
Mike T

マイク、それはちょうどいい!私もこれをSpatialiteで動作させようとします(PostGIS / spatialiteはこれらの操作を非常に簡単にするようです)少なくとも今はqgsAffineを動作させることができ、それは少なくとも単純なプラグインです。
シンバマング2012年

私はJavaScriptにそれを適応させることを試みた:ここでそれを見、またjsfiddle
flackend

1
上記のjavascript関数の計算アフィンパラメータを計算してsomベクトルを正常に回転させることはできましたが、これはそれほどユーザーフレンドリーではありません。回転の中心座標を取得するためにCoordinateキャプチャプラグインを使用し、次に変換パラメータを計算してコピー&ペーストして戻す必要があります。 QGis!プラグイン自体が計算を行い、ユーザーがクリックして回転中心座標を入力し、回転角度を定義すれば、はるかに簡単になります。
ブラディプス

2

qgsAffineを使用してベクターレイヤーを回転させようとしたことはありません。私だけではないと思います。この質問は最近QGISフォーラムで出て来て、(無料の)OpenJumpを使用して解決策が見つかりました。このスレッドを見てください(終わりに向かって):

http://forum.qgis.org/viewtopic.php?f=2&t=10126&sid=28473d53d244a4cd2a6f91887811ef02

もちろん、このツールを使用して、データの単純なローテーションを行うこともできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.