Обновить координаты на геопакете с помощью шейп-файла
У меня есть файл геопакета, в котором есть вся информация об определенных элементах, но координаты необходимо обновить. Я использую старый GPS Leica 1200, чтобы получить новые координаты и присвоить этим точкам тот же идентификатор, что и в геопакете.
Как лучше всего обновить координаты в геопакете координатами из шейп-файла, сгенерированного GPS, зная, что идентификатор будет таким же, я использовал для этого функцию Excel VLOOKUP, но хотел бы знать, есть ли способ сделать это внутри QGIS.
Ответы
Это возможно, но не тривиально, сделать это с помощью ogr2ogr и ogrinfo. Шейп-файл должен быть сначала вставлен в 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 -> ТОЧКА (5 25) и сохранить объект 11 как ТОЧКУ (77 33). Функцию с ID = 0, которая не существует в jointest1, добавлять не следует.
Слой jointest1 находится в GeoPackage "jointest.gpkg", а jointest2 - это шейп-файл. Сначала импортируйте также 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 и очистить базу данных. Если вы просто удалите таблицу из базы данных SQLite, размер файла останется прежним, пока вы не очистите базу данных. Это не опасно, если вы не пылесосите, у вас просто будет файл базы данных немного большего размера на диске.
ogrinfo jointest.gpkg -sql "drop table jointest2"
ogrinfo jointest.gpkg -sql "vacuum"
Обновление координат сложно и, вероятно, потребует некоторых дополнительных усилий. Вместо этого я бы рекомендовал:
- Откройте оба файла в QGIS
- Присоедините атрибуты слоя GeoPackage к слою Shapefile, используя идентификатор
- Сохраните этот слой как новый GeoPackage
Таким образом, вам не нужно прикасаться к обработке геометрии, а только к данным атрибутов, что намного проще.