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

Posted

技术标签:

【中文标题】连接空间数据时如何解决球面几何故障【英文标题】:How to resolve spherical geometry failures when joining spatial data 【发布时间】:2021-09-29 08:12:01 【问题描述】:

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

library(sf)
library(readr)
shape <- read_sf("data/mesopelagic_regions/GlasgowMesopelagicProvinces_v1_2017.shp")
data<- read_csv("data/data.csv")

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

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

st_join(pts, shape)

我尝试了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 包来执行此任务,我总是以这个错误结束。我更新了库以查看它是否有帮助,但我无法使其工作。

非常感谢您在这件事上的帮助

【问题讨论】:

【参考方案1】:

你有两个选择:

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

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

yer_object$geometry <- yer_object$geometry %>%
  s2::s2_rebuild() %>%
  sf::st_as_sfc()

【讨论】:

你是对的!我试过sf::sf_use_s2(FALSE),它现在可以工作了! 超级好,很高兴为您服务! :) 我也偶然发现了这个错误,这让我发疯了,因为使用相同的输入在 python 中运行顺利。 @jiladata 您能解释一下 1.0 版中的哪些变化导致了意外行为吗?谢谢 嗨@IvanP! sf v1.0 中的更改是从 GEOS 的未投影坐标(地理坐标,即纬度 - 长时间在 EPSG 4326 中)的后端引擎移动到 Google 的 s2。 GEOS 将投影坐标视为平面坐标(即两个点位于一条无限最大长度的线上),而 s2 更“正确”(两个点位于一个 40 075 公里的大圆上)。默认后端的更改会产生影响,因为 GEOS 和 s2 都在走捷径并采取(不同的)假设。查看r-spatial.github.io/sf/articles/sf7.html了解更多信息 感谢您的清晰解释!我快速浏览了 sf v1.0 的文档并最终访问了您链接的同一页面。

以上是关于连接空间数据时如何解决球面几何故障的主要内容,如果未能解决你的问题,请参考以下文章

空间权重矩阵的那些事-球面距离权重矩阵

安装易优cms提示 数据库连接失败,请重新设定

如何将(r,球形谐波)空间中表示的数据内插到常规笛卡尔网格(F90)?

mongo如何删除数据后相应的删除空间和内存占用

由于C#中ADO.NET对Oracle的命名空间引用时提示过时,为此想用Linq对数据库的连接等操作(见补充)

SQLserver数据库,最近几天的日志非常大啥原因?