Estou tentando realizar uma união em um campo comum após mesclar dois shapefiles adjacentes. Os arquivos de forma acabam com pelo menos um pedaço fino de espaço entre eles. Quando tento uma união, recebo o seguinte erro de orfão órfão:
Erro no createPolygonsComment (p): rgeos_PolyCreateComment: furo órfão, não é possível encontrar o polígono que contém o furo no índice 17
Fiz upload de um exemplo reproduzível para o Dropbox neste link .
Aqui está o código para recriar o problema:
#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)
Devoluções:
Erro no createPolygonsComment (p): rgeos_PolyCreateComment: furo órfão, não é possível encontrar o polígono que contém o furo no índice 17
Tentando a correção proposta aqui e aqui :
slot(example, "polygons") <- lapply(slot(example, "polygons"), checkPolygonsHoles)
Isso retorna o mesmo erro que vem da tentativa de união, mas com número de índice diferente:
rgeos_PolyCreateComment: furo órfão, não é possível encontrar o polígono que contém o furo no índice 30
Tentando a correção proposta no útil tutorial de Roger Bivand
fix <- slot(example, "polygons")
fixa <- lapply(fix, checkPolygonsHoles)
Retorna o mesmo erro no índice 30 como acima.
Outros têm levantado este problema aqui e aqui , e enquanto as soluções postuladas acima parecem funcionar para alguns casos, outros casos não são resolvidos. Um usuário usou o QGIS para solucionar o problema, e o outro teve 2 dos 3 itens corrigidos, mas nenhuma solução para o final.
Parece que as pessoas continuam tendo problemas, apesar desse código funcionar periodicamente. Alguém encontrou uma solução no R?
Eu executei a ferramenta "reparar geometria" no ArcGIS e corrigiu o problema, mas parece que deve haver uma correção no R.
Respostas:
Analisei os problemas de geometria nos dados anexados e parece que ele não tem SOMENTE,
orphaned holes
mas tambémgeometry validity issues
. É verdade que umorphaned hole
é de alguma forma um problema de validade da geometria, mas o rgeos não lida com o mesmo problema, pois para orfãos órfãos, um erro é gerado, em vez de um simples aviso. Como você indica, são dicas para verificar orifícios de polígonos, mas nem sempre são bem-sucedidos quando aplicados para corrigir orifícios órfãos.Então vamos:
limpe seus dados (o que é necessário se você deseja fazer geoprocessamento como união)
use os dados limpos com seu processo de união
1. Geometria de limpeza Às vezes, as geometrias de fixação no R podem ser um desafio, por isso tentei criar um pacote R experimental (consulte https://github.com/eblondel/cleangeo ) que pretende facilitar a limpeza de
sp
objetos (atualmente limitado a formas poligonais). Você pode instalar o pacote com:Para começar, é bom que você veja quais são os problemas de geometria com seus dados de origem. Para isso, você pode executar o seguinte (seus dados são grandes e podem levar algum tempo):
Com isso, você verá que seus dados têm 2 tipos de problemas:
orphaned holes
egeometry validity issues
. É provável que ambos (e não apenas os orfãos órfãos) façam com que ounion
processo falhe; portanto, os dados devem ser limpos antes, de maneira automatizada, quando possível. Para uma reprodução rápida, o primeiro código de exemplo abaixo leva apenas o subconjunto de recursos que são marcados como suspeitos (exceto o mais recente, com índice = 9002 nos dados originais - veja minha nota abaixo)Se
clgeo_Clean
o trabalho for bom, você deve obter todas as geometrias válidas agora. Você pode aplicar isso ao conjunto de dados completo (exceto o índice de recursos = 9002)2. Processo de união Agora, vamos ver se
union
funciona neste conjunto de dados:Nota: como dito anteriormente, removi um recurso (índice = 9002). Ao plotá-lo:,
plot(sp[9002,])
você verá que esse recurso é muito (muito) complexo. Eu o excluí da amostra apenas porque a verificação de buracos estava demorando muito. Vamos ver agora se o mesmo problema ocorre usandoreadShapePoly
(demaptools
) para ler os dados ...3. Alterne para readShapePoly vs. readOGR para ler dados (UPDATE)
readOGR
não é a única função disponível para ler shapefiles. Você também pode usarreadShapePoly
domaptools
pacote, geralmente com melhor desempenho que o primeiro:Além de correr mais rápido:
se você usar o código acima com base em
clgeo_CollectionReport
, não há problema de orfãos órfãos, mas ainda problemas de geometria.A limpeza da geometria
clgeo_Clean
também funciona bem e agora não fica presa ao índice de recursos 9002E ... o processo de união funciona.
Veja abaixo o resultado da plotagem:
Conclusão : prefira maptools para ler seus dados do shapefile e considere usar o cleangeo para limpar seus dados antes de qualquer geoprocessamento.
fonte
Uma solução conveniente que continua trabalhando para mim no R é aplicar um buffer de largura zero :
unionSpatialPolygons leva um tempo com esse conjunto de dados, mas parece funcionar muito bem.
fonte