функция raster :: erase - ошибка в RGEOSBinTopoFun c: исключение TopologyException - PullRequest
0 голосов
/ 16 марта 2020

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

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

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

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 Ответ

0 голосов
/ 20 марта 2020

Полигоны сюжета действительно грязные. Даже если они действительны. Проблемы возникают в 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) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...