У меня есть около 1000 шейп-файлов, которые повреждены (см. Прикрепленное сообщение об ошибке). Шейп-файлы были сгенерированы из eCognition Developer 8. Существует инструмент-скрипт, который, похоже, восстанавливает шейп-файл, если он идентифицирован как поврежденный.
Редактировать:
Я хочу создать быстрый скрипт, который будет перебирать все мои шейп-файлы и проверять, совпадает ли количество фигур с записями таблицы. Я могу посчитать записи таблицы, используя следующие:
# Name: fcCount.py
# Purpose: calculate the number of features in a featureclass
# Import system modules
import arcpy
from arcpy import env
env.workspace = "C:/data"
Sample = "MyShp.shp"
result_dbf = int(arcpy.GetCount_management(Sample).getOutput(0))
print result_dbf
В конечном итоге я хотел бы создать какую-то проверку логики, такую как:
if result_dbf = result_shp:
pass
else:
print "There is a problem with" + str(Sample)
Как я могу считать фигуры напрямую, не обращаясь к файлу .dbf? Или, другими словами, как лучше всего программно проверить, совпадает ли число фигур с количеством записей в таблице?
Ответы:
Как насчет использования pyshp ? Я установил его с помощью pip, и то, что я попробовал ниже, в значительной степени прямо из README :
К сожалению (или, к счастью, к счастью?), У меня нет поднятых шейп-файлов, чтобы проверить, нет ли. форм может! = нет. записей.
Подожди минутку, у меня теперь есть поднятый шейп-файл благодаря идее Кирка в комментариях ниже. Я сделал резервную копию dbf, сделал копию всего шейп-файла, удалил некоторые функции, затем переименовал резервную копию dbf обратно в оригинал, и вот, количество фигур <количество записей:
источник
Судя по звучанию вашего вопроса, кажется, что все, что вы действительно хотите сделать, - это определить, есть ли проблемы с шейп-файлом (в данном случае несовпадающие записи). Если вам просто нужно идентифицировать тех, у кого есть проблемы, вам на самом деле не нужно подсчитывать записи в DBF и Shapefile, чтобы определить, нет ли в них ошибок. Вот почему:
Если вы попытаетесь запустить функцию GetCount для шейп-файла с другим количеством записей, произойдет сбой с ошибкой:
Так как функция GetCount завершается с ошибкой в этом сценарии, и все, что вам нужно сделать, это идентифицировать шейп-файлы по ошибке, вы можете поймать это с помощью выражения try / исключением в вашем коде вместо if / else, который вы ранее пытались использовать.
Я позволил себе добавить код и цикл «List FeatureClasses», чтобы вы могли проверить все FC в вашем рабочем пространстве без необходимости вручную проверять каждый из них.
источник
Формат шейп-файла задокументирован. Я предполагаю, что количество записей в файле shp не соответствует количеству записей в файле dbf.
Формат файла shp документирован здесь . Таким образом, вы можете написать программу для подсчета количества фигур. Формат dbf задокументирован во многих местах, и вы сможете найти образцы для подсчета строк, например, здесь .
источник
Прикрепленный скрипт проходит по каталогу и проверяет, совпадает ли количество фигур с количеством записей для каждого шейп-файла.
источник
Использование геометрии чека должно помочь вам пройти первый шаг.
Onus
Repair Geometry позволит вам выбрать порядок и приоритет проблемы, которую вы хотите устранить.
Вот некоторые другие ссылки более старой версии . Когда вы запускаете проверку шейп-файлов, тогда вы заканчиваете с перестройкой dbf?
Это шаг, который создает записи для соответствия. Произошла одна из двух причин возникновения ошибки.
Несколько вещей могут вызвать это.
Shx на самом деле является индексом между ними.
Подсчет фигур без подсчета записей dbf - это только половина решения.
источник
Глядя на статью в википедии о шейп-файлах , файл .shx должен содержать индекс в файле .shp, а не в файле .dbf. Так что может быть необходимо проверить, подходят ли .shx и .shp вместе.
Можно открыть шейп-файл без .dbf (что означает, что у вас нет таблицы атрибутов), но неправильный индекс вызовет сообщение об ошибке.
источник