Cha*_*son 1 r geospatial shapefile r-sf
所以我试图在地球上绘制一堆坐标并跟踪每个国家有多少个坐标。我已经很好地绘制了地图和坐标,但是当我尝试使用交集来计算每个国家(多边形)内有多少个坐标时,会导致错误。我尝试使用 st_make_valid 函数来修复地球形状文件,但它弄乱了几何形状。我是 R 的新手,因此我们将不胜感激。
我使用以下代码来绘制地球形状文件和顶部的坐标:
library(tidyverse)
library(sf)
library(rmapshaper)
library(rnaturalearth)
library(rnaturalearthdata)
library(sp)
library(raster)
###############
# Load Data
###############
# Read in data from .csv file
MeteoriteData <- read.csv("C:/Users/ChaseDickson_/Desktop/College/AERO 689/Semester Project/Meteorite Landings.csv")
# Convert these points to an SF object, specifying the X and Y
# column names, and supplying the CRS as 4326 (which is WGS84)
MeteoriteData.sf <- st_as_sf(MeteoriteData, coords=c('long', 'lat'), crs=4326)
world <- (ne_countries(scale = "medium", returnclass = "sf"))
MeteoriteMap <- ggplot(data = world) +
geom_sf() +
geom_sf(data = MeteoriteData.sf, size = 0.5, shape = 23, fill = "darkred") +
theme_bw()
MeteoriteMap
Run Code Online (Sandbox Code Playgroud)
这给出了以下情节
但是,当获取代码的交集时,我使用了这个
intersection <- st_intersection(x = world, y = MeteoriteData.sf)
但它给出了错误
Error in wk_handle.wk_wkb(wkb, s2_geography_writer(oriented = oriented, :
Loop 96 is not valid: Edge 743 crosses edge 998
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我通过添加 st_make_valid 改变了世界 sf,如下所示:
world <- st_make_valid(ne_countries(scale = "small", returnclass = "sf"))
现在这允许交集函数像这样工作:
intersection <- st_intersection(x = world, y = MeteoriteData.sf)
int_result <- intersection %>%
group_by(sovereignt) %>%
count()
Run Code Online (Sandbox Code Playgroud)
输出记录如下所示
然而,这会混淆图中的国家(多边形),并且会提供不准确的数据,如下所示的新地球形状文件:
任何帮助弄清楚如何维护第一个图,但在添加 st_make_valid 后仍然使交集函数和计数正常工作将不胜感激!
该{rnaturalearth}软件包有着悠久而富有成效的历史,但是 - 有点像类似的{maps}软件包 - 它属于一个不同的、要求较低的时代。你应该考虑对它做一个玛丽·近藤:感谢它的服务,然后放手吧。
因此,与其尝试修复其缺陷,不如寻找世界数据集的不同实例,这是一个非常常见且标准化的用例。
考虑这段代码,并注意它不是单个错误的几何图形,而是 6 个(共 241 个)。一一纠正是徒劳的。
library(sf)
rnaturalearth::ne_countries(scale = "medium", returnclass = "sf")|>
st_is_valid() |>
table()
# FALSE TRUE
# 6 235
Run Code Online (Sandbox Code Playgroud)
我首选的世界国家数据源是该{giscoR}软件包,它连接 GISCO 空间数据集,最终由欧盟统计局维护。
它非常方便,已知有效并且得到积极维护。
giscoR::gisco_get_countries(resolution = "20") |>
st_is_valid() |>
table()
# TRUE
# 257
Run Code Online (Sandbox Code Playgroud)
一旦你摆脱了无效的几何图形,你的代码的其余部分 - 交集和绘图部分 - 应该可以正常工作。