从多边形中分离出一条线并测量其长度

时间:2019-04-23 13:55:24

标签: r spatial

我正在尝试测量海岸线的长度。这将用作分析中沿海岸线的位置的度量。例如,假设我有一个区域中所有公共海滩的位置数据,并且我想通过测量距海岸参考点的距离来描述它们在空间中的分布。

我遵循this extremely helpful tutorial使用不同长度的标尺计算海岸线的长度。但是,仅当您要测量整个多边形的长度时才是正确的,也就是说,您感兴趣的地理对象是一个岛。

要获取海岸线的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)

enter image description here

这将返回一个形状,显示南大西洋海岸一直到佛罗里达。但是,如果我测量此形状的长度,它将包括多边形的所有边,而不仅仅是海岸线。如何隔离海岸线(有关多边形的哪个部分实际上位于沿海地区的地图,请参见下文),并仅测量其在R中的长度?

ggplot() +
  geom_sf(data=basemap) +
  geom_sf(data=cropmap, color="blue", fill="blue")

enter image description here

2 个答案:

答案 0 :(得分:4)

这是与Robert相似的版本,保留在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)

Basemap as multilinestring 然后创建千篇一律的多边形,将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)

Cropped line

对于您的bbox尺寸,我得到1162849米(〜723英里),与其他答案一致。

答案 1 :(得分:2)

如果在裁剪之前将多边形转换为线,则非常简单

示例数据

library(raster)
library(rnaturalearth)
m <- rnaturalearth::ne_countries(scale = 110, country = "united states of america", returnclass = "sp")
ext <- extent(-82, -65, 27, 35) 

转换并裁剪

m <- as(m, "SpatialLines")   
croplines <- crop(m, ext)

由于CRS是经度/纬度,因此请使用地域而非rgeos来计算长度

library(geosphere)
lengthLine(croplines)
#[1] 1162849

(即1162.8公里)

在某些情况下,您可能需要与多边形相交而不是与范围相交(请参见raster::drawPolyraster::intersect),或者可能使用cropdisaggregate和视觉上{{ 1}}以获取所需的行。