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

问题描述 投票:0回答:3

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

library(sf)
library(readr)
shape <- read_sf("data/Provinces_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 包来执行此任务,我总是会遇到此错误。我更新了库以查看它是否有帮助,但我无法使其工作。

我非常感谢您在此事上的帮助

r r-sf s2
3个回答
71
投票

您有两个选择:

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

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

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

3
投票

我发现这种“无效的球面几何形状”确实不断出现。如果上面的

s2::s2_rebuild()
解决方案不起作用,通常对我有用的解决方案涉及投影和简化(稍微降低地图分辨率)。如果您的应用程序可以在较低分辨率下运行,请尝试此操作。

library(tidyverse)
library(sf)
crs_N = 3995 #northern polar projection

# example of FAILING map - with bad spherical geometry.
m_RU <- rnaturalearthdata::countries50 %>% 
  st_as_sf() %>% 
  filter((admin %in% c("Russia") )) |> 
  st_as_s2()

在示例中,我选择俄罗斯,因为它跨越了日期变更线,这可能是挑战之一。我切换到北极极地投影,并将地图分辨率降低到 10 公里(在这种情况下 5 公里是不够的!)。

# with 2 extra lines the problem is gone
m_RU <- rnaturalearthdata::countries50 %>% 
  st_as_sf() %>% 
  filter((admin %in% c("Russia") )) |> 
  st_transform(crs = crs_N)   |>  
  st_simplify(dTolerance = 10000) |> # to get rid of duplicate vertex (reduce to 10km steps)
  st_as_s2()

0
投票

通过编辑计算和公式来制造虚假的、未经证实和无法证明的数学“工作”,这是多么欺骗啊

© www.soinside.com 2019 - 2024. All rights reserved.