选址分析中对POI的处理需求是比较常见的:给定一批竞品 POI,算出来它们跟自家门店的距离,看看覆盖盲区在哪。
听起来就是个 Excel 公式的事。但如果你坐标系不对,距离和逻辑偏差会很大。
把踩的坑和流程梳理了一下,给要做类似分析的同学当个参考。

一、坐标系是地基
中国的地图坐标体系是个老话题了,但每次总会有人栽进去:
- GCJ02(火星坐标系)—— 高德、腾讯在用,经过偏移加密的
- WGS84(GPS 原始坐标)—— 谷歌地球、部分 GPS 设备直接用
两者在例如广州、南宁省会这种级别城市的偏差在 300~500 米 左右。什么后果?
- 明明 800 米外的一家店,被算成 300 米(虚胖)
- 竞品辐射圈重叠分析完全失真
我的做法很简单:利用高德开放平台的坐标拾取器(个人认证免费),把所有来源不一的 POI 坐标统一锚定到 GCJ02 体系,再做后续计算。

这步是数据清洗里最基础但也最关键的一环。
二、简易的文本转换提取
拿到的原始数据大概率长这样:
POINT (108.368797 22.870238)
这是 WKT 格式,需要把它们拆成两列干净的数值。
提取经度:
=TRIM(RIGHT(C14, LEN(C14) - FIND(" ", C14)))
C14 是包含 POINT (...) 的原始单元格,这句公式的逻辑是:找到空格的位置,把后半段切出来,然后去掉两端多余空格。
纬度同理,用 LEFT 取空格前的部分。
最终目标:得到两列纯数字的经纬度,没有括号、没有字母、没有多余的东西。
三、算距离,两个版本选一个
初级版:单维度粗筛(只救急,别当真)
如果想快速摸底,可以用经度差近似排序:
=INDEX(已有POI存放!$D$2:$D$50,
MATCH(MIN(ABS(已有POI存放!$D$2:$D$50 - 完整list!E14)),
ABS(已有POI存放!$D$2:$D$50 - 完整list!E14), 0))
用途:快速找出东西方向上最接近的店。局限:完全忽略了纬度(南北方向),不能作为最终决策依据。
除非你在赤道附近做跨国物流,否则城市级选址请直接用下面的方法。
进阶版:Haversine 球面距离公式
这是商业分析的标准做法,计算地球表面两点间的最短弧长,精度远高于平面近似。
=6371 * 2 * ASIN(
SQRT(
SIN((RADIANS(D14) - RADIANS(H14)) / 2)^2
+ COS(RADIANS(D14)) * COS(RADIANS(H14))
* SIN((RADIANS(E14) - RADIANS(F14)) / 2)^2
)
)
参数对照:
D14→ 目标点纬度(Lat)E14→ 目标点经度(Lng)H14→ 已有 POI 纬度(Lat)F14→ 已有 POI 经度(Lng)6371→ 地球半径(公里)
输出结果:两点间的直线距离,单位公里。
四、完整的实操流程
工具到位了,流程就走得通。整个链路分四步:
Step 1:坐标锚定
打开高德地图开放平台 → 坐标拾取器。对缺失坐标的重点楼宇、竞品点位进行查询复制。确保所有坐标统一到 GCJ02 体系。
Step 2:计算最近距离
在「完整列表」表中,对每一行 POI 使用 Haversine 公式,计算该点到已有门店列表中每一个点的距离。
Step 3:反向匹配门店属性
用 INDEX + MATCH(配合 MIN) 找到最近距离对应的行,把该行的门店名称、经营等级、客流数据抓取回来。
Step 4:出分析结论
最终你会得到一张这样的表:
POI名称 | 经度 | 纬度 | 最近竞品 | 距离(km) | 竞品经营额
青秀龙湖 | 108.36 | 22.84 | 万象城 | 1.2 | 8000 万
基于这张表,你可以直接输出:
- 市场缓冲覆盖: 3km / 5km 覆盖了多少人口和写字楼
- 距离分组考核: 距离越近,客流转化率是否越高
- 市场占有率重叠: 我的店和竞品的服务圈,重叠面积有多大
五、三个避坑总结
- 不要混合坐标系。 GCJ02 和 WGS84 混着算距离,所有分析结论都是空中楼阁。这是踩一脚就废的那种坑。
- 不要只用经度差做最终决策。 单维度粗筛做初筛可以用,但城市级选址必须用经纬度双维的 Haversine 公式。
- 善用高德 API。 个人开发者认证免费,坐标拾取器足够支撑中小规模城市的选址数据清洗。成本低、速度快,没必要在这一步花钱。

这套流程走下来,解决的不只是「数据在哪」的问题,更是「数据怎么用」的问题。
从地理位置到商业价值,中间隔的就是这几步清洗和计算。