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)