Как исправить ошибки сферической геометрии, вызванные преобразованием из GEOS в s2
У меня та же проблема, что и
Мой код, который раньше работал, теперь не работает с преобразованием из GEOS в s2.
Я не уверен, как мне создать воспроизводимый пример этой ошибки. Образцы наборов данных, которые поставляются с пакетом sf, отлично работают с этим кодом, поскольку я уверен, что они были обновлены для работы с пакетом s2 pacakge. Лучшее
ranges <- st_read("Data/Range maps/PRISM_shorebird_ranges_breeding/PRISM_shorebird_ranges_breeding.shp")
ranges2 <- ranges %>%
group_by(binomial) %>%
select(-seasonal, -Shape_Area) %>%
summarize()
Error in s2_geography_from_wkb(x, oriented = oriented, check = check) :
Evaluation error: Found 2 features with invalid spherical geometry.
[1] Loop 0 is not valid: Edge 319 has duplicate vertex with edge 322
[2] Loop 0 is not valid: Edge 53052 has duplicate vertex with edge 53055.
Я пробовал решения из раздела при устранении сбоев сферической геометрии при объединении пространственных данныхКак устранить ошибки сферической геометрии при объединении пространственных данных
У вас есть два варианта:
1. выключите обработку s2 через sf::sf_use_s2(FALSE) в вашем скрипте; теоретически поведение должно вернуться к тому, что было до выпуска 1.0
Это сработало, но не похоже на хорошее долгосрочное решение. Сохранится ли у меня эта проблема с другим кодом? Как предотвратить это и использовать обновленный пакет sf в полном объеме?
2. исправить сферическую геометрию вашего полигонального объекта; это будет зависеть от фактического характера ваших ошибок ".
ranges$geometry <- ranges$geometry %>%
s2::s2_rebuild() %>%
sf::st_as_sfc()
Error in s2_geography_from_wkb(x, oriented = oriented, check = check) :
Evaluation error: Found 22 features with invalid spherical geometry.
[1] Loop 2 is not valid: Edge 846 has duplicate vertex with edge 853
[2] Loop 10 is not valid: Edge 0 has duplicate vertex with edge 4
... and 20 more.
Как видите, у меня это решение не сработало. Как я могу исправить эту ошибку сферической геометрии?
1 ответ
Это не проблема с кодом, проблема с данными. S2 просто более строго относится к соответствию полигонов и выдает эту ошибку, когда встречает недопустимый полигон.
Полигоны здесь, кажется, имеют самопересечение, как
A--B
| |
D--C--E
| |
G--F
Эту форму следует описать как два многоугольника: ABCDA и CEFGC. Но часто его описывают как один многоугольник ABCEFGCDA (примечание C повторяется дважды) - что, вероятно, произошло и здесь. Некоторые библиотеки с радостью примут это, но S2 жалуется на повторяющиеся вершины.
C
в непоследовательных ребрах BC и GC.
Если можете, исправьте данные перед их загрузкой. Я знаю, что PostgreSQL / PostGIS обычно может исправить это - он принимает входной WKB и имеет
ST_MakeValid
который разделит его на несколько полигонов. R, кажется, есть
st_make_valid
https://rdrr.io/cran/sf/man/valid.html тоже (у меня нет личного опыта с этим).