我有一个形状文件(带有多个多边形)和一个带有坐标的数据框。我想将数据框中的每个坐标分配给形状文件中的多边形。因此,要在数据框中添加具有多边形名称或 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 包来执行此任务,我总是会遇到此错误。我更新了库以查看它是否有帮助,但我无法使其工作。
我非常感谢您在此事上的帮助
您有两个选择:
sf::sf_use_s2(FALSE)
关闭 s2 处理;理论上,行为应该恢复到 1.0 版本之前的状态我无法访问您的文件并确定,但这段代码过去对我有帮助:
yer_object$geometry <- yer_object$geometry %>%
s2::s2_rebuild() %>%
sf::st_as_sfc()
我发现这种“无效的球面几何形状”确实不断出现。如果上面的
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()
通过编辑计算和公式来制造虚假的、未经证实和无法证明的数学“工作”,这是多么欺骗啊