У меня есть идея, что может сработать для вас. Он будет основан на некоторых предположениях, но это поможет сузить список возможных идентичных функций. Это не был бы автоматизированный процесс, но это потребовало бы ручного просмотра дубликатов. Исходя из комментариев, кажется, что автоматизированные инструменты не сравнивают атрибуты, так что это поможет вам не случайно удалить объекты.
Использование ArcMap
(1) Сделайте копию своего шейп-файла на случай, если что-то пойдет не так.
(2) Добавьте столбец в свой шейп-файл как двойной.
(3) Рассчитайте площадь для каждого объекта, используя наиболее описательный (самый точный) формат, который вы можете. Что-то, где округление не может быть проблемой.
(4) Запустите сводку (итоги) по этому столбцу. Убедитесь, что вы выбрали уникальный идентификатор в сводке и отметили как первый, так и последний.
(5) В вашей выходной таблице найдите те записи, в которых поле счетчика больше 1.
(6a) Вручную проверьте функции и повторяйте процесс, пока больше не будет дубликатов.
(6b) Вы можете просто создать список этих уникальных идентификаторов и удалить объекты с помощью arcpy, но у вас есть шанс получить два неидентичных объекта с одной и той же областью.
Другая техника с использованием ArcPy
Когда я строил приведенный выше ответ, я думал о возможности того, что несколько авторов этих данных могли использовать одни и те же уникальные идентификаторы для дублированных функций. Если это так, вы можете найти дубликаты в цикле arcpy.
То, как я думаю об этом с помощью ArcPy, может обойтись без вашей системы.
(1) Сделайте копию своего шейп-файла (на всякий случай снова)
(2) Добавьте новый столбец для обозначения дубликатов. Что-то, что принимает как 'y' или 'n' или 0 или 1 или что-то еще, будет работать.
(3) Создайте список в Python для хранения уникального идентификатора.
(4) Запустите курсор обновления ( arcpy.UpdateCursor('LAYERNAME')
). Для каждой записи проверьте свой список, чтобы увидеть, содержит ли он этот идентификатор, и отметьте свой столбец для дубликатов, если он там есть.
myList = []
rows = arcpy.UpdateCursor("layername")
for row in rows:
if str(row.UniqueIdentifier) in myList:
#value duplicated
row.DuplicateColumnName = "y"
else:
#not there, add it
myList.append(row.UniqueIdentifier)
rows.updateRow(row)
(5) Затем вы можете сравнить или сделать все, что вы хотите с этими отмеченными столбцами.
Вероятно, есть более эффективные способы проведения этих сравнений, но я считаю, что это два, которые должны сработать или, по крайней мере, помочь вам начать.
редактировать
Основываясь на комментарии elrobis , вы можете использовать минимальный ограничивающий прямоугольник, чтобы еще больше снизить вероятность удаления неправильных объектов.
Используя ArcMap, вы можете запустить инструмент Minimum Bounding Geometry в Data Management. После проверки параметров, я думаю, что использование параметра CONVEX_HULL , вероятно, было бы лучше.
Если вы сравните поля MBG_APodX / Y1 , MBG_APod_X / Y2 и MBG_Orientation для дубликатов, вы сможете получить представление о дублированных функциях. Я бы предложил использовать метод Summarize, который я описал выше, для сравнения. Выберите одну из вершин (координат) из ограничивающего прямоугольника, чтобы найти дубликаты. Вы можете получить несколько случайных «совпадений», но как только вы добавите в другие вершины плюс ориентацию, было бы вполне уверенным, что функции результатов будут дубликатами.
Хотя я не использовал его и не совсем уверен в результатах этого инструмента, вам может показаться, что изучить полученный шейп-файл проще, если вы используете инструмент Сводная статистика в ArcMap. Похоже, что вы можете суммировать несколько столбцов таким образом, вместо моего варианта одного столбца.
Я не думаю, что был бы полностью автоматизированный способ сделать это, не беспокоясь о возможности удаления не дублирующейся функции. Эти методы должны помочь ограничить количество функций, которые вам необходимо будет просмотреть вручную.