ジオリファレンスする必要のある非ジオリファレンスベクターレイヤーがあります。ラスターレイヤーを使用すると、タスクは簡単で簡単ですが、ベクターレイヤーで何をすべきかわかりません。既知の座標を持ついくつかのコントロールポイントがあり、それらは変換の基盤を提供するはずです。したがって、1、2、および3のid-sのポイントがx1、y1の座標を持つ必要があることを知っているとしましょう。x2、y2; x3、y3。単純なシフトに加えて、回転およびスケール変換が行われる場合があります。
何か案は?
ジオリファレンスする必要のある非ジオリファレンスベクターレイヤーがあります。ラスターレイヤーを使用すると、タスクは簡単で簡単ですが、ベクターレイヤーで何をすべきかわかりません。既知の座標を持ついくつかのコントロールポイントがあり、それらは変換の基盤を提供するはずです。したがって、1、2、および3のid-sのポイントがx1、y1の座標を持つ必要があることを知っているとしましょう。x2、y2; x3、y3。単純なシフトに加えて、回転およびスケール変換が行われる場合があります。
何か案は?
回答:
ベクターレイヤーをジオリファレンスするには、qgsAffineプラグインを試してください。
メニューのqgsaffineの検索場所に詳細情報がありますか?
QGIS用のVector Benderプラグインをお勧めします。私はそれを試してみましたが、うまく機能し、ユーザーフレンドリーです。定義するポイントのペアの量に応じて、次のいずれかを実行できます。
ここに短いビデオがあります。プラグインをインストールしたら、Vector Benderのヘルプを読むことをお勧めします。
GDAL 1.10のリリースにより、これが可能になりました。
これは、ogr2ogrで基本的な変換を実行し、-gcpタグで制御点を提供することにより行われます。http://www.gdal.org/ogr2ogr.html
ガイドについては、http://gisforthought.com/georeferencing-vector-data-using-qgis-and-ogr2ogr/をご覧ください。
私はそれをやらなければならなかった、そしてこれをやめてしまった:
gcps.points
ファイルとして保存します次のスクリプトは、保存された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つのポリゴンを一緒にスナップするための私の答えを見て、無料のopenjumpを試してみてください。
そのアフィン変換は、qgisアフィンプラグインよりもユーザーフレンドリーであると思います。
Raynerの答えに対する私のコメントに続いて、Sextanteツールボックスから実行できるGRASS v.transformを使用して、変換パラメーターを計算し、ベクトルレイヤーに適用してアフィン変換を実行できます。ここに示す形式のコントロールポイントを含むテキストファイルが必要です。
それは非常に使いやすく、うまく機能します。
ここで提供される回答のいくつかは、QGIS 3のオプションではなくなり、および/またはジオリファレンスされるベクトルファイルの線形変換のみを許可します。これはOPの質問に答えるかもしれませんが、この投稿を参照する他の人は、ベクターファイルを地理参照するための他の変換オプションが必要な場合があります。
ベクタファイルをジオリファレンスするためのいくつかのソリューションの問題:
qgsAffineプラグインは線形変換のみを許可します。これは、ベクターファイルを拡大縮小、回転、移動できることを意味しますが、ベクターファイルを曲げたり、反ったりすることはできません。ラスターファイルのGeoreferencerには、より多くのオプションが用意されており、2次多項式や薄板スプラインなど、さまざまな変換が可能です。また、qgsAffineプラグインがまだQGIS 3で利用できるようには見えません。
GRASSモジュールv.transformはqgsAffineプラグインに似ており、線形変換のみを許可します。
Vector Benderプラグインは良いオプションのように見えますが、QGIS 3に完全には移植されていないため、現在はオプションではありません。もうメンテナンスされているようには見えません。
HeikkiVesantoの投稿で提案されているように、ogr2ogrを使用することは良い選択肢です。GCP(Ground Control Points)を使用して、希望する変換のタイプを指定できます。これを行う方法に関する指示がどこにも見つからなかったため、以下にいくつかの指示を含めました。
GCPペアのセットを生成します。1つのポイントは、ungeoreferencedベクターファイルの元の場所であり、もう1つのポイントは、ジオリファレンスされたワークスペースの目的の場所です。
GCPを生成するにはさまざまな方法があります。QGISでGeoreferencer GDALプラグインを使用しました。これは、プラグインマネージャーを使用してインストールした後、[ラスター]ドロップダウンメニューで使用できます。ラスターファイルでのみ機能するため、最初にベクターファイルをラスターファイルに変換する必要があります。これは、「Processing Toolbox:GDAL:Vector conversion:Rasterize(vector to raster)」で可能です。ベクターファイルの機能を表示できる解像度に数値を設定します。
Georeferencerには素晴らしいインターフェイスがあり、多くのGCPポイントを追加できます。また、さまざまな変換をテストして、どれが最適かを確認することもできます。また、残差を調べることで、GCPポイントのいずれかにエラーがある可能性があるかどうかを確認できます。すべてのGCPポイントを追加し、出力が適切であることを確認したら、GeoreferencerからGCPファイルをエクスポートして、元のベクターファイルのジオリファレンスに使用できます。
GCPファイルは、次の形式に変更する必要があります。必要な数のGCPポイントを追加できます。各ポイントは-gcpで始まり、スペースで区切られます。800ポイント以上のGCPポイントでこれを実行しましたが、うまくいきました。
-gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>
GCPポイントを正しい形式に変更できるさまざまな方法があります。それらをcsvファイルとしてExcelにインポートし、各ポイントに適切な形式を出力する列を作成しました。次に、その列をTextEditに貼り付け、行末をスペースに置き換えました。
ジオリファレンスするベクターファイルは、最終的なジオリファレンスファイルと同じSRSを使用してワークスペースにインポートする必要があります。これは、ワークスペースと同じSRSである必要があります。元々別のSRSを使用していた場合、本来あるべき場所からはかなり遠いかもしれませんが、変換によって正しい場所に移動されます。
「Processing Toolbox:GDAL:Vector conversion:Convert format」からogr2ogrにアクセスします。これにより、ジオリファレンスするベクターファイルと出力ファイルを選択できます。[追加作成オプション]フィールドで、必要な変換タイプを指定するコマンドを追加し、すべてのGCPポイントを含む行を追加します。
さまざまな変換タイプのコマンドは次のとおりです。
たとえば、「追加の作成オプション」フィールドに追加されるコードは次のようになります。
-order 2 -gcp <ungeoref_x1> <ungeoref_y1> <georef_x1> <georef_y1> -gcp <ungeoref_x2> <ungeoref_y2> <georef_x2> <georef_y2>