我有一些海上的地理点和一张瑞典海域的 map .我想知道每个点位于哪个海域,对于海域以外的点,我想知道到最近海域的距离,包括最近海域的ID.

library(terra)
#> terra 1.7.71

map <- vect("/vsizip//vsicurl/https://www.smhi.se/polopoly_fs/1.140307!/Havsomr_SVAR_2016_3b.zip")

pts <- data.frame(id = 11:25,
                  lon = c(15.29416656, 15.10333347, 15.27083302, 15.27250004, 15.1291666, 
                          15.31333351, 15.24166679, 15.30716705, 15.32333374, 15.38833332, 
                          15.41416645, 15.40666676, 15.27166653, 15.26083374, 15.1916666),
                  lat = c(56.1566658, 56.15000153, 56.15250015, 56.13999939, 56.16383362, 
                          56.15333176, 56.1558342, 56.17416763, 56.12366486, 56.14250183, 
                          56.15916824, 56.17666626, 56.17666626, 56.17300034, 56.1570015)) |> 
  vect(geom = c("lon", "lat"), crs = "EPSG:4326") |> 
  project("EPSG:3006")

当你运行这个简单的代码时,你可以看到,to_id总是NA,并且是逻辑类型.我希望在列to_id中有列"HID"map(或其他ID从map).我能换个方式吗?

npol <- nearest(pts, map[, "HID"], centroids = FALSE)
npol
#>  class       : SpatVector 
#>  geometry    : points 
#>  dimensions  : 15, 5  (geometries, attributes)
#>  extent      : 506419.7, 525716.6, 6219890, 6225817  (xmin, xmax, ymin, ymax)
#>  coord. ref. : SWEREF99 TM (EPSG:3006) 
#>  names       : from_id    from_x    from_y     to_id distance
#>  type        :   <int>     <num>     <num> <logical>    <num>
#>  values      :       1 5.183e+05 6.224e+06      <NA>        0
#>                      2 5.064e+05 6.223e+06      <NA>        0
#>                      3 5.168e+05 6.223e+06      <NA>        0

推荐答案

不幸的是,?terra::nearest处的文档没有为nearest()提供任何示例,特别是centroids = FALSE.就我个人而言,如果点在多边形内,我会期望距离为零,否则对应于到多边形最近 node 的距离-但我不能确定这是怎么回事.显然,这并不符合我的期望.

然而,对于这些数据,我们可以简单地使用terra::distance()计算完整的距离矩阵,然后 Select 我们感兴趣的信息:相关多边形的索引(您可以使用它来索引map中的"HID"列)和距离本身:

distm <- distance(pts, map[, "HID"])

pts[, "to_id"] <- apply(distm, MARGIN = 1, FUN = which.min)
pts[, "to_HID"] <- map[pts$to_id, ]$HID
pts[, "distance"] <- apply(distm, MARGIN = 1, FUN = min)

pts
#>  class       : SpatVector 
#>  geometry    : points 
#>  dimensions  : 15, 4  (geometries, attributes)
#>  extent      : 506419.7, 525724.3, 6219890, 6225817  (xmin, xmax, ymin, ymax)
#>  coord. ref. : SWEREF99 TM (EPSG:3006) 
#>  names       :    id to_id        to_HID distance
#>  type        : <int> <int>         <chr>    <num>
#>  values      :    11   279 560940-151740        0
#>                   12   288 560850-150580        0
#>                   13   279 560940-151740        0

根据这个输出,你的15个点中有3个在岸上.

Edit:

只是出于好奇,使用{sf}来复制这个:

library(sf)
#> Linking to GEOS 3.11.2, GDAL 3.8.2, PROJ 9.3.1; sf_use_s2() is TRUE

map_sf <- st_as_sf(map)

pts_sf <- st_as_sf(pts)

st_nearest_feature(pts_sf, map_sf)
#>  [1] 279 288 279 371 289 279 327 279 371 244 280 280 279 279 327

st_distance(pts_sf, map_sf) |> apply(MARGIN = 1, FUN = min)
#>  [1]  0.000000  0.000000  0.000000  0.000000 58.765524  0.000000  0.000000
#>  [8] 27.636855  0.000000  0.000000  7.755143  0.000000  0.000000  0.000000
#> [15]  0.000000

最后一次使用{nngeo}:

library(nngeo)

pts_nn <- st_nn(pts_sf, map_sf, returnDist = TRUE)
lapply(pts_nn, unlist)
#> $nn
#>  [1] 279 288 279 371 289 279 327 279 371 244 280 280 279 279 327
#> 
#> $dist
#>  [1]  0.000000  0.000000  0.000000  0.000000 58.765524  0.000000  0.000000
#>  [8] 27.636855  0.000000  0.000000  7.755143  0.000000  0.000000  0.000000
#> [15]  0.000000

R相关问答推荐

R Markdown中的交叉引用表

如何 bootstrap glm回归、估计95%置信区间并绘制它?

如何删除gggvenn与gggplot绘制的空白?

如何编辑ggplot的图例字使用自定义对象(gtable)?'

如何通过Docker部署我的shiny 应用程序(多个文件)

如何在Chart_Series()中更改轴值的 colored颜色 ?

R函数‘paste`正在颠倒其参数的顺序

多个模拟序列间的一种预测回归关系

在RStudio中堆叠条形图和折线图

可以替代与NSE一起使用的‘any_of()’吗?

使用data.table::fcase()而不是dplyr::case_When()时保持值

根据类别合并(汇总)某些行

仅当后续值与特定值匹配时,才在列中回填Nas

如何在使用Alpha时让geom_curve在箭头中显示恒定透明度

如何使投篮在R中保持一致

在REST API中使用参数R

重写时间间隔模糊连接以减少内存消耗

如何在R中使用因子行求和?

无法保存gglot的所有pdf元素

在直方图中显示两个变量