计算居住在距医院一定距离以内或以外的人数

Calculating the number of people who live within or outside a certain distance from hospitals

我是地理空间统计的新手,想不出一个简单的问题:

我有两个具有空间坐标的数据集。一个有特定地区的医院和诊所的坐标。另一个有该地区所有家庭的坐标。

这是一些模拟数据

hospital_coord <-data.frame(longitude = c(80.15998, 72.89125, 77.65032, 77.60599), 
                latitude = c(12.90524, 19.08120, 12.97238, 12.90927))    

people_coord <-data.frame(longitude = c(72.89537, 77.65094, 73.95325, 72.96746, 
                              77.65058, 77.66715, 77.64214, 77.58415,
                              77.76180, 76.65470, 76.65480, 76.65490, 76.65500, 76.65560, 76.65560), 
                latitude = c(19.07726, 13.03902, 18.50330, 19.16764, 
                             12.90871, 13.01693, 13.00954, 12.92079,
                             13.02212, 12.81447, 12.81457, 12.81467, 12.81477, 12.81487, 12.81497))

我想计算以下内容:

我认为这可以满足您的要求,使用链接问题中更新的 sf 包而不是 geosphere。做法如下:

  1. 使用 st_as_sf
  2. 将 latitude/longitude 点转换为几何对象
  3. 将坐标参考系设置为标准long/lat,因为数据位于long/lat(这是WGS84)
  4. 使用 st_distance 计算每个人与每个医院之间的距离 units table,以米为单位。
  5. units table 转换为常规 tbl,因为处理起来很麻烦,并检查哪些对的间距超过 2 公里
  6. 使用mutate_at检查每一行,看看每家医院是小于2公里(T)还是大于2公里(F
  7. 最后,用pmapany检查每一行,看看2公里内是否至少家医院!

看来只有第一个病人在医院的 2 公里范围内。

library(tidyverse)
library(sf)
hospital <- tibble(
  longitude = c(80.15998, 72.89125, 77.65032, 77.60599),
  latitude = c(12.90524, 19.08120, 12.97238, 12.90927)
  )
people <- tibble(
  longitude = c(72.89537, 77.65094, 73.95325, 72.96746, 77.65058,
                77.66715, 77.64214, 77.58415, 77.76180, 76.65470,
                76.65480, 76.65490, 76.65500, 76.65560, 76.65560),
  latitude = c(19.07726, 13.03902, 18.50330, 19.16764, 12.90871,
               13.01693, 13.00954, 12.92079, 13.02212, 12.81447,
               12.81457, 12.81467, 12.81477, 12.81487, 12.81497)
  )

hospital_sf <- hospital %>%
  st_as_sf(coords = c("longitude", "latitude")) %>%
  st_set_crs(4326)

people_sf <- people %>%
  st_as_sf(coords = c("longitude", "latitude")) %>%
  st_set_crs(4326)

distances <- st_distance(people_sf, hospital_sf) %>%
  as_tibble() %>%
  mutate_at(vars(V1:V4), as.numeric) %>%
  mutate_at(vars(V1:V4), function (x) x > 2000) %>%
  mutate(within_2km = pmap_lgl(., function(V1, V2, V3, V4) any(V1, V2, V3, V4)))
# A tibble: 15 x 5
   V1    V2    V3    V4    within_2km
   <lgl> <lgl> <lgl> <lgl> <lgl>     
 1 T     F     T     T     T         
 2 T     T     T     T     F         
 3 T     T     T     T     F         
 4 T     T     T     T     F         
 5 T     T     T     T     F         
 6 T     T     T     T     F         
 7 T     T     T     T     F         
 8 T     T     T     T     F         
 9 T     T     T     T     F         
10 T     T     T     T     F         
11 T     T     T     T     F         
12 T     T     T     T     F         
13 T     T     T     T     F         
14 T     T     T     T     F         
15 T     T     T     T     F