查找多线串和多边形 sf r 之间的交集

2023-12-10

我在地图上有一组空间坐标,以及穿过它们的多线串。我需要计算出线条在每种颜色的多边形内所花费的长度。

caveats:

  • 我的最小表示不是很好,我的实际数据是一个 data.frame,其中有一个颜色列(它是真实数据中的组)、一些标识列和一列多多边形几何体。我真的不知道如何制作它,所以我的 reprex 只有 3 个单独的多边形。
  • 有时两种颜色的多边形会重叠,在这种情况下,我希望区分线与重叠形状相交的长度和线仅与一种形状相交时的长度。

最小代表:

poly1 <-
  # create list of matrices and the first point same as last point
  list(
    matrix(
      c(0, 0, 
        4, 0, 
        5, 1, 
        4, 2, 
        3, 2,  
        1, 1,
        0, 0),
      ncol=2, byrow=T
    )
  ) 
poly1 <-  sf::st_polygon(poly1)


poly2 <-
  # create list of matrices and the first point same as last point
  list(
    matrix(
      c(4, 1, 
        7, 0, 
        7, 1, 
        6, 3, 
        3, 2,  
        2, 1,
        4, 1),
      ncol=2, byrow=T
    )
  ) 
poly2 <-  sf::st_polygon(poly2)


poly3 <-
  # create list of matrices and the first point same as last point
  list(
    matrix(
      c(7, 1, 
        10, 1, 
        12, 2, 
        11, 4, 
        8, 3,  
        7, 2,
        7, 1),
      ncol=2, byrow=T
    )
  ) 
poly3 <-  sf::st_polygon(poly3)



line <-   
  # create list of matrices and the first point same as last point
  list(
    matrix(
      c(0, 1, 
        2, 0, 
        4, 1, 
        6, 3, 
        8, 2,  
        10, 1,
        12, 1),
      ncol=2, byrow=T
    )
  ) 

line <-  
  sf::st_multilinestring(line)


ggplot() +
  geom_sf(data = poly1, fill = "green",alpha=.5) +
  geom_sf(data = poly2, fill = "blue",alpha=.5) +
  geom_sf(data = poly3, fill = "green", alpha=.5)+
  geom_sf(data = line, color="black", size=2) +
  ggthemes::theme_map()

期望的输出:

  • 仅裁剪到直线的 st 多边形的视觉表示(我使用 st_intersection()),如下所示:

poly1_cropped <- st_intersection( line, poly1)
poly2_cropped <- st_intersection( line, poly2)
poly3_cropped <- st_intersection( line, poly3)

ggplot() +
  geom_sf(data = poly1, fill = "green",alpha=.5) +
  geom_sf(data = poly2, fill = "blue",alpha=.5) +
  geom_sf(data = poly3, fill = "green", alpha=.5)+
  geom_sf(data = line, color="black", size=2) +
  ggthemes::theme_map() +
  geom_sf(data = poly1_cropped, color="green", size=2) +
  geom_sf(data = poly2_cropped, color="blue", size=2) +
  geom_sf(data = poly3_cropped, color="green", size=2) 

然后是一个数据框,用于量化线条何时穿过每个形状,如下所示:

shape |  color   |   shapes_overlapping |  length   
poly1    green             0               3
poly1    green             1               .5
poly2    blue              1               .5
poly2    blue              0               2
poly3    green             0               2.5




我有一个适用于您的示例的解决方案,您希望可以根据实际数据进行修改。

我做的第一件事就是结合所有 3 个POLYGON物体变成Simple feature collection,最初有一个MULTIPOLYGON但然后分成每个单独的POLYGON using st_cast().

# combine polygons into a single simple feature collection
c(poly1, poly2, poly3) %>% 
  # make into simple feature
  st_sfc %>% 
  st_sf %>% 
  # split into individual polygons
  st_cast('POLYGON') %>% 
  {. ->> int1}

int1

# Simple feature collection with 3 features and 0 fields
# Geometry type: POLYGON
# Dimension:     XY
# Bounding box:  xmin: 0 ymin: 0 xmax: 12 ymax: 4
# CRS:           NA
#                         geometry
# 1 POLYGON ((0 0, 4 0, 5 1, 4 ...
# 2 POLYGON ((4 1, 7 0, 7 1, 6 ...
# 3 POLYGON ((7 1, 10 1, 12 2, ...

接下来,查找是否有任何多边形重叠,如果重叠,则每个重叠处有多少层。我们用st_intersection()在这里,但与您找到两个几何图形之间的交集的示例不同,我们将其应用于单个几何图形sf对象,返回它的自交集,包括n.overlaps(层数)和origins(重叠区域中的原始多边形)。更多详细信息可以在以下位置找到sf page here。我们还做了一个新的id对于每个多边形和层数来说都是唯一的列。

# now, we need to find if any polygons overlap, and how many layers there are
int1 %>% 
  st_intersection %>% 
  filter(
    st_geometry_type(.) == 'POLYGON'
  ) %>% 
  mutate(
    id = row_number()
  ) %>% 
  {. ->> int2}

int2

# Simple feature collection with 4 features and 3 fields
# Geometry type: POLYGON
# Dimension:     XY
# Bounding box:  xmin: 0 ymin: 0 xmax: 12 ymax: 4
# CRS:           NA
#     n.overlaps origins                       geometry id
# 1            1       1 POLYGON ((4 0, 0 0, 1 1, 3 ...  1
# 1.1          2    1, 2 POLYGON ((4 2, 5 1, 4.75 0....  2
# 2            1       2 POLYGON ((7 1, 7 0, 4.75 0....  3
# 3            1       3 POLYGON ((7 2, 8 3, 11 4, 1...  4

为了证明这一点,我们可以绘制int2和颜色(fill)每个多边形由我们id column.

int2_plot <- int2 %>% 
  ggplot()+
  geom_sf(aes(fill = factor(id)))+
  geom_sf(data = line)

int2_plot

enter image description here

然后,我们使用ggplot2::ggplot_build()提取绘图的组成部分 - 特别是与每个多边形对应的颜色id。我们用plotrix::color.id()将十六进制颜色代码转换为颜色名称。这可能需要也可能不需要,具体取决于您如何解释颜色。

# now, get colours of each polygon from ggplot
int2_plot %>% 
  ggplot_build %>% 
  .$data %>% 
  .[[1]] %>% 
  tibble %>% 
  select(fill, group, id = group) %>% 
  rowwise %>% 
  mutate(
    colour = plotrix::color.id(fill), 
  ) %>% 
  select(id, colour) %>% 
  {. ->> plot_colours}

plot_colours

# # A tibble: 4 x 2
# # Rowwise: 
#      id colour       
#   <int> <chr>        
# 1     1 salmon       
# 2     2 chartreuse3  
# 3     3 turquoise3   
# 4     4 mediumpurple1

现在我们找到长度line与每个多边形相交。我们用st_intersection()找到LINESTRING与多边形重叠的对象,然后st_length()来计算它的长度。因为这个示例数据没有CRS,这个长度是无单位的,并作为一个返回numeric向量。如果您的数据有CRS, st_length()将返回一个units具有数字和距离单位的向量,例如3.726 [m];可以使用以下方式检索该号码as.numeric().

# now, what's the length of line intersecting each polygon (colour)?
int2 %>% 
  mutate(
    line_overlap = st_intersection(int2, line) %>% st_length
  ) %>% 
  {. ->> int3}

int3

# Simple feature collection with 4 features and 4 fields
# Geometry type: POLYGON
# Dimension:     XY
# Bounding box:  xmin: 0 ymin: 0 xmax: 12 ymax: 4
# CRS:           NA
#     n.overlaps origins                       geometry id line_overlap
# 1            1       1 POLYGON ((4 0, 0 0, 1 1, 3 ...  1    3.7267800
# 1.1          2    1, 2 POLYGON ((4 2, 5 1, 4.75 0....  2    0.7071068
# 2            1       2 POLYGON ((7 1, 7 0, 4.75 0....  3    2.1213203
# 3            1       3 POLYGON ((7 2, 8 3, 11 4, 1...  4    2.9814240

目前,我们有一行用于重叠区域,其中包含重叠中涉及的多边形的向量(origins)。为了为每个多边形创建一个单独的行,我们将origins to a list,然后可以使用以下方法将每个列表元素(原始多边形)分成单独的行unnest().

# now, duplicate rows where n.overlaps > 1 - so there's a row for each polygon in the overlap
int3 %>% 
  rowwise %>% 
  mutate(
    origins = list(origins)
  ) %>% 
  tidyr::unnest(cols = c('origins')) %>% 
  {. ->> int4}

int4

# Simple feature collection with 5 features and 4 fields
# Geometry type: POLYGON
# Dimension:     XY
# Bounding box:  xmin: 0 ymin: 0 xmax: 12 ymax: 4
# CRS:           NA
# # A tibble: 5 x 5
#   n.overlaps origins                                         geometry    id line_overlap
#        <int>   <int>                                        <POLYGON> <int>        <dbl>
# 1          1       1 ((4 0, 0 0, 1 1, 3 2, 2 1, 4 1, 4.75 0.75, 4 0))     1        3.73 
# 2          2       1      ((4 2, 5 1, 4.75 0.75, 4 1, 2 1, 3 2, 4 2))     2        0.707
# 3          2       2      ((4 2, 5 1, 4.75 0.75, 4 1, 2 1, 3 2, 4 2))     2        0.707
# 4          1       2 ((7 1, 7 0, 4.75 0.75, 5 1, 4 2, 3 2, 6 3, 7 1))     3        2.12 
# 5          1       3         ((7 2, 8 3, 11 4, 12 2, 10 1, 7 1, 7 2))     4        2.98 

最后,我们加入之前拉出的每个多边形的颜色。

# now, join in the colours of each polygon
int4 %>% 
  left_join(plot_colours) %>% 
  {. ->> int5}

int5

# Simple feature collection with 5 features and 5 fields
# Geometry type: POLYGON
# Dimension:     XY
# Bounding box:  xmin: 0 ymin: 0 xmax: 12 ymax: 4
# CRS:           NA
# # A tibble: 5 x 6
#   n.overlaps origins                                         geometry    id line_overlap colour       
#        <int>   <int>                                        <POLYGON> <int>        <dbl> <chr>        
# 1          1       1 ((4 0, 0 0, 1 1, 3 2, 2 1, 4 1, 4.75 0.75, 4 0))     1        3.73  salmon       
# 2          2       1      ((4 2, 5 1, 4.75 0.75, 4 1, 2 1, 3 2, 4 2))     2        0.707 chartreuse3  
# 3          2       2      ((4 2, 5 1, 4.75 0.75, 4 1, 2 1, 3 2, 4 2))     2        0.707 chartreuse3  
# 4          1       2 ((7 1, 7 0, 4.75 0.75, 5 1, 4 2, 3 2, 6 3, 7 1))     3        2.12  turquoise3   
# 5          1       3         ((7 2, 8 3, 11 4, 12 2, 10 1, 7 1, 7 2))     4        2.98  mediumpurple1

如果您不希望结果为sf对象,我们可以使用st_drop_geometry()仅返回属性组件。

# keep the attribute data only
int5 %>% 
  st_drop_geometry

# # A tibble: 5 x 5
#   n.overlaps origins    id line_overlap colour       
# *      <int>   <int> <int>        <dbl> <chr>        
# 1          1       1     1        3.73  salmon       
# 2          2       1     2        0.707 chartreuse3  
# 3          2       2     2        0.707 chartreuse3  
# 4          1       2     3        2.12  turquoise3   
# 5          1       3     4        2.98  mediumpurple1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找多线串和多边形 sf r 之间的交集 的相关文章

  • 多功能测试仪替代 system.time

    我已经看到 我认为是这样 使用了类似于 system time 的函数 它可以同时评估多个函数的时间并输出一个输出 我不记得它是什么 并且用我正在使用的术语进行互联网搜索并没有得到我想要的响应 有人知道我正在谈论的功能的名称 位置吗 你想要
  • 选择 R 中的数据表中隐藏时(在绿色加号下方)列的显示顺序

    Context 使用 DataTables 库制作交互式表格时 当屏幕宽度对于列的数量和宽度来说太窄时 列将隐藏在绿色 号下 我有一个非常宽的表格 有 20 多列 其中一些内容非常冗长 因此某些列在所有屏幕宽度下总是隐藏的 每次隐藏新列时
  • 将数据框中的每个 x 个字符拆分为字符串

    我知道这里有一些关于每隔一段时间分割一个字符串的答案nth字符 例如this one https stackoverflow com questions 23208490 split each character in r and this
  • R 中的快速 QR 分解

    我有大量矩阵 需要对其执行 QR 分解并存储生成的 Q 矩阵 进行归一化 以便 R 矩阵在其对角线上具有正数 除了使用之外还有其他方法吗qr 功能 这是工作示例 system time Parameters for the matrix t
  • twitterR 和 ROAuth R 软件包安装

    我在安装 CRAN 上的 twitteR 和 RAOuth 软件包时遇到一些问题 我尝试了几种不同的方法 在 Windows 下使用源代码 在 Ubuntu 下使用 RStudio 我尝试了以下命令 sudo apt get install
  • R独特的列或行与NA无可比拟

    有谁知道如果incomparables的论证unique or duplicated 曾经被实施过incomparables FALSE 也许我不明白它应该如何工作 无论如何 我正在寻找一个巧妙的解决方案 以仅保留与另一列相同的唯一列 或行
  • 在 R 中使用 lapply 绘制多个数据帧

    我正在尝试使用 lapply 函数绘制多个数据帧 每个数据帧一个图 但是尽管有关此主题的所有帖子我都找不到答案 因为我不断收到错误 图的输出列表为空 我的数据结构如下 df1 lt mtcars gt group by cyl gt tal
  • 使用 Shiny 发布平行坐标图表时出现“错误:路径[1]="”:没有这样的文件或目录”

    我有一个似乎很常见但我还没有找到解决方案的问题 当尝试使用 rCharts Parcoords 发布 Web 应用程序时 出现以下错误 错误 路径 1 没有这样的文件或目录 奇怪的是 该应用程序在我的笔记本电脑上运行得很好 下面是我正在使用
  • ddply 和aggregate 之间的区别

    有人可以通过以下示例帮助我了解聚合和 ddply 之间的区别 数据框 mydat lt data frame first rpois 10 10 second rpois 10 10 third rpois 10 10 group c re
  • 在 r 中的 group_by 之后建模后取消列表列的嵌套

    我想对所有组进行线性回归group by 将模型系数保存在列表列中 然后使用 unnest 扩展列表列 这里我用的是mtcars以数据集为例 注 我想用do here becausebroom tidy 不适用于所有型号 mtcars gt
  • 如何从 R 中的 txt 文件读取矩阵?

    我有一个带有矩阵的txt文件 Matrix txt 重要 数字之间没有空格 0100 1001 1100 我想在 R 中将其作为矩阵读取 我该怎么做 我尝试使用 as matrix read table Matrix txt sep 但失败
  • R:如何获取该月的周数

    我是 R 新手 我想要该日期所属月份的周数 通过使用以下代码 gt CurrentDate lt Sys Date gt Week Number lt format CurrentDate format U gt Week Number 3
  • SPSS 中的标准化残差与 R rstandard(lm()) 不匹配

    在寻找 R 相关解决方案时 我发现 R 和 SPSS 版本 24 在计算简单线性模型中的标准化残差方面存在一些不一致 看来SPSS所谓的标准化残差匹配 R学生化残差 我完全不认为某处存在软件错误 但显然这两个程序之间存在差异 看看这个例子
  • 实三次多项式的最快数值解?

    R 问题 寻找最快的方法来数值求解一堆已知具有实系数和三个实根的任意三次方程 据报道 R 中的 polyroot 函数对复杂多项式使用 Jenkins Traub 算法 419 但对于实多项式 作者参考了他们早期的工作 对于实三次或更一般的
  • 任意列中包含字符串的子集行

    我有一个如下所示的数据集 Col1 Col2 Col3 abckel NA 7 jdmelw njabc NA 8 jdken jdne 如何对数据集进行子集化 使其仅保留包含字符串 abc 的行 最终预期输出 Col1 Col2 Col3
  • 如何绘制具有显着性水平的箱线图?

    前段时间问了一个关于绘制箱线图的问题Link1 https stackoverflow com questions 14604439 plot multiple boxplot in one graph 我有一些包含 3 个不同组 或标签
  • 无法更改 RStudio 中的 R 版本

    我的 RStudio V 0 99 491 无法更改 R 版本 我以平常的方式行事Global Options gt R Version 然后它挂起并且不再工作或反应 R 运行良好的初始版本是R 3 1 0 我以前从未遇到过这样的问题 也许
  • 在 Shiny 中的用户会话之间共享反应数据集

    我有一个相当大的反应数据集 该数据集是通过轮询文件然后按预定义的时间间隔读取该文件而派生的 数据更新频繁 需要不断重新加载 诚然 重新加载可以增量完成并附加到 R 中的现有对象 但事实并非如此 然而目前 尽管会话中的数据相同 但此操作是针对
  • 线性判别分析图

    如何将样本 ID 行号 作为标签添加到此 LDA 图中的每个点 library MASS ldaobject lt lda Species data iris plot ldaobject panel function x y points
  • 如何使用 dplyr 独立过滤每列的行

    我有以下内容 library tidyverse df lt tibble tribble gene colB colC a 1 2 b 2 3 c 3 4 d 1 1 df gt A tibble 4 x 3 gt gene colB c

随机推荐

  • 使用 R 以及 R 数据框中的条件查询 MS SQL

    我在 MS SQL Server 中有一个相当大的表 1 2 亿行 我想查询它 我在 R 中还有一个数据帧 它具有唯一的 ID 我想将其用作查询条件的一部分 我熟悉 dplyr 包 但不确定是否可以在 MS SQL 服务器上执行 R 查询
  • SCNAction 完成处理程序等待手势执行

    我有一个动画SCNNodes由按钮触发 随后按下该按钮 动画就会反转 前进动画总是工作正常 但后退动画有时会挂起 也就是说 它将播放完成处理程序之前的部分 然后冻结 但是 当我应用三个手势 平移 平移 缩放 中的任何一个时 它会取消挂起并完
  • 如何为 TYPO3 9 LTS 编写路由方面映射器

    我需要一个自定义方面映射器类来定义可选获取参数的值 该参数保存带有额外数据的 cf cache 标识符 但是这个参数产生了一个我不需要的 cHash 参数 并且不想在 URL 中看到 文档 https docs typo3 org typo
  • Spring MVC 图像控制器,用于在 JSP 中显示图像字节

    我有一个 Spring MVC 应用程序 其中一个 JSP 必须显示来自数据库的图像 图像作为 Blob 存储在数据库中 显示它们的最简单方法是什么 我需要什么样的 servlet 控制器来在 JSP 上显示图像字节 应该是一个简单的问题
  • Makefile 问题:g++:致命错误:没有输入文件

    我已经做了什么 我查看了其他具有类似问题的 StackOverflow 线程 但它们似乎都不适用于我的具体情况 我还仔细检查以确保正确的文件位于正确的位置 文件夹 并且所有内容都命名正确 这是我收到的错误 email protected m
  • 如何安装/部署/构建我的 Visual C# 应用程序以便所有用户都可以使用?

    我已经用 Microsoft Visual C 2008 Express Edition 编写了一个应用程序 我想要安装它的 Windows XP 计算机有两个用户帐户 一个是管理员帐户 另一个是主用户帐户 没有管理员权限 我尝试以主用户身
  • 对两个对应的数组进行排序[重复]

    这个问题在这里已经有答案了 我这里的代码有两个数组 它排序arr 这样最高值将位于索引 0 中 现在是第二个数组arr1 包含字符串 我希望代码应用对arr to arr1 以便arr 0 将返回 6 而arr1 0 将返回字符串 d1 注
  • 如何获得这 2 列布局(是否适合内容)

    请注意 垂直滚动条应在需要时显示 左列适合宽度 右栏占据其余空间 这是一种仅使用 CSS 的方法 HTML 看起来像 div div
  • 如何获取char *(char数组)的真实长度和总长度?

    For a char 我可以通过以下方式轻松获得它的长度 char a aaaaa int length sizeof a sizeof char length 6 但是 我不能这样做来获取 a 的长度char by char a new
  • AttributeError:“字节”对象没有属性“编码”; Base64 编码 pdf 文件

    我正在尝试在 python 中对 pdf 进行 Base64 编码 对此的几个答案对其他人有效 但由于某种原因对我而言无效 我最近的尝试是 http stackoverflow com questions 12020885 python c
  • 使用 facebook 2.0 获取好友列表

    有没有办法使用 facebook 2 0 API 获取好友列表 我正在读这个从API升级现在看来要约朋友还是挺困难的 但我看到了2个权限 读取好友列表 用户朋友 他们有办法获取好友列表吗 那么那些从 Facebook 获取好友的小部件会被删
  • C# 中“With...End With”的等价物? [复制]

    这个问题在这里已经有答案了 我知道 C 有using关键字 但是using自动处理该对象 是否有等价的With End With in 视觉基本6 0 它并不等效 但是这种语法对您有用吗 Animal a new Animal Specie
  • JPEG 图像在多个设备上具有不同的像素值

    我注意到 在跨设备读取 JPEG 格式的相同照片时 像素值不匹配 他们很接近 但又不同 转换为 PNG 文件时 像素值似乎匹配 这似乎是由于跨设备的 未 压缩算法造成的 无论如何 这就是我想到的 有没有办法读取 JPEG 文件 以便跨设备从
  • Java FX 的大胆处理有什么问题吗?

    在 JavaFX 中获得粗体标签应该很简单
  • 如何进行 SSH 交互式会话

    今天是个好日子 我需要在linux机器上执行命令这个命令是交互式的 命令 交互式命令意味着需要输入 是 否 或密码 两次 我的真实案例是 我创建一个脚本执行命令并成功获得输出 但有些服务器的登录密码已过期 所以我需要与之交互 服务器发送当前
  • 通过常规表单提交或 Ajax 请求访问时使浏览器重定向的表单 - 这可能吗?

    我有一个带有表单的网页 当用户提交表单时 我希望服务器使浏览器重定向到与表单操作不同的页面 现在 我正在使用 PHP 来做到这一点header函数发送 302 状态码 效果很好 我试图使服务器上的页面以相同的方式重定向浏览器 无论它是正常提
  • RxJS5 随着时间的推移发出数组项并永远重复

    我想随着时间的推移发出数组项 每次发出之间间隔一秒 并且当所有项都已发出时 一遍又一遍地重复 我知道该怎么做 但我想知道是否有比 更简洁的东西 const MY ARRAY one two three const item Rx Obser
  • java.lang.IllegalArgumentException:源不能为空

    问题是什么 当我更新 Ubuntu 软件时它也能工作 主类 package okt springbootstarter test import org springframework boot SpringApplication impor
  • 使用 Inno Setup 创建硬链接

    我有数千个自己的安装程序 需要一个关键的 dll 文件来进行卸载步骤 该 dll 文件大小约为 2 mb 然后为了避免不必要的磁盘空间 2mb 100 个安装程序 我想将该文件存储一次 cf 然后为需要该文件的下一个安装程序创建硬链接 我可
  • 查找多线串和多边形 sf r 之间的交集

    我在地图上有一组空间坐标 以及穿过它们的多线串 我需要计算出线条在每种颜色的多边形内所花费的长度 caveats 我的最小表示不是很好 我的实际数据是一个 data frame 其中有一个颜色列 它是真实数据中的组 一些标识列和一列多多边形