Skip to content

把IP经纬度画到地图上:高德/百度地图渲染教程

"用户分布"这种东西,光看表格没感觉,画到地图上才震撼。之前我写过怎么从日志里批量查IP归属地,这篇接着往下走:把IP返回的经纬度画到高德/百度地图上

先说清楚:IP的经纬度是"城市中心"

动手前必须摆正一个认知:IP查询返回的 lng/lat城市中心坐标(IP9返回的就是城市中心点)。所以画出来是一张"城市分布图",不是"用户精确位置图"。

这完全够用了——你要看的是分布趋势,不是每个人的精确定位。

准备数据

从IP9批量查询,拿到每个IP的经纬度:

python
import requests

def query_geo(ip):
    r = requests.get(f"https://ip9.com.cn/get?ip={ip}", timeout=3)
    d = r.json()
    if d.get("ret") == 200:
        data = d["data"]
        return data.get("lng"), data.get("lat"), data.get("city")
    return None, None, None

把日志里所有IP查一遍,收集成坐标列表,存成JSON备用:

json
[
  {"city": "北京", "lng": 116.41, "lat": 39.93, "count": 1234},
  {"city": "上海", "lng": 121.47, "lat": 31.23, "count": 987}
]

注意:按城市聚一次合再画,不然几万个点全糊在一起。

用高德地图渲染

引入高德JS API(需要先在高德开放平台申请key),画个带热力的分布:

html
<script src="https://webapi.amap.com/maps?v=2.0&key=你的key"></script>
<div id="map" style="height: 500px;"></div>
<script>
const map = new AMap.Map('map', { zoom: 5, center: [104, 36] });
const points = [...]; // 上面的聚合数据

// 热力图
const heatmap = new AMap.Heatmap(map, {
  radius: 25, opacity: [0, 0.8]
});
heatmap.setDataSet({
  data: points.map(p => ({ lng: p.lng, lat: p.lat, count: p.count }))
});
</script>

高德的热力图适合展示"哪里人多"。

用百度地图画散点/气泡

百度地图的逻辑差不多,而且气泡图能顺便显示城市名:

html
<script src="https://api.map.baidu.com/api?v=3.0&ak=你的key"></script>
<div id="bdmap" style="height: 500px;"></div>
<script>
const map = new BMap.Map('bdmap');
map.centerAndZoom(new BMap.Point(104, 36), 5);

points.forEach(p => {
  // 气泡标注,城市名 + 数量
  const label = new BMap.Label(`${p.city} ${p.count}`, {
    position: new BMap.Point(p.lng, p.lat)
  });
  map.addOverlay(label);
});
</script>

一个坑:坐标系

这是最容易踩的坑!高德用 GCJ-02 坐标系,百度用 BD-09 坐标系,IP数据一般给的是 WGS-84(GPS原始坐标)。

如果坐标直接画上去,会有几百米的偏移,放大看特别明显。

解决:如果要做精确展示,先做坐标转换。高德提供了转换接口:

js
AMap.convertFrom([{lng, lat}], 'gps', (status, result) => {
  // result.locations 就是转换后的坐标
});

如果只是画"城市分布"这种宏观图,偏移几百米看不出来,可以忽略这个坑。但心里得知道。

完整链路串一遍

  1. 日志 → 抽IP → 批量查归属地(拿到省市和经纬度);
  2. 按城市聚合,统计每个城市数量;
  3. 画到地图上:热力图看密度,气泡图看城市名+数量;
  4. 发布成数据看板或运营报表。

效果能有多好

我第一次做出来的时候,自己盯着看了半天——一张中国地图上,用户密集的地方红彤彤一片,市场重心在哪,一目了然。发给运营,对方直接拿去写周报了。

批量查IP的接口:https://www.ip9.com.cn