地图基础:地图投影、坐标系与瓦片原理

各位同学好,我是老张。做GIS开发这些年,我踩过最多的坑,就是坐标系问题。你想想看,明明数据是对的,地图上却偏了几百米,这种经历我至少遇到过十几次。今天咱们就把地图基础这块彻底讲透。

1. 地图投影——把地球摊平的艺术

地球是个球体,但屏幕是平的。怎么把球面信息映射到平面上?这就是投影要解决的问题。说白了,投影就是一套数学规则,把经纬度坐标转成平面坐标。

我刚开始做项目时,总觉得投影是数学家的事,跟我没关系。直到有一次,我在北极附近做项目,用墨卡托投影显示高纬度区域,结果格陵兰岛比非洲还大——这显然不对。嗯,从那以后我再也不敢小看投影了。

常见投影类型:

  • 墨卡托投影:等角投影,方向准确,但面积变形严重。Web地图的标配。
  • 高斯-克吕格投影:等角横切椭圆柱投影,我国大比例尺地形图的标准。
  • 兰勃特投影:等角圆锥投影,适合中纬度地区。

Web地图几乎清一色用墨卡托投影。为什么?因为它的等角特性让航线、道路的方向保持正确,这对导航来说太重要了。至于面积变形?反正用户平时也看不出来。

2. 坐标系——地图的灵魂

坐标系这东西,我建议你把它理解成「地图的身份证」。不同坐标系之间,同一个点的经纬度可能差几十米甚至几百米。国内开发最头疼的就是三种坐标系:WGS84、GCJ02、BD09。

坐标系 全称 使用场景 偏移量
WGS84 World Geodetic System 1984 GPS原始数据、国际标准 基准
GCJ02 国测局坐标系 高德、腾讯、Google中国 约100-700米随机偏移
BD09 百度坐标系 百度地图 在GCJ02基础上再加偏移

避坑指南:我曾经在项目里直接把GPS设备采集的WGS84坐标扔到百度地图上,结果所有点位都偏了300多米。排查了整整两天才发现是坐标系没转换。记住:国内互联网地图必须用GCJ02或BD09,直接用WGS84是违法的。

为什么会这样?因为国家规定,公开地图必须经过加密偏移处理。GCJ02就是这套加密算法,BD09是百度在GCJ02基础上又加了一层自己的偏移。说白了,就是给地图数据加了个「密码锁」。

3. 坐标系转换实战

我个人的习惯是:所有数据统一用WGS84存储,只在显示时转换成目标坐标系。这样数据层干净,显示层灵活。下面给出一段常用的转换代码:

// WGS84 转 GCJ02
function wgs84ToGcj02(lng, lat) {
    const a = 6378245.0;
    const ee = 0.00669342162296594323;
    
    let dlat = transformLat(lng - 105.0, lat - 35.0);
    let dlng = transformLng(lng - 105.0, lat - 35.0);
    
    let radlat = lat / 180.0 * Math.PI;
    let magic = Math.sin(radlat);
    magic = 1 - ee * magic * magic;
    let sqrtmagic = Math.sqrt(magic);
    
    dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * Math.PI);
    dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * Math.PI);
    
    return {
        lng: lng + dlng,
        lat: lat + dlat
    };
}

小技巧:如果你不想自己写转换算法,直接用开源库coordtransform,支持WGS84、GCJ02、BD09三者互转。我在三个项目里都用过,没出过问题。

4. 比例尺与瓦片原理

比例尺就是地图上的距离和实际距离的比值。但Web地图里,我们更常用「层级」这个概念。层级越高,显示越精细。比如层级18,一个像素可能对应0.5米;层级1,一个像素可能对应几百公里。

瓦片原理,说白了就是把地图切成小方块。每个层级的地图,都被切成256x256像素的图片。你想想看,如果一整张世界地图直接加载,那数据量得有多大?切成瓦片后,浏览器只加载当前屏幕范围内的瓦片,性能瞬间提升。

瓦片核心参数:

  • 瓦片大小:标准256x256像素,也有512x512的高清瓦片
  • 瓦片编号:通常用xyz编号,x是列号,y是行号,z是层级
  • 瓦片数量:层级每增加1,瓦片数量翻4倍。层级18的瓦片数量是2^36,约687亿张

我记得第一次做瓦片服务时,没注意缓存策略,结果同一张瓦片被反复请求,服务器直接被打挂了。后来加了CDN和本地缓存,问题才解决。嗯,这里要注意:瓦片服务一定要做好缓存,不然并发一上来就崩。

5. 知识体系总览

下面这张图,是我自己总结的地图基础知识体系。你看一遍,心里就有谱了。

地图基础 地图投影 墨卡托投影 高斯-克吕格投影 兰勃特投影 坐标系 WGS84(GPS原始) GCJ02(国测局) BD09(百度) 比例尺与瓦片 层级与分辨率 瓦片切割原理 xyz编号规则 核心:投影决定形状,坐标系决定位置,瓦片决定性能 三者缺一不可,共同构成Web地图的基石

这张图把今天的内容串起来了。你记住:投影决定形状,坐标系决定位置,瓦片决定性能。这三样东西,是Web地图的三大基石。

个人建议:初学者最容易犯的错误是「坐标系混用」。我的做法是:在项目初期就定好坐标系规范,所有数据统一用WGS84存储,显示时再转换。这样后期维护成本最低。

好了,地图基础就讲到这里。这些概念虽然基础,但真到了项目里,每一个都能让你头疼好几天。我当年就是吃了不少亏才总结出这些经验。你先把这些基础打牢,后面讲瓦片加载、地图渲染的时候,你就知道为什么这么设计了。

可可精品资料库