打开一张铺满屏幕的世界地图,北边的陆地常显得格外宽大。直觉会把地图上的色块当成地表面积:色块占了两倍像素,好像土地也有两倍大。但地图首先是一种把曲面放到平面上的方法,像素大小还受投影和缩放影响。如果把地面上同样小的面积放在不同纬度,地图究竟会把它们画成多大?

这个问题可以不用任何国家的面积数字来回答。今天选一个范围明确的模型:半径固定的理想球体、赤道为标准纬线的球面墨卡托投影、同一张地图的同一缩放级别。推导局部长度与面积的比例,运行一段只有 Python 标准库的脚本,再讨论为什么这个模型不能直接当作真实在线地图的测量工具。

1. 投影必须作选择,不能同时保住所有性质

地球的曲面无法在一张平纸上同时完整保持距离、方向、面积和局部形状。选择投影,等于选择当前任务更在意什么。Esri 制图团队的投影分析说明了普通墨卡托世界图在高纬度的面积失真,以及为面积比较改用等面积投影的理由。

经典墨卡托投影的强项是保持小范围的角度关系,恒定方位的航线在图上是直线。这解释了它为何有导航用途,却不意味着任何一条图上直线都是地球表面两点之间的最短路线,也不意味着同样大的图上色块代表同样大的土地。PROJ:Mercator

网页地图还常使用 Web Mercator。以 Google Maps JavaScript API 的文档为例,经纬度经过墨卡托形式的变换,再转成像素和瓦片坐标;地图在接近南北纬 85° 处截断,避免无限延伸到两极。Google Maps:地图与瓦片坐标 下文先用简单的球面模型说明失真原理,随后再处理它与 Web Mercator 的差别。

2. 两个方向都被拉长,面积要乘两次

设纬度为 φ、经度为 λ,球半径为 R。在赤道比例为一的球面墨卡托模型里,横向坐标是 x = Rλ,纵向坐标是 y = R asinh(tan φ);等价形式是 R ln(tan(π/4 + φ/2))。角度必须先换成弧度。这些是 PROJ 文档给出的球面公式在标准纬线为赤道时的形式。PROJ:球面公式

取地面上极小的一段东西方向:经度增加 dλ 时,球面上的真实长度是 R cosφ dλ,地图的横向差却是 R dλ。所以横向放大倍数为 1 / cosφ。南北方向也一样:地面上纬度变化 dφ 对应长度 R dφ,而对上面的 y 求导得到地图差值 R / cosφ · dφ。它的放大倍数也是 1 / cosφ。

局部面积是两条相互垂直的小边相乘,因此面积放大倍数是 1 / cos²φ,不是 1 / cosφ。当纬度为 60° 时,余弦是二分之一:一条边在图上变成赤道同等地面小边的两倍,一个极小面积单元在图上便占四倍面积。这说的是同一比例地图上、理想球体的局部比值,不是“北纬 60° 某国的面积乘了四倍”。

这种推导还给出一个防止误读的细节:球面墨卡托在一个极小邻域内,东西和南北两个方向的放大倍数相同,所以小形状的角度可以保持;但不同纬度的小形状整体大小不同。看起来“形状还像原来的形状”,并不能推出面积没有变。

3. 算出几个纬度,别只说“高纬度会变大”

我在 2026 年 10 月 1 日用 macOS、Python 3.9.6 运行了完整计算与制图脚本。它只使用标准库,默认打印数据和边界断言;指定 --svg 才把原创示意图写到给定文件。为让投影坐标有具体单位,脚本取 R = 6,378,137 米;这个数与 WGS 84 椭球长半轴相同,不表示实验把真实地球当成了精确球体。该参数见 IOGP 的坐标转换公式说明。

下载脚本后,在其所在目录运行:

python3 mercator-area-lab.py --svg mercator-area-diagram.svg

实际输出的核心部分如下;线性倍数和面积倍数均以赤道的同样小地表单元为参照:

纬度两个方向的局部线性倍数地图上的局部面积倍数
0°1.00001.0000
30°1.15471.3333
60°2.00004.0000
80°5.758833.1634
85°11.4737131.6461

因此,从赤道走到 80°,线性比例大约变成 5.76 倍,面积比例却超过 33 倍。若误把“地图上一条边增长 5.76 倍”直接说成“面积增长 5.76 倍”,就少乘了一次。脚本把两个数并排输出,目的正在这里;表里的四位小数来自实际运行,不是对任何国家轮廓的像素测量。

三个纬度的极小等面积地表单元,在同一张理想球面墨卡托图上的示意大小;0° 为一倍,60° 为四倍,80° 约为三十三倍

这张可单独下载的 SVG 图由同一脚本生成。三个方块代表面积相等、足够小的地表单元,图上边长按各自的局部线性倍数画出;它们不是三个真实地区的边界,也不是经过地理数据叠加的实测图。图的作用是把“边长两倍,面积四倍”转成容易核对的视觉关系。

4. 经纬度和地图像素为什么会给出相反直觉

想象赤道与北纬 60° 各取相同的一小段经度差。在球面上,60° 的纬圈比赤道短,同样的经度差对应的东西方向地面长度只有赤道的一半;在这个墨卡托图上,经度差却被画成一样宽。于是,高纬地区显得被拉开了。

纵向也被拉长,是为了让局部两个方向保持同样的比例。若只拉宽不拉高,极小的圆会被压成椭圆,局部角度就变了。投影选择了保持这个性质,代价便是面积失真。这里没有“把错误像素还原成正确地图”的单一按钮;每种投影都服务于不同问题。

屏幕缩放是另一层变化。同一幅图放大两级,所有像素距离都会改变;在固定投影、固定缩放下,不同纬度之间的相对面积倍数才可按上式比较。截取两张不同缩放级别、不同窗口范围的截图,再直接比图形占用的像素,连投影造成的差异和界面缩放造成的差异都混在一起了。

5. 两极、网页瓦片和真实椭球是边界条件

球面公式在纬度靠近 90° 时,cosφ 趋向零,局部放大倍数不断上升,投影的纵坐标也趋向无穷。这不是“极点非常大”的地理陈述,而是这套平面坐标在那里没有有限表示。实验脚本对 +90°、−90° 和非有限输入直接报错,同时验证南纬 −60° 与北纬 60° 的面积倍数相同。

网页地图不能铺无限高的瓦片。Google 的文档说其底图大致在南北纬 85° 截断;按本文公式,令纵坐标达到 πR,算出的正方形瓦片边界为 85.05112878°。脚本同时检查这个值,并得到纵坐标约 20,037,508.34 米。该边界是制图实现的选择,不是说纬度超过它的地表不存在。Google Maps:地图与瓦片坐标

更重要的限制是地球不是理想球体。Web Mercator 的常见实现把椭球经纬度代入球面形式的计算,并取椭球的长半轴作为半径。IOGP 的方法说明明确把它与严格的球面、椭球墨卡托方法区分,指出它在椭球上并不严格保角。IOGP:Popular Visualisation Pseudo-Mercator,§3.2.1.2

所以,表中的 1 / cos²φ 是一个清楚、可复算的理想球体模型。它很好地解释高纬度为什么显大,却不是“任意 Web Mercator 截图上一个像素对应多少真实平方米”的精确公式。椭球、实际投影参数、区域跨越的纬度范围和截图缩放,都会影响真正的面积计算。

6. 如果任务真是比较面积,该怎么换方法

做世界范围的面积比较时,优先找说明为等面积的投影,并核对数据的坐标系统;等面积意味着面积关系被保持,不意味着外形、方向和任意两点距离也都准确。若要为一个有明确边界的区域求真实地表面积,应使用适合其坐标参考系统的测地面积方法,或者选取适合该区域的等面积投影,再说明模型和误差范围。Esri:等面积投影与比较;Esri:在墨卡托地图上量距离与面积

如果手上只有 Web Mercator 上的一个很小的图形,又知道它的纬度和地图坐标尺度,球面模型允许做局部近似:把图上的局部面积除以 1 / cos²φ。但大型地区跨越多个纬度,每一处的修正倍数不同,不能找一个“国家中心纬度”就把整块像素面积一次除完。真实椭球上的精确结果也应交给相应的地理计算方法,而非这份教学脚本。

反过来,若任务是连续平移、缩放网页地图,瓦片系统和易用的坐标变换很重要;此时使用 Web Mercator 有工程上的理由。读图时仍应告诉自己:地图帮我找位置、看邻近关系,不自动替我比较国土大小。投影是否“正确”,首先取决于要回答什么问题。

7. 实验究竟验证了什么

脚本断言了赤道倍数为一、30° 的面积倍数为 4/3、60° 的线性与面积倍数分别为二与四、南北 60° 对称、瓦片边界映射到 πR,并拒绝极点及 NaN、无穷输入。生成的 SVG 还经过 XML 解析器验证格式。本次实际运行通过了这些断言,图像也按生成文件检查过。

这些是公式和边界处理的验证,不是拿卫星影像、国家面积数据库或 Google 地图截图做的实测比较。脚本不读取地理多边形,不计算椭球测地面积,也不保证任何现成地图应用采用完全相同的渲染参数。读者可以改变纬度重新跑它,但不要把显示的倍数直接贴到任意区域的面积报告里。

回到开头:高纬地块看起来大,不一定意味着它在地表也大。在理想球面墨卡托中,局部边长按 1 / cosφ 变化,局部面积按 1 / cos²φ 变化;而真实地图还叠加了坐标系统、地球模型和屏幕缩放。要比较面积,就明确选择保面积的工具和方法;要在地图上导航或定位,就接受相应投影给视觉带来的代价。

外部资料、版本页面与链接核对日期:2026 年 10 月 1 日。本文的数值与图像来自所附脚本在文中环境下的运行。