如何统计每个门店半径内的其他门店数量?并在地图展示半径?
解决方案
一、先搞定环境:装包+转数据
先把需要的工具包装上,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就能批量计算,不用自己折腾距离矩阵,步骤很简单:
- 先把2英里转成米(空间计算常用米,1英里≈1609.34米,2英里就是3218.68米)
- 批量找出每个门店半径内的所有门店
- 统计数量时减去自己(别把门店自身算进去)
# 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
相关产品推荐
相关产品推荐

