Я пытаюсь выполнить объединение на общем поле после объединения двух смежных шейп-файлов. Шейп-файлы заканчиваются как минимум одним узким промежутком между ними. Когда я пытаюсь объединиться, я получаю следующую ошибку:
Ошибка в createPolygonsComment (p): rgeos_PolyCreateComment: потерянная дыра, не удается найти содержащий полигон для дыры с индексом 17
Я загрузил воспроизводимый пример в Dropbox по этой ссылке .
Вот код для воссоздания проблемы:
#loading required packages
require(sp)
require(rgdal)
require(maptools)
require(rgeos)
#load example data, set "dsn=" to your working directory or specify the path
example <- readOGR(dsn=".",layer="ReproducibleExample")
#Attempting a UnionSpatialPolygons based on the COUNTY field
example.df <- as(example, "data.frame")
countycol <- example.df$COUNTY
example.diss <- unionSpatialPolygons(example, countycol)
Возвращает:
Ошибка в createPolygonsComment (p): rgeos_PolyCreateComment: потерянная дыра, не удается найти содержащий полигон для дыры с индексом 17
Попытка исправить предложенное здесь и здесь :
slot(example, "polygons") <- lapply(slot(example, "polygons"), checkPolygonsHoles)
Это возвращает ту же ошибку, которая приходит от попытки объединения, но с другим порядковым номером:
rgeos_PolyCreateComment: потерянная дыра, не может найти содержащий полигон для дыры с индексом 30
Попытка исправить предложенное в полезном уроке Роджера Биванда
fix <- slot(example, "polygons")
fixa <- lapply(fix, checkPolygonsHoles)
Возвращает ту же ошибку с индексом 30, как указано выше.
Другие поднимали эту проблему здесь и здесь , и, хотя приведенные выше решения, по-видимому, работают для некоторых случаев, другие случаи не решаются. Один пользователь использовал QGIS для решения проблемы, а другому было исправлено 2 из 3 пунктов, но окончательного решения не было.
Похоже, что у людей продолжают возникать проблемы, несмотря на то, что этот код работает время от времени. Кто-нибудь нашел решение в R?
Я выполнил инструмент «восстановить геометрию» в ArcGIS, и он исправил проблему, но, похоже, в R. должно быть исправление
Ответы:
Я проанализировал проблемы геометрии в приложенных данных, и кажется, что это не только,
orphaned holes
но иgeometry validity issues
. Это правда, что вorphaned hole
некотором роде проблема достоверности геометрии, но rgeos не обрабатывает ее так же, как и для осиротевших отверстий, вместо простого предупреждения возникает ошибка. Как вы указываете, они являются подсказками для проверки многоугольных отверстий, но это не всегда успешно, когда применяется для исправления осиротевших отверстий.Итак, начнем:
очистите ваши данные (что необходимо, если вы хотите выполнять геообработку, например, объединение)
используйте очищенные данные в процессе объединения
1. Очистка геометрии Исправление геометрии в R может быть иногда сложным, поэтому я попытался создать экспериментальный пакет R (см. Https://github.com/eblondel/cleangeo ), который предназначен для облегчения очистки
sp
объектов (в настоящее время ограничен многоугольники). Вы можете установить пакет с помощью:Для начала, хорошо, что вы видите какие проблемы с геометрией у ваших исходных данных. Для этого вы можете выполнить следующее (ваши данные большие, поэтому это может занять некоторое время):
При этом вы увидите, что ваши данные имеют 2 вида проблем:
orphaned holes
иgeometry validity issues
. Обе (и не только осиротевшие дыры) могут привести кunion
сбою процесса, поэтому данные должны быть очищены до этого, при возможности, в автоматизированном режиме. Для быстрого воспроизведения первый пример кода ниже принимает только подмножество функций, которые помечены как подозрительные (за исключением последней, с исходными данными с индексом = 9002 - см. Мое примечание ниже об этом)Если вы
clgeo_Clean
хорошо справляетесь с работой, вы должны получить все геометрические фигуры. Вы можете применить это к полному набору данных (кроме индекса объекта = 9002)2. Процесс объединения Теперь, давайте посмотрим,
union
работает ли этот набор данных:Примечание: как было сказано ранее, я удалил одну функцию (индекс = 9002). Построив ее
plot(sp[9002,])
, вы увидите, что эта функция очень (очень) сложна. Я исключил его из образца только потому, что проверка отверстий заняла слишком много времени. Посмотрим теперь, возникает ли такая же проблема при использованииreadShapePoly
(изmaptools
) для чтения данных ...3. Переключитесь на readShapePoly против readOGR для чтения данных (ОБНОВЛЕНИЕ)
readOGR
это не единственная функция, доступная для чтения шейп-файлов. Вы также можете использоватьreadShapePoly
изmaptools
пакета, как правило, более производительный, чем первый:Помимо бега быстрее:
Если вы используете приведенный выше код, основанный на
clgeo_CollectionReport
проблемах, проблем с сиротами нет, но проблемы с геометрией остаются.Очистка геометрии с помощью
clgeo_Clean
также работает хорошо, и теперь она не застревает с индексом функции 9002И ... процесс объединения работает.
Смотрите ниже результат графика:
Вывод : предпочитайте maptools читать ваши данные шейп- файла и подумайте об использовании cleangeo для очистки ваших данных перед любой геообработкой.
источник
Удобное решение, которое продолжает работать для меня в R, это применить буфер нулевой ширины :
unionSpatialPolygons занимает некоторое время с этим набором данных, но, кажется, работает просто отлично.
источник