r - R GIS相交线和多边形(大数据)
问题描述
GIS和R问题:
我需要将许多线与许多多边形相交。
理想情况下,我想在 R 中执行此操作。
在一条线穿过多边形边界的地方,我希望这条线被分割(制作两条特征/线)。
然后,我想将新的(通常更小的)线与它们现在所在的多边形的属性一起归因。
如果线条位于多边形之外,我希望从多边形附加到线条的新属性将为 NULL 或 NA 或空。
我很高兴将数据加载为shapefiles或geopackages。
在 R 中执行此操作的最佳工具是什么?
(我很乐意使用Raster、rgeos和SF等软件包。但是,理想情况下,如果我们可以避免调用 QGIS 或其他软件,除非它非常稳定,否则会很棒。我没有 Arc 的许可证)
非常感谢。
解决方案
让我们收集一些在线数据,一个多边形和几条线。我们将用来为我的村庄osmdata
获取数据。OSM
library(osmdata)
#> Data (c) OpenStreetMap contributors, ODbL 1.0. https://www.openstreetmap.org/copyright
library(sf)
#> Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1; sf_use_s2() is TRUE
library(tidyverse)
让我们找到一个边界框并为其添加一点空间
Lbb <- getbb("Lubnów trzebnicki Poland")
addM <- matrix(data = c(-0.01, -0.01, 0.01, 0.01), nrow = 2, ncol = 2)
newBB <- Lbb + addM
让我们获取我们将在计算中使用的高速公路(线、多线)和边界(多边形、多多边形)
highways <- opq (newBB) |>
add_osm_feature (key = "highway") |>
osmdata_sf()
highways <- highways$osm_lines |>
select(osm_id, name, geometry) |>
st_as_sf()
boundaries <- opq(newBB) |>
add_osm_feature (key = "boundary", value = "administrative") |>
osmdata_sf()
boundariesWsi <- boundaries$osm_multipolygons |>
filter(boundary == "administrative" & admin_level == 8 & name == "Lubnów")
让我们绘制它以进行可视化
plot(boundariesWsi$geometry, col = "gray90")
plot(highways$geometry, lwd = 0.6, lty = 4, add = TRUE)
我们将创建一个MULTILINESTRING
对应于村庄边界的支持,我们将使用它来找到那些跨越边界的方式
boundariesWsiAsLines <- st_cast(boundariesWsi, "MULTILINESTRING")
现在,让我们找到那些interestingHighways
跨越村庄边界的人:
interestingHighways <- highways |>
filter(st_intersects(boundariesWsiAsLines$geometry, highways$geometry, sparse = FALSE))
最后,找到这些高速公路的 IN 和 OUT 部分:
a<- st_as_sf(st_intersection(interestingHighways$geometry, boundariesWsi$geometry))
b<- st_as_sf(st_difference(interestingHighways$geometry, boundariesWsi$geometry))
plot(a, lwd = 4, col = "darkblue", add = TRUE)
plot(b, lwd = 4, col = "darkgreen", add = TRUE)
您可以拥有一个多面体列表,而不是一个多面体。要将属性分配给方式,您可以使用dplyr::mutate()
.
由reprex 包(v2.0.1)创建于 2022-01-31
推荐阅读
- javascript - 自定义 CSV 文件的 Wordpress 下载
- java - macOS High Sierra v10.13.6 中的 Java v1.8
- powershell - 统计 Invoke-Command 的结果
- javascript - 如何使用 vue-i18n 翻译渲染项目列表?
- mongodb - Mongodb - 每天自动增加一个字段
- excel - 使用 excel 从 Word 创建 pdf:document.exportasfixedformat 未创建文件的扩展名
- java - java.io.File.isFile() 在不同的线程中返回不同的值
- javascript - KnockoutJS:ko.mapping.toJS,但不要忽略计算属性
- java - Logcat 中的错误
- php - 是否使用外键?