Как исправить ошибки сферической геометрии, вызванные преобразованием из 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 тоже (у меня нет личного опыта с этим).

Другие вопросы по тегам