こんにちは。
アフィン変換というプロセッシングと関数があって、X,Y独立の拡大縮小ができます。が、原点座標(0,0)を基準とした拡大縮小なので、移動してしまい、そのままでは使いにくいという問題があります。そこで、関数を入れ子にして重心を基準としたX,Y独立の拡大縮小をする方法を説明します。
手順としては、
1.対象レイヤを選択して、
2.フィールド計算機を開き、
3.既存のフィールドを更新→<geometry>
対象地物を選択地物に限定する場合は、「選択中の?個の地物のみ更新」をチェック
4.下式を式にペースト
----------------------------ここから
with_variable( 'p',
map( 'delta_x', 0 --X軸平行移動
,'delta_y', 0 --Y軸平行移動
,'rotation',0 --Z軸を中心とする回転(反時計回りの度)
,'scale_x', 1 --X軸スケール係数
,'scale_y', 1 --Y軸スケール係数
),
with_variable('g0', --重心を原点に移動したジオメトリ
affine_transform( $geometry ,-x( $geometry ),-y( $geometry ),0,1,1),
affine_transform( @g0,x( $geometry )+@p['delta_x'],y( $geometry
)+@p['delta_y'],@p['rotation'],@p['scale_x'],@p['scale_y']
)
)
)
------------------------------ここまで
赤色のところを編集して、スケールを指定します。
5.OKボタン クリック
フィールド計算機で、式を保存すると関数リストのユーザーリストから呼び出せるようになります。
個々の関数の説明をすると、
with_variable( は変数を定義するための関数です
map( マップ型オブジェクトを作成する関数です。
with_variableと合わせて、@p['delta_x'] の様にして変数を呼び出せます。
$geometryは対象のジオメトリ(ポリゴンやライン)で、
x( $geometry )で重心のx座標を取得できます。
affine_transform( は移動、回転、拡大縮小をする関数です。変換は、スケール・回転・移動 の順に行われます。
以下の式で、ジオメトリの重心を基準に原点0,0に移動したジオメトリを @g0 に入れています。
--
with_variable('g0', --重心を原点に移動したジオメトリ
affine_transform( $geometry ,-x( $geometry ),-y( $geometry ),0,1,1),
--
以下の式で、原点を基準に回転、拡大縮小をしてから元の位置に戻しています。合わせて移動分(delta_x,y)も足しています。
--
affine_transform( @g0,x( $geometry )+@p['delta_x'],y( $geometry
)+@p['delta_y'],@p['rotation'],@p['scale_x'],@p['scale_y']
--
上記は、レイヤを直接書き換える方法で、プロセッシング「式によるジオメトリ」で、同じ式を入れると拡大縮小したレイヤを新規作成できます。X軸を0.5倍した出力は下記になります。
2023年5月18日木曜日 14:08:47 UTC+9 おでん: