R 对于全球地理点数据集(lat/long),如何找到最近的邻居来解释我们星球的球形性质

R 对于全球地理点数据集(lat/long),如何找到最近的邻居来解释我们星球的球形性质,r,geospatial,R,Geospatial,所以我们在不考虑投影问题的情况下实现了这一点。问题是在何处(以及如何)最好地添加重投影,以便函数返回以km为单位的值,而不是当前度数: library(raster) library(purrr) library(sf) #example presence data from model r1 <- raster(nrow=360, ncol=720) crs(r1) <- "+proj=longlat +datum=WGS84 +no_defs" values

所以我们在不考虑投影问题的情况下实现了这一点。问题是在何处(以及如何)最好地添加重投影,以便函数返回以km为单位的值,而不是当前度数:

library(raster)
library(purrr)
library(sf)

#example presence data from model
r1 <- raster(nrow=360, ncol=720)
crs(r1) <- "+proj=longlat +datum=WGS84 +no_defs"
values(r1) <- rbinom(ncell(r1), 2, 0.01)

r1_points <- rasterToPoints(r1)
r1_df <- data.frame(r1_points)
r1_presence <- r1_df %>% dplyr::filter(layer==1)

#example survey data
survey_points <- cbind(rnorm(50) * 5 + 10, rnorm(50) + 50)
pt2 <- st_multipoint(cbind(survey_points[,1], survey_points[,2]))

#distance between each modelled presence (pt1) and survey point (pt2)
get_distances <- function(i, pt2, df) {
  pt1 <- st_multipoint(cbind(df[i, 1], df[i, 2]), dim = "XY")
  a <- st_nearest_points(pt1, pt2)
  return(st_length(a))
}

#loop for all modelled presences
output <- map_dbl(1:nrow(r1_presence), get_distances, pt2, r1_presence)
库(光栅)
图书馆(purrr)
图书馆(sf)
#来自模型的示例状态数据

r1你问题的前提是错误的。您通常不应该将数据投影到计算距离;投影会扭曲,因此距离不会非常精确。如果您的数据具有较大的空间范围,则尤其如此

计算最近距离的方法可能会有所不同,例如,取决于您有多少个点。但在本例中,您可以使用蛮力计算所有距离

library(raster)

r1 <- raster(nrow=360, ncol=720)
crs(r1) <- "+proj=longlat +datum=WGS84 +no_defs"
set.seed(1)
values(r1) <- rbinom(ncell(r1), 2, 0.01)
r1_presence <- rasterToPoints(r1, fun=function(x)x==1)
survey_points <- cbind(rnorm(50) * 5 + 10, rnorm(50) + 50)

d <- pointDistance(r1_presence[,1:2], survey_points, lonlat=TRUE)
mind <- apply(d, 1, min)

head(mind)
#[1] 4268674 4261209 4258182 4254560 4220200 4218188

谢谢我已经阅读了你们的函数,这篇文章我们将继续进行椭球体的计算。
library(terra)
#terra version 1.2.0
from <- vect(r1_presence[,1:2], crs="+proj=longlat +datum=WGS84")
to <- vect(survey_points, crs="+proj=longlat +datum=WGS84")
x <- nearest(from, to)
x
# class       : SpatVector 
# geometry    : points 
# dimensions  : 5158, 7  (geometries, attributes)
# extent      : -2.271833, 22.16701, 48.51506, 51.98087  (xmin, xmax, ymin, ymax)
# coord. ref. : +proj=longlat +datum=WGS84 +no_defs 
# names       : from_id from_x from_y to_id  to_x  to_y  distance
# type        :   <num>  <num>  <num> <num> <num> <num>     <num>
# values      :       1 -171.2  89.75    25 8.752 51.98 4.269e+06
#                     2 -128.2  89.75    25 8.752 51.98 4.261e+06
#                     3 -119.8  89.75    25 8.752 51.98 4.258e+06