QGISを使用してコントロールポイントでベクターレイヤーをジオリファレンスしますか?


29

ジオリファレンスする必要のある非ジオリファレンスベクターレイヤーがあります。ラスターレイヤーを使用すると、タスクは簡単で簡単ですが、ベクターレイヤーで何をすべきかわかりません。既知の座標を持ついくつかのコントロールポイントがあり、それらは変換の基盤を提供するはずです。したがって、1、2、および3のid-sのポイントがx1、y1の座標を持つ必要があることを知っているとしましょう。x2、y2; x3、y3。単純なシフトに加えて、回転およびスケール変換が行われる場合があります。

何か案は?


qgsAffineプラグインを試しましたか?ここに同様の質問: gis.stackexchange.com/questions/22691/how-to-georeference-a-dxf
Rayner

Affineプラグインはおそらく変換を行いますが、それを使用するには変換パラメーターを知る必要があります。3点のベクトル座標と対応する実世界座標を投稿できますか?N.
nhopton

gdal_rasterizeを使用してシェープファイルをTIFFに変換し、TIFFをジオリファレンスしてから、ワールドファイルからパラメーターを抽出できますか?
klewis

回答:


10

ベクターレイヤーをジオリファレンスするには、qgsAffineプラグインを試してください。

メニューのqgsaffineの検索場所に詳細情報がありますか?


3
回答ありがとうございます。次に、qgsAffineを使用して、変換パラメータを手動で把握する必要があると思います。そのプロセスを自動化する何らかの方法があることを望んでいました。おそらく、それを行うためのPythonコードをいくつか書いてみようと思います
-AHaav

1
それについて考えると、GRASS v.transform(Sextanteツールキットに含まれています)はqgsAffineプラグインよりも使いやすいことがわかります。N.
nhopton

1
それを見ると、v.transformも合計を行います。grass.osgeo.org
gdp / html_grass63 /

8

いくつかの制御ポイントがあるという事実を考えると、アフィン変換を使用してベクトルデータをシフトできるはずです。見ていこのレシピを。プロセスは2つの部分からなるプロセスです。

  1. コントロールポイントを使用して、必要なアフィン関数の係数を定義します
  2. 係数を取得し、それらをpostgisのST_Affine()に適用します。

コントロールポイントをCSVファイル(old_x、old_y、new_x、new_y)に入れると、リンクからRコマンドをカットアンドペーストして係数部分を解くことができます。


7

QGIS用のVector Benderプラグインをお勧めします。私はそれを試してみましたが、うまく機能し、ユーザーフレンドリーです。定義するポイントのペアの量に応じて、次のいずれかを実行できます。

  • 翻訳:1つの開始点から終了点への翻訳(1ペア)
  • 均一:平行移動、スケーリング、回転(2ペア)
  • 曲げ:追加の変形(3ペア以上)

ここに短いビデオあります。プラグインをインストールしたら、Vector Benderのヘルプを読むことをお勧めします。


私は、Vector benderプラグインは直感的で高速に動作することに同意します。しかし、ベクターをミラーリング/フリップすることができませんでした。この操作では、アフィン変換プラグイン(QGIS v2.18)を使用します。
jurajb


2

私はそれをやらなければならなかった、そしてこれをやめてしまった:

  1. シェープファイルをラスタライズする
  2. Georeferencerプラグインを使用してラスターをジオリファレンスする
  3. GCPをgcps.pointsファイルとして保存します
  4. このファイルを使用してアフィン変換を計算します
  5. qgsAffineを使用して、アフィン変換をシェープファイルに適用します

次のスクリプトは、保存されたGCPを使用してアフィン変換行列を計算します。

# Computes an affine transform based on QGis GCPs
# Usage: gcp_affine.py gcps.points

import csv
import sys
import numpy as np
from skimage.transform import AffineTransform

u = list(csv.DictReader(open(sys.argv[1], "rb")))
source = [(d["pixelX"], d["pixelY"]) for d in u]
dest = [(d["mapX"], d["mapY"]) for d in u]
source = [map(float, s) for s in source]
dest = [map(float, s) for s in dest]
source = np.array(source)
dest = np.array(dest)
aft = AffineTransform()
aft.estimate(source, dest)
np.set_printoptions(suppress=True)
print aft._matrix


2

Raynerの答えに対する私のコメントに続いて、Sextanteツールボックスから実行できるGRASS v.transformを使用して、変換パラメーターを計算し、ベクトルレイヤーに適用してアフィン変換を実行できます。ここに示す形式のコントロールポイントを含むテキストファイルが必要です。

それは非常に使いやすく、うまく機能します。


たぶん私は年をとっていますが、Arcview 3.0のShapeWarpユーザーアドオンを覚えているかどうか疑問に思っています。とても使いやすかったです。私はいつも、これらの他のツール(v.transform / affine)がずっと面倒だと思っています。QGISでShapeWarpの使いやすさを再現しようとした人はいませんか?
シャラード

1

ここで提供される回答のいくつかは、QGIS 3のオプションではなくなり、および/またはジオリファレンスされるベクトルファイルの線形変換のみを許可します。これはOPの質問に答えるかもしれませんが、この投稿を参照する他の人は、ベクターファイルを地理参照するための他の変換オプションが必要な場合があります。

ベクタファイルをジオリファレンスするためのいくつかのソリューションの問題:

  • qgsAffineプラグインは線形変換のみを許可します。これは、ベクターファイルを拡大縮小、回転、移動できることを意味しますが、ベクターファイルを曲げたり、反ったりすることはできません。ラスターファイルのGeoreferencerには、より多くのオプションが用意されており、2次多項式や薄板スプラインなど、さまざまな変換が可能です。また、qgsAffineプラグインがまだQGIS 3で利用できるようには見えません。

  • GRASSモジュールv.transformはqgsAffineプラグインに似ており、線形変換のみを許可します。

  • Vector Benderプラグインは良いオプションのように見えますが、QGIS 3に完全には移植されていないため、現在はオプションではありません。もうメンテナンスされているようには見えません。

HeikkiVesantoの投稿で提案されているように、ogr2ogrを使用することは良い選択肢です。GCP(Ground Control Points)を使用して、希望する変換のタイプを指定できます。これを行う方法に関する指示がどこにも見つからなかったため、以下にいくつかの指示を含めました。

  1. GCPペアのセットを生成します。1つのポイントは、ungeoreferencedベクターファイルの元の場所であり、もう1つのポイントは、ジオリファレンスされたワークスペースの目的の場所です。

  2. GCPを生成するにはさまざまな方法があります。QGISでGeoreferencer GDALプラグインを使用しました。これは、プラグインマネージャーを使用してインストールした後、[ラスター]ドロップダウンメニューで使用できます。ラスターファイルでのみ機能するため、最初にベクターファイルをラスターファイルに変換する必要があります。これは、「Processing Toolbox:GDAL:Vector conversion:Rasterize(vector to raster)」で可能です。ベクターファイルの機能を表示できる解像度に数値を設定します。

  3. Georeferencerには素晴らしいインターフェイスがあり、多くのGCPポイントを追加できます。また、さまざまな変換をテストして、どれが最適かを確認することもできます。また、残差を調べることで、GCPポイントのいずれかにエラーがある可能性があるかどうかを確認できます。すべてのGCPポイントを追加し、出力が適切であることを確認したら、GeoreferencerからGCPファイルをエクスポートして、元のベクターファイルのジオリファレンスに使用できます。

  4. GCPファイルは、次の形式に変更する必要があります。必要な数のGCPポイントを追加できます。各ポイントは-gcpで始まり、スペースで区切られます。800ポイント以上のGCPポイントでこれを実行しましたが、うまくいきました。

    -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
  1. GCPポイントを正しい形式に変更できるさまざまな方法があります。それらをcsvファイルとしてExcelにインポートし、各ポイントに適切な形式を出力する列を作成しました。次に、その列をTextEditに貼り付け、行末をスペースに置き換えました。

  2. ジオリファレンスするベクターファイルは、最終的なジオリファレンスファイルと同じSRSを使用してワークスペースにインポートする必要があります。これは、ワークスペースと同じSRSである必要があります。元々別のSRSを使用していた場合、本来あるべき場所からはかなり遠いかもしれませんが、変換によって正しい場所に移動されます。

  3. 「Processing Toolbox:GDAL:Vector conversion:Convert format」からogr2ogrにアクセスします。これにより、ジオリファレンスするベクターファイルと出力ファイルを選択できます。[追加作成オプション]フィールドで、必要な変換タイプを指定するコマンドを追加し、すべてのGCPポイントを含む行を追加します。

  4. さまざまな変換タイプのコマンドは次のとおりです。

    • 線形の場合は「-order 1」
    • 2次多項式の場合は「-order 2」
    • 3次多項式の場合は「-order 3」
    • 薄板スプラインの「-tps」。
  5. たとえば、「追加の作成オプション」フィールドに追加されるコードは次のようになります。

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