在 R 中从 25 公里的海岸线创建缓冲区并计算近岸面积

Create buffer from coastline 25km in R and calculate nearshore area

提问人:Alyssa C 提问时间:11/17/2023 更新时间:11/24/2023 访问量:83

问:

赏金将在 5 天后到期。这个问题的答案有资格获得 +100 声望赏金。Alyssa C 正在寻找来自信誉良好的来源的答案
我无法在 R 中找到解决方法。 在 R 中欢迎 - 首选解决方案,但将在 GIS 中采用详细的解决方案,该解决方案可以作为 shapefile 上传到 R

我正在尝试创建一张包含多边形的地图,这些多边形表示从每个国家/地区的海岸线进入海洋的 25 公里缓冲区,以便我可以计算每个国家/地区在此缓冲区内的面积。我在使用上传的海岸线文件和 naturalearth 数据时都遇到了麻烦。这是我到目前为止尝试过的:

library(rgdal)
library(sf)
library(rnaturalearthdata)
library(rnaturalearth)
library(rgeos)
library(maps)
library(countrycode)

# World polygons from the maps package

world_shp <- sf::st_as_sf(maps::map("world", plot = T, fill = TRUE))

world_shp_df <- world_shp %>%
  mutate(Alpha.3.code = countrycode(ID, "country.name", "iso3c", warn = FALSE))

# Get coastlines using rnaturalearth
coastline <- ne_coastline(scale = "medium", returnclass = "sf")

# Buffer the coastlines by 25 km
buffer_distance <- 25000  # 25 km in meters
coastline_buffers <- st_buffer(coastline, dist = buffer_distance) %>%
  st_make_valid() 

ggplot() +
  geom_sf(data = coastline_buffers , fill = "lightblue")


这将导致一张带有水平线的地图,请参见下图:

enter image description here

我尝试过使用不同的 crs 简化几何形状,但我似乎无法弄清楚。任何帮助将不胜感激!

R 映射地理 空间 rnaturalearth

评论

0赞 Friede 11/17/2023
你试过这个吗?rdrr.io/github/UW-Upwelling-Project/imageryML/src/R/......您需要找到 和 函数的替代品。rgeosspatialEco
0赞 Alyssa C 11/17/2023
是的,我已经尝试过了,但我认为 spatialEco 包已经过时了?当我浏览它时,我也收到此错误: wk_handle.wk_wkb(wkb, s2_geography_writer(oriented = oriented, : Loop 12 edge 1841 has duplicate near loop 16 edge 3”
0赞 Alyssa C 11/17/2023
我也尝试了该函数的多次迭代,但无法通过缓冲阶段。错误消息为:wk_handle.wk_wkb(wkb, s2_geography_writer(oriented = oriented, : Loop 0 is not valid: Edge 0 crosses edge 78)
0赞 Friede 11/17/2023
是的,当然。你需要找到替代品。给定的例程可能有助于实现您的目标。
0赞 Alyssa C 11/17/2023
好的,我明白了,但我只是找不到替代方案,几天来我一直在尝试寻找解决方法,但没有运气。如果有什么想法,请告诉我!谢谢。

答:

1赞 Waldi 11/24/2023 #1

st_buffer在纬度两端(+/- 180°)进行计算时遇到困难,从而产生水平条纹。

分析具有此类条纹的多边形表明,它们都具有位于 的点。xmin = -180

这些条纹可以通过它们的边界框进行排序:

stripes <- sapply(coastline_buffers$geometry,\(x) {bbox <- st_bbox(x); unname(bbox$xmin==-180)})
which(stripes)
#[1]    1   61  138  297  298  299  811 1352 1353 1387 1388 1404

ggplot() +
  geom_sf(data = coastline_buffers[stripes,] , fill = "lightblue")

enter image description here

一个快速的解决方法是从多边形中删除这些错误点:

# Create a band from latitudes -175° to 180° 
cleanup <- data.frame(lon=c(-175,-175,180,180,-175),lat=c(90,-90,-90,90,90)) %>% 
           st_as_sf(coords = c("lon", "lat"), 
           crs = st_crs(p[1,])) %>% 
           st_bbox() %>% 
           st_as_sfc()

# Remove points in this band
coastline_buffers_cleaned <- st_difference(coastline_buffers,cleanup)


ggplot() +
  geom_sf(data = coastline_buffers_cleaned , fill = "lightblue")

enter image description here

这种清理不是 100% 准确的,因为地图两端的一些沿海区域消失了,但条纹消失了,与总缓冲区相比,移除的区域可以忽略不计。