微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何计算其他坐标点的 X 半径内出现的坐标点数?

如何解决如何计算其他坐标点的 X 半径内出现的坐标点数?

我有两组坐标数据(纬度和经度)。第一组表示城市内餐厅的位置。第二组坐标代表城市中的公园。对于每家餐厅,我想计算 160 米范围内的公园数量

根据另一篇文章,我尝试使用 simple features (sf) 包来执行此操作,但没有得到我想要的输出

示例数据:

餐厅:

45.59841    -122.3275           
45.59932    -122.3343           
45.59932    -122.3343           
45.59820    -122.3343           
45.59820    -122.3343           
45.59814    -122.3340           
45.59814    -122.3340           
45.60016    -122.3341           
45.60016    -122.3341           
45.60020    -122.3343   

公园:

45.61221    -122.3426           
45.61065    -122.3402           
45.60868    -122.3384           
45.60624    -122.3361           
45.61082    -122.3388           
45.60983    -122.3379           
45.60910    -122.3372           
45.60829    -122.3365           
45.60653    -122.3349           
45.60503    -122.3335   

使用 sf,我尝试执行以下操作:

将坐标转换为地理空间数据

library(tidyverse)
library(sf)

park_points <- st_as_sf(ride_coords,coords = c(x = "Latitude",y = "Longitude"),crs = 4326)
rest_points <- st_as_sf(can_coords,coords = c(x = "lat","lon"),crs = 4326)

然后我尝试在每个餐厅周围创建一个 160m 的缓冲区,之后我希望尝试计算每个餐厅缓冲区中的公园数量

buffer_160 <- park_points %>% st_transform(26910) %>% st_buffer(dist = 160) %>% st_transform(2926)

然后我收到以下错误

“使用方法错误(“st_transform”):没有适用于“st_transform”的方法应用于类“data.frame”的对象

无论如何,目标是在每个餐厅周围创建缓冲区,然后计算每个缓冲区内的公园数量(我知道会有重叠,所以我也必须弄清楚如何处理)

我对 R 空间工具非常陌生。感谢您的帮助!

解决方法

您可以在餐厅使用 spatialrisk::points_in_circlemap 并使用 purrr

在 160 m 的半径内没有找到公园,因此将半径扩展到 1000 m :

Restaurants <- read.table(text="
lat         lon                          
 45.59841    -122.3275           
 45.59932    -122.3343           
 45.59932    -122.3343           
 45.59820    -122.3343           
 45.59820    -122.3343           
 45.59814    -122.3340           
 45.59814    -122.3340           
 45.60016    -122.3341           
 45.60016    -122.3341           
 45.60020    -122.3343",header = T)

Parks <- read.table(text = "
lat     lon                  
45.61221    -122.3426           
45.61065    -122.3402           
45.60868    -122.3384           
45.60624    -122.3361           
45.61082    -122.3388           
45.60983    -122.3379           
45.60910    -122.3372           
45.60829    -122.3365           
45.60653    -122.3349           
45.60503    -122.3335",header = T)



library(purrr)
library(spatialrisk)

Restaurants %>% pmap(~with(list(...),points_in_circle(Parks,lon_center = lon,lat_center = lat,radius = 1000)))
#> [[1]]
#>         lat       lon distance_m
#> 10 45.60503 -122.3335   872.6082
#> 
#> [[2]]
#>         lat       lon distance_m
#> 10 45.60503 -122.3335   638.6807
#> 4  45.60624 -122.3361   782.9830
#> 9  45.60653 -122.3349   803.9727
#> 
#> [[3]]
#>         lat       lon distance_m
#> 10 45.60503 -122.3335   638.6807
#> 4  45.60624 -122.3361   782.9830
#> 9  45.60653 -122.3349   803.9727
#> 
#> [[4]]
#>         lat       lon distance_m
#> 10 45.60503 -122.3335   762.8609
#> 4  45.60624 -122.3361   905.9215
#> 9  45.60653 -122.3349   928.4681
#> 
#> [[5]]
#>         lat       lon distance_m
#> 10 45.60503 -122.3335   762.8609
#> 4  45.60624 -122.3361   905.9215
#> 9  45.60653 -122.3349   928.4681
#> 
#> [[6]]
#>         lat       lon distance_m
#> 10 45.60503 -122.3335   767.9792
#> 4  45.60624 -122.3361   916.4012
#> 9  45.60653 -122.3349   936.5971
#> 
#> [[7]]
#>         lat       lon distance_m
#> 10 45.60503 -122.3335   767.9792
#> 4  45.60624 -122.3361   916.4012
#> 9  45.60653 -122.3349   936.5971
#> 
#> [[8]]
#>         lat       lon distance_m
#> 10 45.60503 -122.3335   544.1362
#> 4  45.60624 -122.3361   694.5149
#> 9  45.60653 -122.3349   711.8371
#> 8  45.60829 -122.3365   924.1272
#> 
#> [[9]]
#>         lat       lon distance_m
#> 10 45.60503 -122.3335   544.1362
#> 4  45.60624 -122.3361   694.5149
#> 9  45.60653 -122.3349   711.8371
#> 8  45.60829 -122.3365   924.1272
#> 
#> [[10]]
#>         lat       lon distance_m
#> 10 45.60503 -122.3335   541.2711
#> 4  45.60624 -122.3361   686.8285
#> 9  45.60653 -122.3349   706.2001
#> 8  45.60829 -122.3365   916.7284
#> 3  45.60868 -122.3384   996.5307

或者总结一下,使用 concentration 直接给出每家餐厅周围的公园数量:

Parks$count <- 1
spatialrisk::concentration(Restaurants,Parks,value = count,radius = 1000)

        lat       lon amount concentration
1  45.59841 -122.3275      1             1
2  45.59932 -122.3343      1             3
3  45.59932 -122.3343      1             3
4  45.59820 -122.3343      1             3
5  45.59820 -122.3343      1             3
6  45.59814 -122.3340      1             3
7  45.59814 -122.3340      1             3
8  45.60016 -122.3341      1             4
9  45.60016 -122.3341      1             4
10 45.60020 -122.3343      1             5

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。