'TopologyException: Input geom 1 is invalid' ошибка самопересечения, которая возникает из-за неправильной геометрии многоугольника, широко обсуждалась. Однако в Интернете я не нашел удобного решения, которое бы опиралось исключительно на функциональность R.
Например, мне удалось создать объект «SpatialPolygons» из вывода map("state", ...)
следующего хорошего ответа Джоша О'Брайена здесь .
library(maps)
library(maptools)
map_states = map("state", fill = TRUE, plot = FALSE)
IDs = sapply(strsplit(map_states$names, ":"), "[[", 1)
spydf_states = map2SpatialPolygons(map_states, IDs = IDs, proj4string = CRS("+init=epsg:4326"))
plot(spydf_states)
Проблема с этим широко применяемым набором данных заключается в том, что самопересечение происходит в точке, указанной ниже.
rgeos::gIsValid(spydf_states)
[1] FALSE
Warning message:
In RGEOSUnaryPredFunc(spgeom, byid, "rgeos_isvalid") :
Self-intersection at or near point -122.22023214285259 38.060546477866055
К сожалению, эта проблема предотвращает дальнейшее использование spydf_states, например, при вызове rgeos::gIntersection
. Как я могу решить эту проблему изнутри R?
r
polygon
rgeos
self-intersection
fdetsch
источник
источник
plot(spydf_states, xlim=c(-122.1,-122.3),ylim=c(38,38.1))
вы увидите, что в ней нет «на первый взгляд» - есть самопересечение.Ответы:
Использование буфера нулевой ширины устраняет многие проблемы топологии в R.
Однако работа с непроецированными координатами в долготу может привести
rgeos
к выдаче предупреждений.Вот расширенный пример, который сначала перепроецируется в проекцию Альберса:
источник
gBuffer
"взломать" работает?sf
вы также можете использоватьsf::st_buffer(x, dist = 0)
PostGIS