【问题标题】:Calculating the number of people who live within or outside a certain distance from hospitals计算住在离医院一定距离以内或以外的人数
【发布时间】:2018-02-09 03:48:02
【问题描述】:

我是地理空间统计的新手,无法弄清楚一个简单的问题:

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

这是一些模拟数据

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))

我想计算以下内容:

  • 居住在距离最近的诊所/医院 2 公里以上的家庭的百分比
  • 在数据框中创建一列,指示哪些家庭在 2 公里距离之内或之外

【问题讨论】:

  • 您的people_coord 数据错误。另外,您是否在任何坐标参考系/投影中工作,或者欧几里得距离是否足够?
  • 请参阅Geographic / geospatial distance between 2 lists of lat/lon points (coordinates),了解计算两个纬度/经度坐标列表之间的距离并选择最近距离和/或位置(在您的情况下为医院)的入门。然后,您可以轻松地将最近的距离转换为医院是否在 2 公里距离内的逻辑指示。

标签: r geospatial


【解决方案1】:

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

  1. 使用st_as_sf将纬度/经度点转换为几何对象
  2. 将坐标参考系设置为标准的经度/纬度,因为数据采用经度/纬度(这是 WGS84)
  3. 使用st_distance 将每个人与每个医院之间的距离计算为units 表,以米为单位。
  4. units 表转换为常规的 tbl,因为处理起来很麻烦,并检查哪些对的间距超过 2 公里
  5. 使用mutate_at检查每一行,看看每家医院是在2公里以内(T)还是在2公里以外(F
  6. 最后,使用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  

【讨论】:

    猜你喜欢
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多