簡體   English   中英

在 R 中的直線 spatvector 上創建隨機點

[英]Create random points over a line spatvector in R

我有一個 spatVector 由單線幾何組成,覆蓋了我研究區域的整個道路網絡。 我想在此幾何上創建一組 N 個隨機點。 我知道如何在 QGIS 中執行此操作,但我想在 R 中執行此操作,因為我必須將此過程迭代 1'000 次並且我想創建一個循環。

你知道任何 function 可以做到這一點嗎?

編輯首先,我使用以下方法讀取我的線形文件: Road.network <- vect("path/to/file.shp)然后我將它轉換為 SF object: Road.network_SF <- st_as_sf(Road.network)最后,我同時使用了st_sample ,得到以下結果:

Random_points <- st_sample(Road_network_SF, size = 1799)
 Random_points
Geometry set for 46350 features  (with 44694 geometries empty)
Geometry type: MULTIPOINT
Dimension:     XY
Bounding box:  xmin: 4503139 ymin: 2504751 xmax: 4622797 ymax: 2613276
Projected CRS: ETRS89-extended / LAEA Europe
First 5 geometries:
MULTIPOINT EMPTY
MULTIPOINT EMPTY
MULTIPOINT EMPTY
MULTIPOINT ((4503139 2574957))
MULTIPOINT EMPTY

st_line_sample function,出現以下錯誤:

Random_points <- st_line_sample(Road_network_SF, n = 1799)
Error in st_line_sample(Road_network_SF, n = 1799) : 
inherits(x, "sfc_LINESTRING") non è TRUE

當我將 spatVector 轉換為 sf object 時,這就是我得到的:

Road_network_SF
Simple feature collection with 1 feature and 2 fields
Geometry type: MULTILINESTRING
Dimension:     XY
Bounding box:  xmin: 4500176 ymin: 2504157 xmax: 4626207 ymax: 2616041
Projected CRS: ETRS89-extended / LAEA Europe

進一步編輯 @Gregory 提出的工作流程非常好,我的錯誤是由於道路形狀文件的問題。 我改了一下,沒有再出現問題,謝謝!

提前致謝!

您可以使用sf::st_sample()沿着向量幾何(如道路)對隨機點進行采樣,但是結果可能看起來令人困惑,具體取決於您如何看待它們。 這是一個可重現的例子。

library(sf, quietly = TRUE)
#> Linking to GEOS 3.10.2, GDAL 3.4.2, PROJ 8.2.1; sf_use_s2() is TRUE
library(tigris, quietly = TRUE)
#> To enable 
#> caching of data, set `options(tigris_use_cache = TRUE)` in your R script or .Rprofile.
library(ggplot2)

suppressMessages(
  roads <- roads(state = "NC",
                 county = "Mecklenburg")
)
set.seed(1)
rpoints <- st_sample(roads, size = 5)
#> although coordinates are longitude/latitude, st_sample assumes that they are
#> planar
ggplot() +
  geom_sf(data = roads, color = "grey") +
  geom_sf(data = rpoints, color = "black")

我們在 map 上看到我們已經按預期生成了 5 個隨機點。 令人驚訝的是,如果您檢查rpoints object 的結構,您會發現它是一個長度為 21672 的多點,您可能認為這是點數。 然而,除了 5 個之外,所有的幾何圖形都是空的。 原因是構成道路矢量的每個對象都有一個幾何體(大多數情況下是空的)。

str(rpoints)
#> sfc_MULTIPOINT of length 21672; first list element:  'XY' num[0 , 1:2] MULTIPOINT EMPTY
head(rpoints)
#> Geometry set for 6 features  (with 6 geometries empty)
#> Geometry type: MULTIPOINT
#> Dimension:     XY
#> Bounding box:  xmin: NA ymin: NA xmax: NA ymax: NA
#> Geodetic CRS:  NAD83
#> First 5 geometries:
#> MULTIPOINT EMPTY
#> MULTIPOINT EMPTY
#> MULTIPOINT EMPTY
#> MULTIPOINT EMPTY
#> MULTIPOINT EMPTY

這是從那里獲得真正要點的方法。

rpoints <- rpoints[!st_is_empty(rpoints)]
rpoints
#> Geometry set for 5 features 
#> Geometry type: MULTIPOINT
#> Dimension:     XY
#> Bounding box:  xmin: -81.01691 ymin: 35.07471 xmax: -80.62246 ymax: 35.2948
#> Geodetic CRS:  NAD83
#> MULTIPOINT ((-80.88764 35.2948))
#> MULTIPOINT ((-80.62246 35.18395))
#> MULTIPOINT ((-81.01691 35.07471))
#> MULTIPOINT ((-80.78909 35.12663))
#> MULTIPOINT ((-80.83055 35.16959))

reprex package (v2.0.1) 創建於 2023-02-01

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM