【问题标题】:Isolating a line from a polygon and measuring its length从多边形中分离出一条线并测量其长度
【发布时间】:2019-04-23 13:55:24
【问题描述】:

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

我遵循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)

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

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

【问题讨论】:

    标签: r spatial


    【解决方案1】:

    这是一个类似于 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 英里),这与另一个答案一致。

    【讨论】:

      【解决方案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 是经度/纬度,所以使用 geosphere 而不是 rgeos 来计算长度

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

      (即 1162.8 公里)

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多