シェープファイルを使用してジオパッケージの座標を更新する

Aug 17 2020

特定のアイテムに関するすべての情報を含むジオパッケージファイルがありますが、座標を更新する必要があります。古いライカ1200GPSを使用して新しい座標を取得し、ジオパッケージにあるこれらのポイントに同じIDを割り当てています。

IDが同じであることを知っているGPSによって生成されたシェープファイルからの座標でジオパッケージの座標を更新するための最良の方法は何ですか、私はこれにExcelのVLOOKUP関数を使用していますが、方法があるかどうか知りたいですQGIS内でそれを行うために。

回答

2 user30184 Aug 18 2020 at 14:08

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" 
bugmenot123 Aug 17 2020 at 16:04

座標の更新は難しく、おそらく高度な操作が必要になります。代わりに、次のことをお勧めします。

  • QGISで両方のファイルを開く
  • IDを使用して、GeoPackageレイヤーからShapefileレイヤーに属性を結合します
  • そのレイヤーを新しいGeoPackageとして保存します

そうすれば、ジオメトリ処理に触れる必要はなく、属性データだけに触れることができ、はるかに簡単になります。