объяснение
OGR (часть GDAL) - это библиотека, используемая QGIS для доступа к шейп-файлам. Когда OGR удаляет объекты, он не удаляет их сразу, а просто отмечает объекты как удаленные. Время от времени выполняется команда repack , которая создает новый файл с суффиксом _repack и копирует все функции, которые не помечены как удаленные, в этот новый файл. Как только он заканчивается, оригинальный .dbf заменяется на _repack.dbf. Затем он делает то же самое с шейп-файлом: создайте новый (_packed.shp), скопируйте все не удаленные функции и в конечном итоге замените оригинальный .shp.
Кажется, где-то в этом процессе что-то не удалось (может быть, сбой?).
В рамках этого процесса идентификаторы объектов меняются, поэтому я предполагаю, что shp (геометрия), который у вас есть, и dbf (таблица атрибутов) используют разные идентификаторы объектов для одних и тех же объектов, что приводит к странному поведению, которое вы испытываете. Кажется, что один из двух файлов по-прежнему содержит (часть) удаленных функций, а другой - нет.
Как с этим бороться
Обновление, ноябрь 2016: GDAL 2.2 поставляется со встроенной функциональностью для автоматического вызова repack при записи файла на диск. Поэтому, прежде чем делать что-то еще: проверьте версию GDAL в диалоговом окне QGIS about и обновите свой выпуск GDAL (часто поставляется как часть QGIS) до последней версии.
Вероятно, вы не можете ничего с этим поделать, кроме регулярного резервного копирования, чтобы не потерять больше данных, чем вы можете обработать (вы все равно делаете это, верно? 😉). И если вы найдете способ воспроизвести это (лучше всего с примером набора данных), создайте отчет об ошибке .
Если вы столкнулись с этой проблемой снова, вы также можете попытаться создать пространственный индекс в шейп-файле. В этом процессе QGIS снова вызовет repack для шейп-файла и может «починить» shp / dbf. Но это только непроверенное предположение.
Как упомянуто @rhm и в комментариях, это может также помочь переименовать файл {xyz} _packed. {Ext} в {xyz}. { Ext } . Если упакованный файл уже полностью записан, и это было просто переименование, которое не удалось, то этот шаг абсолютно действителен вручную. Однако, если _packed файл не был полностью написан, возможно, вам не хватает информации из частей ваших функций. Поэтому, прежде чем пытаться сделать это, сделайте резервные копии всех задействованных файлов.
Справочная информация о том, когда вызывается repack
Между QGIS 2.0 и 2.8 repack вызывался всякий раз, когда слой выгружался (выход из QGIS, загрузка другого проекта ...). Если объект был удален или геометрия изменена, файлы .shp и .dbf с записями, помеченными как удаленные , присутствовали.
Начиная с QGIS 2.10, repack вызывается всякий раз, когда слой сохраняется после операции, которая потенциально может добавить удаленный флаг в записи. Поэтому файлы должны теперь всегда находиться в нормальном состоянии для обработки другими приложениями.