You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量计算家庭至学校驾车GPS距离及阈值判定的API优化问题

大样本下家庭到学校驾车距离的高效计算

数据说明

  • shp_family:点要素,含family_code(家庭唯一标识)和POINT类型geometry,实际数据7万条
  • shp_school:点要素,含school_name(学校名称)和POINT类型geometry,实际数据200条
  • shp_city:面要素,含census_track_code,用于地理范围约束(可选)

需求

计算每个家庭到各学校的驾车GPS距离,标记是否存在驾车距离≤1.5km的学校(是=1,否=0)

现有问题

直接使用osrmTable计算全量配对会产生7万×200=1400万次API请求,超出可行范围


解决方案:先粗筛再精准计算

核心逻辑:驾车距离≥欧氏直线距离,所以先通过欧氏距离的1.5km缓冲区筛选出每个家庭的候选学校(欧氏距离≤1.5km的学校),仅对这些候选配对计算实际驾车距离,大幅减少API请求量。

步骤与代码

library(tidyverse)
library(osrm)
library(sf)

# 1. 统一坐标系(必须用投影坐标系,比如UTM,避免经纬度计算欧氏距离出错)
# 替换为适合本地的UTM投影EPSG码,示例为EPSG:32650
shp_family <- st_transform(shp_family, crs = 32650)
shp_school <- st_transform(shp_school, crs = 32650)

# 2. 为学校创建1.5km的欧氏距离缓冲区(粗筛用)
school_buffer <- st_buffer(shp_school, dist = 1500)

# 3. 空间连接:找到每个家庭对应的候选学校(落在缓冲区内的学校)
family_school_candidates <- st_join(shp_family, school_buffer, join = st_within) %>%
  select(family_code, school_name, geometry.x) %>%
  rename(family_geom = geometry.x) %>%
  drop_na(school_name)  # 去掉没有候选学校的家庭(后续标记为0)

# 4. 按家庭分组,批量计算候选学校的驾车距离
distance_results <- family_school_candidates %>%
  group_by(family_code) %>%
  group_map(function(group, key) {
    # 转换为OSRM要求的WGS84坐标系(EPSG:4326)
    family_pt <- st_as_sf(group, coords = st_coordinates(group$family_geom) %>% colnames(), crs = 32650) %>% 
      st_transform(4326)
    candidate_schools <- shp_school %>% 
      filter(school_name %in% group$school_name) %>% 
      st_transform(4326)
    
    # 调用OSRM计算驾车距离
    dist_matrix <- osrmTable(src = family_pt, dst = candidate_schools, measure = "distance", osrm.profile = "car")
    
    # 整理结果
    tibble(
      family_code = key$family_code,
      school_name = candidate_schools$school_name,
      driving_distance = dist_matrix$distances[1,]
    )
  }) %>%
  bind_rows()

# 5. 标记每个家庭是否符合阈值要求
family_final <- shp_family %>%
  select(family_code) %>%
  left_join(
    distance_results %>%
      group_by(family_code) %>%
      summarize(inside_limit = any(driving_distance <= 1500)),
    by = "family_code"
  ) %>%
  mutate(inside_limit = ifelse(is.na(inside_limit), 0, ifelse(inside_limit, 1, 0)))

# 查看结果
head(family_final)

关键优化点

  • 粗筛阶段:用欧氏距离缓冲区排除不可能符合条件的学校,砍掉绝大多数无效API请求
  • 坐标系适配:欧氏距离计算用投影坐标系保证精度,OSRM请求转换为WGS84符合接口要求
  • 分组批量处理:按家庭分组计算,避免一次性传入过大的坐标列表引发接口限制

内容的提问来源于stack exchange,提问作者Pedro TTL

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 20:50:18