连接空间数据时如何解决球面几何故障

use*_*715 2 r r-sf

我有一个 shapefile(有几个多边形)和一个带坐标的数据框。我想将数据框中的每个坐标分配给 shapefile 中的多边形。因此,要在具有多边形名称或 id 的数据框中添加一列,这是数据链接

library(sf)
library(readr)
shape <- read_sf("data/mesopelagic_regions/GlasgowMesopelagicProvinces_v1_2017.shp")
data<- read_csv("data/data.csv")
Run Code Online (Sandbox Code Playgroud)

但是当我尝试加入他们时,我总是收到错误

pts = st_as_sf(data, coords = c("dec_lon", "dec_lat"), crs= 4326)

st_join(pts, shape)
Run Code Online (Sandbox Code Playgroud)

我尝试了over()函数和其他技巧,如 st_make_valid()但我总是收到此错误: Error in s2_geography_from_wkb(x, oriented = oriented, check = check) : Evaluation error: Found 30 features with invalid spherical geometry.

这是最近的问题(在我的代码工作之前),但现在我无法使用 sf 包来完成这项任务,我总是以这个错误告终。我更新了库以查看它是否有帮助,但我无法使其工作。

我真的很感激你在这件事上的帮助

Jin*_*cko 5

您有两个选择:

  1. 通过sf::sf_use_s2(FALSE)在脚本中关闭 s2 处理;理论上,行为应该恢复到 1.0 版之前的行为
  2. 修复多边形对象的球面几何;这将取决于您的错误的实际性质。

我无法访问您的文件并确定,但这段代码过去对我有帮助:

yer_object$geometry <- yer_object$geometry %>%
  s2::s2_rebuild() %>%
  sf::st_as_sfc()
Run Code Online (Sandbox Code Playgroud)

  • 你是对的!我尝试了`sf::sf_use_s2(FALSE)`,它现在可以工作了! (12认同)
  • 嗨@IvanP!sf v1.0 中的更改是将未投影坐标(地理坐标,即纬度 - 长如 EPSG 4326 中的坐标)的后端引擎从 GEOS 移至 Google 的 s2。GEOS 将投影坐标视为平面坐标(即,两个点位于无限最大长度的直线上),而 s2 则更“正确”(两个点位于周长为 40 075 公里的大圆上)。默认后端的更改具有影响,因为 GEOS 和 s2 都在走捷径并采取(不同的)假设。查看 https://r-spatial.github.io/sf/articles/sf7.html 了解更多信息 (7认同)