shapefile을 사용하여 지오 패키지의 좌표 업데이트

Aug 17 2020

특정 항목에 대한 모든 정보가 포함 된 지오 패키지 파일이 있지만 좌표를 업데이트해야합니다. 저는 오래된 Leica 1200 GPS를 사용하여 새로운 좌표를 얻고 지오 패키지에있는이 지점에 동일한 ID를 부여하고 있습니다.

지오 패키지의 좌표를 GPS에 의해 생성 된 shapefile의 좌표로 업데이트하는 가장 좋은 방법은 ID가 동일하다는 것을 알고 있으며, 이에 대해 Excel의 VLOOKUP 기능을 사용했지만 방법이 있는지 알고 싶습니다. QGIS에서 할 수 있습니다.

답변

2 user30184 Aug 18 2020 at 14:08

ogr2ogr 및 ogrinfo를 사용하여 가능하지만 간단하지는 않습니다. shapefile은 먼저 GeoPackage에 삽입해야하지만 도형이 업데이트되면 삭제할 수 있습니다.

소스 데이터

jointest1에는 2 개의 점이 있습니다.

  ID (Integer) = 11
  POINT (77 33)

  ID (Integer) = 22
  POINT (15 35)

jointest2는 또한 두 점을 포함합니다

  ID (Integer) = 22
  POINT (5 25)

  ID (Integer) = 0
  POINT (3 2)

목표는 기능 22-> POINT (5 25)를 업데이트하고 기능 11을 POINT (77 33)로 유지하는 것입니다. jointest1에 존재하지 않는 ID = 0 인 기능은 추가하지 않아야합니다.

jointest1 레이어는 GeoPackage "jointest.gpkg"에 있고 jointest2는 shapefile입니다. 먼저 jointest2를 GeoPackage로 가져옵니다.

ogr2ogr -append -update -f gpkg jointest.gpkg jointest2.shp

다음으로 ogrinfo와 -sql 매개 변수를 사용하여 업데이트 명령을 실행합니다. 명령 구문은 다음에서 가져옵니다.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 테이블을 삭제하고 데이터베이스를 vacuum 할 수 있습니다. SQLite 데이터베이스에서 테이블을 삭제하면 데이터베이스를 vacuum 할 때까지 파일 크기가 동일하게 유지됩니다. 진공 상태를 유지하지 않으면 위험하지 않으며 디스크에 약간 더 큰 데이터베이스 파일이있을 것입니다.

ogrinfo jointest.gpkg -sql "drop table jointest2"
ogrinfo jointest.gpkg -sql "vacuum" 
bugmenot123 Aug 17 2020 at 16:04

좌표 업데이트는 어렵고 고급 조작이 필요할 수 있습니다. 대신 다음을 권장합니다.

  • QGIS에서 두 파일 열기
  • ID를 사용하여 GeoPackage 레이어의 속성을 Shapefile 레이어에 결합합니다.
  • 해당 레이어를 새 GeoPackage로 저장

이렇게하면 지오메트리 처리를 만질 필요가 없지만 속성 데이터 만 더 쉽게 처리 할 수 ​​있습니다.