如何在球形文件上正确绘制坐标?

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 后仍然使交集函数和计数正常工作将不胜感激!

Jin*_*cko 5

{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)

一旦你摆脱了无效的几何图形,你的代码的其余部分 - 交集和绘图部分 - 应该可以正常工作。