计算 sf 线串与 r 中的网格单元相交的次数

2024-02-05

考虑一组线串和一个多边形网格(sf 几何):

library(sf)

#creating data example
id <- c("844", "844", "844", "844", "844","855", "855", "855", "855", "855")

lat <- c(-30.6456, -29.5648, -28.6667, -31.5587, -30.6934, -29.3147, -28.0538, 
         -26.5877, -26.6923, -27.40865)
long <- c(-50.4879, -49.8715, -51.8716, -50.4456, -50.9842, -51.9787, -47.2343, 
          -49.2859, -48.19599, -49.64302)

df <- data.frame(id = as.factor(id), lat, long)

#converting to sf
df.sf <- df %>% 
  sf::st_as_sf(coords = c("long", "lat"), crs = 4326)

#creating linestrings
df.line <- df.sf %>% 
  dplyr::group_by(id) %>%
  dplyr::summarize() %>%
  sf::st_cast("LINESTRING") 

#creating grid
xy <- sf::st_coordinates(df.sf)

grid <- sf::st_make_grid(sf::st_bbox(df.sf),
                        cellsize = 1, square = FALSE) %>%
  sf::st_as_sf() %>%
  dplyr::mutate(cell = 1:nrow(.))

intersection <- sf::st_intersection(grid, df.line)

如果我使用 st_intersection() 函数,它将对与每个单元相交的线串的每个特征计数一次。但是,相同的特征可能已经穿过该单元格两次或更多次,我希望能够计算出该次数。这是可能的?

我发现这个问题的答案与我需要的非常相似,但我想用 sf 对象而不是 sp 来完成该过程。

用R计算穿过栅格单元的线数 https://stackoverflow.com/questions/47593187/count-lines-crossing-raster-cells-with-r


您可以使用rmapshaper包来“擦除”靠近网格的线条部分。然后计算每个单元格内的行数st_intersection.

library(sf)
library(tidyverse)

########### from the question ############
#creating data example
id <- c("844", "844", "844", "844", "844","855", "855", "855", "855", "855")

lat <- c(-30.6456, -29.5648, -28.6667, -31.5587, -30.6934, -29.3147, -28.0538, 
         -26.5877, -26.6923, -27.40865)
long <- c(-50.4879, -49.8715, -51.8716, -50.4456, -50.9842, -51.9787, -47.2343, 
          -49.2859, -48.19599, -49.64302)

df <- data.frame(id = as.factor(id), lat, long)

#converting to sf
df.sf <- df %>% 
  sf::st_as_sf(coords = c("long", "lat"), crs = 4326)

#creating linestrings
df.line <- df.sf %>% 
  dplyr::group_by(id) %>%
  dplyr::summarize() %>%
  sf::st_cast("LINESTRING") 

#creating grid
xy <- sf::st_coordinates(df.sf)

grid <- sf::st_make_grid(sf::st_bbox(df.sf),
                         cellsize = 1, square = FALSE) %>%
  sf::st_as_sf() %>%
  dplyr::mutate(cell = 1:nrow(.))
###### End from question ##########


# Transform to a crs that uses meters for buffering
df.line <- st_transform(df.line, 3857)
grid <- st_transform(grid, 3857)

# Create a geometry to 'cut' the lines with by buffering the grid by 100m.
# You may want to change the buffer distance.
blade <- st_cast(grid, 'MULTILINESTRING') %>% 
  st_buffer(100) %>% 
  st_union() %>% 
  st_as_sf()

# erase the parts of the lines that cross the buffered grids
line_split <- rmapshaper::ms_erase(df.line, blade) %>%
  st_cast('LINESTRING')

split_count <- st_intersection(line_split, grid) %>%
                  group_by(id, cell) %>% 
                  count() %>%
                  arrange(desc(n))

head(split_count)
#> Simple feature collection with 6 features and 3 fields
#> Geometry type: GEOMETRY
#> Dimension:     XY
#> Bounding box:  xmin: -5780918 ymin: -3698418 xmax: -5619363 ymax: -3325137
#> Projected CRS: WGS 84 / Pseudo-Mercator
#> # A tibble: 6 × 4
#>   id     cell     n                                                     geometry
#>   <fct> <int> <int>                                               <GEOMETRY [m]>
#> 1 844      15     2 MULTILINESTRING ((-5644929 -3650436, -5674823 -3594332), (-…
#> 2 855       9     2 MULTILINESTRING ((-5688528 -3325137, -5724777 -3358756, -57…
#> 3 844       8     1 LINESTRING (-5675023 -3593956, -5675535 -3592995, -5675023 …
#> 4 844       9     1 LINESTRING (-5713732 -3433012, -5733856 -3399891, -5746569 …
#> 5 844      11     1            LINESTRING (-5619363 -3698418, -5644729 -3650812)
#> 6 844      12     1            LINESTRING (-5649610 -3538547, -5713628 -3433183)

在示例数据中,有两个网格单元被任意一条线多次交叉(以红色圈出):

Created on 2022-04-22 by the reprex package https://reprex.tidyverse.org (v2.0.1)

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

计算 sf 线串与 r 中的网格单元相交的次数 的相关文章

随机推荐

  • Java - 同时将两个表达式分配给一个变量

    我刚刚学完 Java 第一年 我一直在查看 JDK 源代码作为练习 我遇到了以前从未遇到过的情况 即在同一个语句中对同一个变量进行了两次赋值 e g variable 表达 表达 这里究竟发生了什么 这是一个相当普遍的事情吗 双重作业的目的
  • 有效连接多个 sas 数据集

    我有超过 200k 个具有相同变量 n macro catDat name nbr call in new dataset data new set libin name run reorder names proc sql noprint
  • ie11 的 CSS 自定义属性 polyfill

    有没有办法用 JavaScript 来 pollyfill ie11 的自定义 CSS 属性 我在考虑加载 检查浏览器是否支持自定义属性 如果不支持 则对属性进行某种查找和替换 这可以通过 JavaScript 或某些库实现吗 Thanks
  • 客户端 javascript 相当于 Lucene

    我想知道是否有一个相当于 Lucene API 的 Javascript 旨在用于客户端来索引相对较小的数据集 一个示例用例是静态站点 例如生成的 能够搜索内容而无需服务器端处理 我发现了这个 http lunrjs com http lu
  • Asp.net 验证错误消息更改标签文本

    我正在使用 asp net 验证控件来验证用户输入 我想要的是使用验证控件生成的错误消息更改标签文本
  • 角度 (1.5.8) 动态组件

    我正在尝试使用 Angular 1 5 8 构建一种动态仪表板 直到最后一个障碍 我已经取得了不错的进步 这实际上是在渲染动态组件 我尝试了 2 个选项 要么添加一个ui view并以编程方式传递小部件的名称 or 这就是我猜的路线more
  • 将参数从父函数传递给嵌套函数Python

    这是我的代码 def f x def g n if n lt 10 x x 1 g n 1 g 0 当我评估 f 0 时 会出现错误 赋值前引用了 x 但是 当我使用 print x 而不是 x x 1 时 它会起作用 看来在 g 的范围内
  • C# 定时器或 Thread.Sleep

    我正在运行 Windows 服务并使用循环和 Thread Sleep 来重复任务 使用计时器方法会更好吗 如果是的话 代码示例会很棒 我目前正在使用此代码来重复 int curMinute int lastMinute DateTime
  • 枚举的通用类,值的数量

    我如何知道我的枚举在此示例中有多少个值 public class Analyser
  • 如何使用服务的输入/输出动态创建组件实例并将其单独注入到 DOM 中?

    在 Angular 2 中创建动态组件时 我found https stackoverflow com questions 36325212 angular 2 dynamic tabs with user click chosen com
  • 将表单和框架添加到包中

    我正在开发一个 IDE 注册组件包 其中大部分都派生自 TFrame 基类 包中还包含这些组件调用的各种自定义对话框表单 我在 Delphi 2007 工作 我注意到 有时框架和表单单元 通常具有关联的 DFM 文件 并不总是在其下方 下方
  • WSO2 EMM:从设备管理中删除设备

    我成功将 Android 设备注册到 EMM 然后我恢复出厂设置并重新注册 现在 同一设备在我的设备管理中列出了两次 第一件事 这种行为是想要的吗 我认为应该有一个规则来检查 IMEI 并用新注册的对象替换旧对象 第二件事 如何摆脱旧对象
  • tidyverse 中多个群体的引导:rsample 与 broom

    In 这个问题 https stackoverflow com questions 42986736 bootstrapping by multiple groups in dplyr由几个小组和子小组进行引导似乎很容易使用broom bo
  • urllib 异常 http.client.BadStatusLine

    我一生都无法弄清楚为什么我不能捕获这个异常 看着这里本指南 https docs python org 3 howto urllib2 html def get team names get team id url team id prin
  • 错误 404 的默认重定向

    我想在我的 ASP net 网站中引入一项功能 每当收到对我的域中未知 URL 的请求时 用户就会被重定向到我的网站error 404 htm应用程序根目录中的页面 例如 如果请求是http www mydomain com blahbla
  • System.IO.ReadAllxxx / WriteAllxxx 方法的性能

    是否有 System IO File ReadAllxxx WriteAllxxx 方法与 Web 上提供的 StreamReader StremWriter 类的性能比较 您认为在 net 3 0 中读取 写入文本文件的最佳方式 从性能角
  • Cloud Functions 中的 Cloud Firestore

    我想将新的 Cloud Firestore 集成到我的 Cloud Functions 中 我更新了 node js 并在我的 Mac 上安装了最新的 firebase 版本 文档说 exports myFunctionName funct
  • 如何在 React 应用程序中处理 Firebase onAuthStateChanged 并相应地路由用户?

    我正在开发一个与 Firebase 集成的 React Web 应用程序 并且我正在尝试对我的用户进行身份验证 我已经设置了路线 以便在用户通过身份验证时显示主页组件 否则显示登录页面 但是 当我的应用程序首次加载时 它会显示登录页面 需要
  • 数据框的小提琴图

    我有一个data frame 例如 df data frame AAA rnorm 100 1 1 BBB rnorm 100 2 1 5 CCC rnorm 100 1 5 1 2 我想在联合小提琴图中绘制它的每个列 这是我目前所处的位置
  • 计算 sf 线串与 r 中的网格单元相交的次数

    考虑一组线串和一个多边形网格 sf 几何 library sf creating data example id lt c 844 844 844 844 844 855 855 855 855 855 lat lt c 30 6456 2