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

如何统计每个门店半径内的其他门店数量?并在地图展示半径?

解决方案

一、先搞定环境:装包+转数据

先把需要的工具包装上,sf是处理空间数据的核心,mapview用来画交互式地图,dplyr帮你整理数据:

# 第一次用先装包
install.packages(c("sf", "mapview", "dplyr"))

# 加载包
library(sf)
library(mapview)
library(dplyr)

假设你的门店数据是带store_id(门店编号)、lon(经度)、lat(纬度)的表格,我模拟了个样例数据,你直接换成自己的就行:

# 模拟80条门店数据(替换成你实际的数据)
store_data <- data.frame(
  store_id = 1:80,
  lon = runif(80, -122, -121), # 替换成你的门店经度
  lat = runif(80, 37, 38)      # 替换成你的门店纬度
)

把普通表格转成R能识别的空间数据对象(sf格式),选WGS84坐标系(大部分GPS数据都是这个):

store_sf <- st_as_sf(store_data, coords = c("lon", "lat"), crs = 4326)

二、统计每个门店2英里内的同行数量

用sf的st_is_within_distance就能批量计算,不用自己折腾距离矩阵,步骤很简单:

  1. 先把2英里转成米(空间计算常用米,1英里≈1609.34米,2英里就是3218.68米)
  2. 批量找出每个门店半径内的所有门店
  3. 统计数量时减去自己(别把门店自身算进去)
# 2英里对应的米数
radius_m <- 2 * 1609.34

# 一次性算出每个门店半径内的所有门店
nearby_stores <- st_is_within_distance(store_sf, store_sf, dist = radius_m)

# 统计每个门店的邻店数量,减1是排除自身
store_data$nearby_count <- sapply(nearby_stores, function(x) length(x) - 1)

# 查看前6条门店的邻店数量结果
head(store_data)

跑完之后,store_data里多了个nearby_count列,就是你要的每个门店2英里内的其他门店数,直接用就行。


三、画地图看哪里能开新店

先给每个门店生成2英里的圆形缓冲区,再用mapview叠到地图上,没有蓝色覆盖的空白区域就是能开新店的地方:

# 先转成以米为单位的投影坐标系(这里用美国加州的UTM投影EPSG:32610,你要根据自己门店所在地区换对应的EPSG码)
store_sf_utm <- st_transform(store_sf, crs = 32610)

# 生成2英里半径的圆形缓冲区
store_buffer <- st_buffer(store_sf_utm, dist = radius_m)

# 再转回到WGS84坐标系,方便mapview显示
store_buffer_wgs84 <- st_transform(store_buffer, crs = 4326)

# 画交互式地图:红色小点是现有门店,蓝色半透明圆是2英里禁区
mapview(store_sf, col = "red", cex = 3) + 
  mapview(store_buffer_wgs84, col.regions = "blue", alpha.regions = 0.1)

运行后会弹出一个网页式的地图,你可以缩放、拖拽,没有蓝色覆盖的区域就是符合要求的空白区域,一目了然。


小提示

  • 投影坐标系:如果你的门店不在美国加州,得换对应的UTM投影EPSG码(可以查自己所在地区的UTM带,或者用sf::st_crs()找合适的投影)
  • 单位问题:地理坐标系(EPSG:4326)的单位是度,不能直接用英里缓冲,所以必须转成米单位的投影
  • 批量处理:这代码直接支持80条甚至更多数据,不用一条一条手动算

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:50:23