如何延长一条线与多边形相交?

2023-12-23

我想延长线以接触多边形 创建直线和多边形 直线和多边形 这是我的“拉伸和修剪”解决方案。
结果比我最初提供的第一个“解决方案”要棘手一些。 我还包括了水平线和垂直线的情况。 我认为我的例子涵盖了all案例(线方向)
我的编码非常简单,没有努力提高效率

library(sf)
#
s1 <- rbind(c(1, 2), c(2, 3))
ls1 <- st_linestring(s1)
s2 <- rbind(c(2, 2), c(1, 3))
ls2 <- st_linestring(s2)
s3 <- rbind(c(2, 2), c(1, 1))
ls3 <- st_linestring(s3)
s4 <- rbind(c(1, 2), c(2, 1))  # VERTICAL LINE
ls4 <- st_linestring(s4)

vl <- rbind(c(2.5, 2), c(2.5, 3))
svl <- st_linestring(vl)

hl <- rbind(c(0.5, 0.5), c(1, 0.5))
shl <- st_linestring(hl)

line <- st_multilinestring(list(ls1, ls2, ls3, ls4, svl, shl))
p1 <- rbind(c(0, 0), c(1, 0), c(3, 2), c(2, 4), c(1, 4), c(0, 0))
pol <- st_polygon(list(p1))
#
(
  plot1 <- ggplot() +
    geom_sf(data = ls1, col = 'red', size = 2) +
    geom_sf(data = ls2, col = 'darkred', size = 2) +
    geom_sf(data = ls3, col = 'blue', size = 2) +
    geom_sf(data = ls4, col = 'darkblue', size = 2) +
    geom_sf(data = svl, col = 'green', size = 2) +
    geom_sf(data = shl, col = 'green', size = 2) +
    geom_sf(data = pol, fill = NA)
)
####################### Function

line_stretchntrim <- function(line, polygon) {
  if (st_crs(line) != st_crs(polygon))
    return("CRS not matching")
  bb <- st_bbox(polygon)
  bbdiagLength <-
    as.numeric(sqrt((bb$xmin - bb$xmax) ^ 2 + (bb$ymin - bb$ymax) ^ 2))
  xy <- st_coordinates(line)[, 1:2]
  npairs <- nrow(xy) / 2
  etline <- NULL
  for (i in 1:npairs) {
    ii <- (i - 1) * 2 + 1
    x <- as.numeric(xy[ii:(ii + 1), 1])
    y <- as.numeric(xy[ii:(ii + 1), 2])
    dxline <- diff(x)
    dyline <- diff(y)
    d <- sqrt(dxline ^ 2 + dyline ^ 2)
    scale <- abs(as.numeric(bbdiagLength)) # * extra if need be
    signx <- sign(dxline)
    signy <- sign(dyline)
    theta <- atan(dxline / dyline)
    #  expand
    if (signy == 1) {
      dx1 <-  -sin(theta) * scale #* d
      dy1 <-  -cos(theta) * scale #* d
      dx2 <-    sin(theta) * scale #* d
      dy2 <-    cos(theta) * scale #* d
    }
    if (signy == -1) {
      dx1 <-    sin(theta) * scale# * d
      dy1 <-    cos(theta) * scale# * d
      dx2 <-  -sin(theta) * scale# * d
      dy2 <-  -cos(theta) * scale# * d
    }


    ## Cases when dxline == 0 or dyline == 0
    # dxline == 0
    if ((dxline == 0) * (signy == -1)) {
      dx1 <-  0
      dy1 <-  cos(theta) * scale# * d
      dx2 <-  0
      dy2 <-  -cos(theta) * scale# * d
    }

    if ((dxline == 0) * (signy ==  1)) {
      dx1 <-  0
      dy1 <-  -cos(theta) * scale# * d
      dx2 <-  0
      dy2 <-    cos(theta) * scale# * d
    }
    if ((signx == 1) * (dyline == 0)) {
      dx1 <-  -sin(theta) * scale# * d
      dy1 <-  0
      dx2 <-    sin(theta) * scale# * d
      dy2 <-  0
    }

    if ((signx == -1) * (dyline == 0)) {
      dx1 <-    sin(theta) * scale# * d
      dy1 <-  0
      dx2 <-  -sin(theta) * scale# * d
      dy2 <-  0
    }


    x1 <- x[1] + dx1
    y1 <- y[1] + dy1
    # second point shift
    x2 <- x[2] + dx2
    y2 <- y[2] + dy2
    # construct spatial line
    sline <- st_linestring(matrix(c(x1, y1, x2, y2),
                                  byrow = TRUE, ncol = 2))
    slineSf <- st_sf(geom = st_sfc(sline), crs = st_crs(polygon))
    # Now trim to polygon
    stline <-  st_intersection(slineSf, polygon)

    etline <- if (i == 1)
      stline
    else
      rbind(etline, stline)
  }
  etline
}


stretched_line <- line_stretchntrim(line, pol)
#

ggplot() +
  geom_sf(data = pol, fill = NA) +
  geom_sf(data = line, size = 2) +
  geom_sf(data = stretched_line)

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何延长一条线与多边形相交? 的相关文章

  • 在 r 中导出矩阵

    我想在 R 中导出一个矩阵 并保留行和列的名称 当我使用 write table 或 write csv 时 我得到一个带有新列的矩阵 我该如何使用这个功能 感谢您的帮助 您不会获得新列 行名称将保存为文本文件中的第一列 因此 您可以指定在
  • R 脚本自动化时的不同结果

    以下命令对 pdf 文件执行 Ghostscript 这pdf file变量包含该 pdf 的路径 bbox lt system paste C gs gs8 64 bin gswin32c exe sDEVICE bbox dNOPAUS
  • decompose() 的周期太少[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 错误看起来像这样 decompose
  • 将命名参数列表传递给函数?

    我想编写一个小函数来从适当的分布生成样本 例如 makeSample lt function n dist params values lt makeSample 100 unif list min 0 max 10 values lt m
  • 返回数据帧 R 中的下一行

    我有一个看起来像这样的数据框 kind datetime book 2016 04 23 04 23 00 pen 2016 04 23 04 30 00 toy 2016 04 23 06 45 00 我想为数据集中的每一行返回下一行的日
  • ggplot2可以在一个图例中分别控制点大小和线大小(线宽)吗?

    一个使用的例子ggplot2绘制数据点组和连接每组均值的线 并使用相同的映射aes for shape并为linetype p lt ggplot mtcars aes gear mpg shape factor cyl linetype
  • 将年月格式转换为 POSIXct [重复]

    这个问题在这里已经有答案了 我有一些年月形式的数据 我想将其格式化以用于绘图ggplot date lt c 2016 03 2016 04 2016 05 2016 06 2016 07 2016 08 2016 09 2016 10 2
  • 是否可以通过扫描从控制台读取而不回显字符?

    这是一个示例函数 passwordEntry lt function cat Enter your password pwd lt scan n 1 what character quiet TRUE invisible pwd 并测试该功
  • numpy.histogram 的 hist 维度,密度 = True

    假设我有这个数组 A array 0 0019879 0 00172861 0 00527226 0 00639585 0 00242005 0 00717373 0 00371651 0 00164218 0 00034572 0 008
  • 如何在for循环中引用变量?

    我正在循环访问不同的 data tables 和 data table 中的变量 但我在引用内部变量时遇到问题for loop dt1 lt data table a1 c 1 2 3 a2 c 4 5 2 dt2 lt data tabl
  • 使用 broom 和 tidyverse 总结 r 平方游戏

    我发布了一个问题here https stackoverflow com questions 48627287 getting adjusted r squared value for each line in a geom smooth
  • 重复测量引导统计数据,按多个因素分组

    我有一个看起来像这样的数据框 但显然还有更多行等 df lt data frame id c 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 cond c A A B B A A B B A A B B A A B B co
  • R foreach问题(某些进程返回NULL)

    我遇到了问题foreach我正在 R 中使用的程序的一部分 该程序用于运行不同参数的模拟 然后将结果返回到单个列表 然后用于生成报告 当并非所有分配的模拟运行都在报告上实际可见时 就会出现问题 从各方面来看 似乎只有分配的运行的一个子集实际
  • 使用 purrr 迭代替换数据帧列中的字符串

    我想用purrr使用以下命令在数据框列上迭代运行多个字符串替换gsub 功能 这是示例数据框 df lt data frame Year 2019 Text c rep a aa 5 rep a bb 3 rep a cc 2 gt df
  • 时间戳半小时窗口内字段的平均值

    我的数据框有列名Timestamp es看起来像 Timestamp es 2015 04 01 09 07 42 31 2015 04 01 09 08 01 29 5 2015 04 01 09 15 03 18 5 2015 04 0
  • 如何使用 usmap 标记数字而不是名称?

    我知道 usmap 有一个选项label in plot usmap 我想标记一些数字 而不是状态名称 我想 usmap 中应该有与州质心坐标相关的数据 但我不知道如何找到它 如果我能得到 坐标然后我可以用它来标记数字geom text 这
  • R独特的列或行与NA无可比拟

    有谁知道如果incomparables的论证unique or duplicated 曾经被实施过incomparables FALSE 也许我不明白它应该如何工作 无论如何 我正在寻找一个巧妙的解决方案 以仅保留与另一列相同的唯一列 或行
  • 在 R 格子包中微调点图

    我正在尝试为不同的数据集和不同的算法绘制一堆 ROC 区域 我有三个变量 方案 指定所使用的算法 数据集 是正在测试算法的数据集 以及 Area under ROC 我正在 R 中使用lattice库 命令如下 点图 方案 Area und
  • r 中训练和测试数据的最小最大缩放/归一化

    我正在创建一个函数 它将训练集和测试集作为其参数 最小 最大缩放 标准化并返回训练集并使用这些same最小值和最小 最大范围的值 标准化并返回测试集 到目前为止 这是我想出的功能 min max scaling lt function tr
  • 相当于 min() 的 rowMeans()

    我在 R 邮件列表上多次看到这个问题 但仍然找不到满意的答案 假设我有一个矩阵m m lt matrix rnorm 10000000 ncol 10 我可以通过以下方式获得每行的平均值 system time rowMeans m use

随机推荐

  • 覆盖 Symfony2 中的单一路由

    如何覆盖 Symfony2 中的单个路由 我有一个捆绑包 其中包含bundle routing yml file 在扩展此父包的包中 我还有路由文件 routing xml请注意 这些文件的名称不同 在这个路由文件中 我喜欢覆盖单个父路由
  • 构建 R:--with-libtiff 未启用 TIFF 功能

    编译R 3 3 2从源头 我的标志包括 with libtiff 他们是 configure with system tre with blas with lapack with libtiff enable R shlib enable
  • 自动刷新过滤器

    我正在使用过滤器来显示添加内容后的时间 angular module filters fromNow function return function date return moment date fromNow 如何每分钟自动触发过滤器
  • 如何解决 YACC 移位/减少后增量运算符的冲突?

    我正在用 YACC 实际上是 Bison 编写语法 并且遇到了移位 归约问题 它是包含后缀递增和递减运算符的结果 这是语法的精简版本 token NUMBER ID INC DEC left left right PREINC left P
  • 我是否在 java.io.PipedInputStream 中发现了错误?

    我不确定 但我非常确定我在 Oracle Java 实现中发现了一个错误 或未记录的功能 我可以验证 1 7 0 67 和 1 8 0 31 是否受影响 症状 当管道已满时 对管道的写入可能会比管道再次空闲所需的时间多等待一秒 该问题的一个
  • iPhone SDK 3.0 - wait_fences:未能收到回复:10004003 [重复]

    这个问题在这里已经有答案了 我一直在开发 iPhone 应用程序 自从我开始在 SDK 3 0 上构建以来 每当应用程序尝试与我的网络服务器通信时 我都会收到此错误 一切似乎都运行良好 但我找不到任何可以解释该消息的根本原因的内容 任何帮助
  • 使用 userEvent.click 错误的 act() 警告响应测试库

    我有几个用 Jest 和 React 测试库编写的测试 它们都模拟获取并使用 userEvent click 调用来触发发出获取请求的提交按钮 组件中的状态得到更新 我做出断言 我正在使用 useEffect 挂钩来填充数据数组 但它仅在初
  • 如何使用 Youtube v3 API 获取 Youtube 视频的 mp4 url

    如何获取完整的 mp4 url 以使用除 Youtube 之外的其他来源从应用程序中的实际位置播放视频 gdata youtube API 已被弃用 所以我遇到了麻烦 任何帮助将不胜感激 谢谢 我做了一个非常简单的API https gis
  • 如何将休眠与 MS Access 结合使用?

    我想将休眠与 MS Access 一起使用 我应该使用哪种方言 您能给我一个带有 MS Access 的休眠配置文件示例吗 实际解决方案在这里 在花了 1 天尝试不同的解决方案 ODBC HXTT 等之后 我发现了这个美妙之处 http u
  • ASP.NET Core 路由不起作用

    路由器的配置方式如下 app UseMvc routes gt routes MapRoute name api template api action id app UseMvc routes gt routes MapRoute nam
  • 为什么 nl_langinfo(CODESET) 与 locale charmap 不同?

    此帖源自如何获取您的系统在 c c 中使用哪种编码 https stackoverflow com questions 1492918 how do you get what kind of encoding your system use
  • 从 Excel 单元格读取

    我在用EPPlus http epplus codeplex com 用于从 xlsx 文件读取的包 我需要从单元格中读取 TimeSpan 对象 Excel 单元格将包含 hh mm 格式的数据 例如 09 00 或 18 30 不带引号
  • Lua Web 开发使用什么 Web 服务器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Zend_Paginator 作为对象返回

    Zend Paginator 将结果作为标准数组返回 但我需要使结果作为类的实例返回 我该怎么做 例如 我想要所有新闻文章 因此需要我的项目作为 News Model Article 的实例返回 您还可以创建自定义 zend paginat
  • 如何从网页中的多个表中抓取内容

    我想从网页中的多个表中抓取内容 HTML 代码如下所示 div class fixtures table full table medium h2 class table header Date 1 h2 table class table
  • 解释基本 Prolog 结果

    我对 Prolog 的基础知识感到困惑 如果我有这个知识库 loves vincent mia loves marcellus mia loves pumpkin honey bunny loves honey bunny pumpkin
  • 当软键盘出现时,工具栏向上移动

    我想让我的活动布局在键盘出现时调整大小 但同时保持其工具栏位置不变 到目前为止 当我单击编辑文本并出现键盘时 所有屏幕都会向上移动 Before keyboard appears 键盘出现后 工具栏不再可见 我想将键盘保留在其位置并将图像移
  • 从 Git 存储库中删除已从磁盘删除的多个文件

    我有一个 Git 存储库 已删除了四个使用中的文件rm not git rm 我的 Git 状态如下所示 deleted file1 txt deleted file2 txt deleted file3 txt deleted file4
  • Go:如何检查结构体属性是否显式设置为零值?

    type Animal struct Name string LegCount int snake Animal Name snake LegCount 0 worm Animal Name worm 问题 我怎样才能检查snake and
  • 如何延长一条线与多边形相交?

    我想延长线以接触多边形 创建直线和多边形 直线和多边形 这是我的 拉伸和修剪 解决方案 结果比我最初提供的第一个 解决方案 要棘手一些 我还包括了水平线和垂直线的情况 我认为我的例子涵盖了all案例 线方向 我的编码非常简单 没有努力提高效