首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将直线与多边形分离并测量其长度

将直线与多边形分离并测量其长度
EN

Stack Overflow用户
提问于 2019-04-23 21:55:24
回答 2查看 250关注 0票数 1

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

我跟随this extremely helpful tutorial使用不同长度的尺子计算海岸线的长度。但是,只有当您想要测量整个多边形的长度,即您感兴趣的地理对象是一个岛屿时,它才是准确的。

要获取海岸线的shapefile (请注意,在ne_countries调用中,我故意使用粗略的比例,以使海岸线更平滑,并且只保留返回的第一个形状-- "scalerank“名称并不重要):

代码语言:javascript
运行
复制
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为单位测量其长度?

代码语言:javascript
运行
复制
ggplot() +
  geom_sf(data=basemap) +
  geom_sf(data=cropmap, color="blue", fill="blue")

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-25 12:51:10

这是一个类似于罗伯特的版本,停留在sf中。我将原始底图从多边形转换为线条,然后像您一样“裁剪”bbox。然后你就可以用st_length来测量了。

代码语言:javascript
运行
复制
library(sf)
library(rnaturalearth)
basemap <- rnaturalearth::ne_countries(scale = 110, country = "united states of america", returnclass = "sf")[1]

将面转换为线,以避开面中不需要的部分

代码语言:javascript
运行
复制
basemap_lines <- basemap %>% st_cast("MULTILINESTRING")
plot(basemap_lines)

然后,Basemap as multilinestring创建曲奇切割器多边形,将crs设置为经度/经度

代码语言:javascript
运行
复制
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进行裁剪

代码语言:javascript
运行
复制
crop_lines <- st_intersection(basemap_lines, bbox)
plot(crop_lines)
st_length(crop_lines)

Cropped line

对于你的bbox尺寸,我得到了1162849米(~723英里),这与另一个答案一致。

票数 4
EN

Stack Overflow用户

发布于 2019-04-25 11:37:10

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

示例数据

代码语言:javascript
运行
复制
library(raster)
library(rnaturalearth)
m <- rnaturalearth::ne_countries(scale = 110, country = "united states of america", returnclass = "sp")
ext <- extent(-82, -65, 27, 35) 

变换和裁剪

代码语言:javascript
运行
复制
m <- as(m, "SpatialLines")   
croplines <- crop(m, ext)

因为CRS是经度/纬度,所以使用geosphere而不是rgeos来计算长度。

代码语言:javascript
运行
复制
library(geosphere)
lengthLine(croplines)
#[1] 1162849

(即1162.8公里)

在某些情况下,您可能需要与多边形相交,而不是与范围相交(请参见raster::drawPolyraster::intersect),或者可能使用cropdisaggregate和可视select来获得所需的线。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55812907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档