raster::erase function - Ошибка в RGEOSBinTopoFunc: TopologyException

Я использую функцию стирания растрового пакета в соответствии с моим предыдущим решением для вырезания и растворения перекрывающихся полигонов - растворение перекрывающихся полигонов с использованием разницы и объединения в R

Для некоторых полигонов я получаю ошибку ниже с функцией стирания:

Ошибка в RGEOSBinTopoFunc(spgeom1, spgeom2, byid, id, drop_lower_td, unaryUnion_if_byid_false,: TopologyException: входной geom 1 недействителен: самопересечение в точке 1.1197332302192855 47.203098020153668 в точке 1.1197332302192855 47.203098020153668 на 1.11928156832302

library(raster)
library(rgeos)
library(sp)

fields <- gBuffer(fields, byid=TRUE, width=0) # Expands the given geometry to include 
the area within the specified width 

zone <- fields[fields$Type == "Zone", ]
plot <- fields[fields$Type == "Plot", ]

d <- erase(zone, plot) #issue here
spplot(d, "Rx")

# I tried using rgeos::gBuffer to avoid RGEOSBinTopology Exception but it did not worked out. Any guidance in this area would be really helpful.

zone <- gBuffer(zone, byid=TRUE, width=0)
plot <- gBuffer(plot, byid=TRUE, width=0)

1 ответ

Решение

Полигоны сюжета действительно беспорядочные. Хотя они действительны. Проблемы возникают вerase становится агрегированным ("растворенным") аргументом y("поля"), но это создает недопустимую топологию. Мне нужно понять, как это лучше всего поймать, но пока (и, возможно, на время), вот обходной путь с помощью cleangeo, но вы можете использовать инструмент, который очищает полигоны полей (вершины привязки) -- возможно, с Rmapshaper?

library(raster)
library(rgeos)

f <- "WUERZ-I-WW _ Plot _TrialMap.shp"
fields = shapefile(f)
zone <- fields[fields$Type == "Zone", ]
plot <- fields[fields$Type == "Plot", ]

aplot <- aggregate(plot)
rgeos::gIsValid(aplot)
#[1] FALSE
#Warning message:
#In RGEOSUnaryPredFunc(spgeom, byid, "rgeos_isvalid") :
#  Self-intersection at or near point 13.033265979999999 51.190776640000003

library(cleangeo)
cplot <- clgeo_Clean(aplot)
rgeos::gIsValid(cplot)
# TRUE

d <- erase(zone, cplot) 
Другие вопросы по тегам