连接空间数据时如何解决球面几何故障
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 的文档并最终访问了您链接的同一页面。以上是关于连接空间数据时如何解决球面几何故障的主要内容,如果未能解决你的问题,请参考以下文章
如何将(r,球形谐波)空间中表示的数据内插到常规笛卡尔网格(F90)?