シェープファイルを使用してジオパッケージの座標を更新する
特定のアイテムに関するすべての情報を含むジオパッケージファイルがありますが、座標を更新する必要があります。古いライカ1200GPSを使用して新しい座標を取得し、ジオパッケージにあるこれらのポイントに同じIDを割り当てています。
IDが同じであることを知っているGPSによって生成されたシェープファイルからの座標でジオパッケージの座標を更新するための最良の方法は何ですか、私はこれにExcelのVLOOKUP関数を使用していますが、方法があるかどうか知りたいですQGIS内でそれを行うために。
回答
ogr2ogrとogrinfoを使用してそれを行うことは可能ですが、簡単ではありません。シェープファイルは最初にGeoPackageに挿入する必要がありますが、ジオメトリが更新されたら削除できます。
ソースデータ
joinest1には2つのポイントが含まれています
ID (Integer) = 11
POINT (77 33)
ID (Integer) = 22
POINT (15 35)
joinest2には2つのポイントも含まれています
ID (Integer) = 22
POINT (5 25)
ID (Integer) = 0
POINT (3 2)
目的は、機能22-> POINT(5 25)を更新し、機能11をPOINT(77 33)のままにすることです。joinest1に存在しないID = 0の機能は追加しないでください。
レイヤーjointest1はGeoPackage "jointest.gpkg"にあり、jointest2はシェープファイルです。最初にjointest2もGeoPackageにインポートします。
ogr2ogr -append -update -f gpkg jointest.gpkg jointest2.shp
次に、更新コマンドを実行するために-sqlパラメーターを指定してogrinfoを使用します。コマンドの構文は、https://stackoverflow.com/questions/19270259/update-with-join-in-sqlite。
ogrinfo -sql "update jointest1 set geom=(select geom from jointest2 where ID=jointest1.ID) where exists (select geom from jointest2 where ID=jointest1.ID)" jointest.gpkg
私たちがjointest1に今持っているものをチェックしてください
ogrinfo jointest.gpkg jointest1
…
ID (Integer) = 11
POINT (77 33)
ID (Integer) = 22
POINT (5 25)
これで、jointest2テーブルを削除し、データベースをバキュームできます。SQLiteデータベースからテーブルを削除するだけの場合、データベースをバキュームするまでファイルサイズは同じままです。バキュームを行わなくても危険ではありません。ディスク上に少し大きいデータベースファイルがあるだけです。
ogrinfo jointest.gpkg -sql "drop table jointest2"
ogrinfo jointest.gpkg -sql "vacuum"
座標の更新は難しく、おそらく高度な操作が必要になります。代わりに、次のことをお勧めします。
- QGISで両方のファイルを開く
- IDを使用して、GeoPackageレイヤーからShapefileレイヤーに属性を結合します
- そのレイヤーを新しいGeoPackageとして保存します
そうすれば、ジオメトリ処理に触れる必要はなく、属性データだけに触れることができ、はるかに簡単になります。