r - 从多边形中分离出一条线并测量其长度
问题描述
我正在尝试测量海岸线的长度。这将用作分析中沿海岸线位置的度量。例如,假设我有一个地区所有公共海滩位置的数据,我想通过测量它们与海岸参考点的距离来描述它们在空间中的分布情况。
我已经按照这个非常有用的教程使用不同长度的尺子计算海岸线的长度。但是,仅当您要测量整个多边形长度时才准确,即您感兴趣的地理对象是一个岛屿。
获取海岸线的 shapefile(请注意,在ne_countries
调用中我故意使用粗略的比例,以使海岸线更平滑,并且只保留返回的第一个形状——“scalerank”名称并不重要):
library(raster)
library(sf)
library(rnaturalearth)
basemap <- rnaturalearth::ne_countries(scale = 110, country = "united states of america", returnclass = "sf")[1]
bbox <- extent(-82, -65, 27, 35)
cropmap <- st_crop(basemap, bbox)
plot(cropmap)
这将返回一个显示南大西洋沿岸进入佛罗里达的形状。然而,如果我测量这个形状的长度,它将包括多边形的所有边——而不仅仅是海岸线。如何隔离海岸线(请参阅下面的地图,了解多边形的哪个部分实际上是沿海的)并仅在 R 中测量其长度?
ggplot() +
geom_sf(data=basemap) +
geom_sf(data=cropmap, color="blue", fill="blue")
解决方案
这是一个类似于罗伯特的版本,留在sf
. bbox
我将原始底图从多边形转换为线,然后像你一样“剪掉” 。然后你可以用 测量st_length
。
library(sf)
library(rnaturalearth)
basemap <- rnaturalearth::ne_countries(scale = 110, country = "united states of america", returnclass = "sf")[1]
从多边形转换为线,以避免多边形的您不想要的部分
basemap_lines <- basemap %>% st_cast("MULTILINESTRING")
plot(basemap_lines)
底图作为多线字符串
然后创建饼干切割多边形,将其设置crs
为纬度/经度
xmin <- -82
xmax <- -65
ymin <- 27
ymax <- 35
bbox <- st_polygon(list(rbind(c(xmin,ymin), c(xmin,ymax), c(xmax,ymax), c(xmax,ymin),c(xmin,ymin)))) %>% st_sfc()
st_crs(bbox) <- 4326
然后只需裁剪st_intersection
crop_lines <- st_intersection(basemap_lines, bbox)
plot(crop_lines)
st_length(crop_lines)
对于您的bbox
尺寸,我得到 1162849 米(约 723 英里),这与另一个答案一致。