做地图数据设计这么多年,回头盘点哪个概念最“基础”但其实最容易被低估,比例尺绝对排得上号。很多同学一听到“地图比例尺”五个字,第一反应就是“1比1万、1比5万、1比10万”,觉得这不就是小学地理课讲过的“图上距离比实地距离”嘛。但真到自己设计一套地图数据的时候,从矢量数据组织、瓦片金字塔层级、注记避让到渲染策略,处处都要被比例尺卡脖子。它不只是地图角落那个数字,而是数据规格的统一坐标系,是所有性能优化争论的源头之一。
这篇是“地图数据设计”系列的第四篇,专门把比例尺放到数据设计的语境里拆开聊。我会重点解释比例尺和缩放级别怎么换算、瓦片金字塔怎么分级、什么内容该在哪一级出现,以及不同业务场景里比例尺策略有什么不同。适合正在做地图数据生产、瓦片服务、LBS应用的开发者和GIS从业者,也适合想搞懂地图底层逻辑的产品同学。这一篇不会停留在“1比多少”的表层,而是把它当作数据设计的一根主线去讲。
1. 比例尺的本质:不只是“数字大小”
1.1 地图比例尺到底在表达什么
地图比例尺的学术定义,是图上某一线段的长度与相应实地水平距离之比。这个定义放到数字地图里,需要重新翻译一次。数字地图没有“纸质纸张”,屏幕上的坐标、瓦片上的像素、地理坐标里的经纬度,背后都是在同一张地图的不同窗口里观察数据。比例尺在数字环境里的真实作用,是规定“一个像素或一段图像代表地面多少米”,把屏幕坐标系和地理坐标系绑在一起。
这也是为什么很多工程师会把比例尺和“缩放级别”(zoom level)混着用。因为数字地图一般不直接展示“1:50000”这样的数字,而是用level、stage来控制视图。其实两者是同一枚硬币的两面:比例尺描述的是图面与地面的比例关系,缩放级别描述的是金字塔里的索引下标。二者必须严格换算,一旦换算出错,地图数据就会整体错位。我见过很多“POI叠加不上底图”“瓦片边缘模糊”的排查案例,追根溯源,绝大多数不是算法问题,而是比例尺和缩放级别的映射关系在团队内部没有对齐。
还有一个反直觉的点要强调:比例尺数字越大,地图越概略;数字越小,地图越精细。1:1000是比1:100000更大的比例尺,但显示范围反而更小,细节更清晰。很多初学数据设计的人在这上面栽过跟头——写图层可见性规则时把minZoom和maxZoom写反,结果街道级别还看不到小路,全图级别反而弹出一堆POI。把比例尺的“大小方向”搞对,是所有后续设计的前提。
1.2 从模拟地图时代继承下来的两个核心:分母与DPI
先讲两个最基础的参数:比例尺分母(Scale Denominator)和DPI。
比例尺分母就是“1:X”里的X。X=5000,代表图上1单位等于实地5000单位。这个数字越大,地图越概略;数字越小,地图越精细。数字地图做图层可见性配置时,写的往往就是最小比例尺和最大比例尺,也就是minzoom和maxzoom背后的逻辑。这里要特别注意的是,“最小比例尺”指的是分母最大的那个状态,比如1:100000;“最大比例尺”指的是分母最小的那个状态,比如1:5000。方向搞反,整个数据调度就乱了。
DPI(每英寸点数)是栅格渲染的分辨率基准。数字地图常用的DPI是96(Windows屏幕)或72(常见设计稿),但地图业内很多标准文档使用的是90.714或96。为什么会有这么多数字?因为不同年代的屏幕标准和印刷工艺不一样。做地图数据设计时,DPI必须当作一等公民来对待。拿Web墨卡托(EPSG:3857)举例,在缩放级别z下,地面分辨率有一个固定计算公式,而屏幕比例尺又是分辨率、纬度和DPI三者的函数。很多做“1:500出图”的同行,最先踩的就是屏幕DPI和制图软件默认DPI不一致的坑。
注意:比例尺分母、DPI、分辨率三者的关系不是“近似”,而是严格数学定义。在Web墨卡托投影下,地面分辨率不等于真实地面距离,因为投影在非赤道区域存在面积变形。所以换算时必须明确“按赤道基准标定”,否则做距离量算或出图会差出肉眼可辨的一截。
1.3 比例尺与缩放级别(zoom level)的映射关系
在主流Web切片方案里,缩放级别通常从0开始。第0级是全世界,一张瓦片覆盖整个地球。每增加一级,长宽各切为2份,覆盖范围减半,分辨率翻倍。于是有:
resolution = 地球周长(投影坐标系下的长度) /(256 × 2^level)
以Web墨卡托为例,地球半径R=6378137米,地球周长在投影面上是2×π×R,约40075016.686米。第0级一张256×256的瓦片,resolution=40075016.686/256,约156543.03米/像素。第1级就是78271.52米/像素。第20级算一下只有约0.149米/像素,已经接近分米级。
为什么反复强调这个公式?因为它决定三件事。第一,瓦片服务到底切到多少级,直接决定存储量级。第二,数据生产时按什么单位组织和抽稀,比如道路数据在低级别下应该化简到多少坐标密度才算不浪费。第三,前端渲染时能不能用整数级瓦片直接展示。三者如果不在同一套公式下对齐,表现一定出问题。每个项目我都会先拉出一张“级别-分辨率-比例尺”对照表,团队所有人都按这张表说话,联调阶段能省下大把时间。
1.4 Web Mercator 下的通用计算
下面是可以直接落地的换算逻辑,不需要完整推导,背公式即可。常用假设:切片尺寸为256×256像素,Web墨卡托投影,DPI取96。
- 第level级分辨率:resolution = 156543.03392804097 / 2^level(单位:米/像素)
- 比例尺分母与分辨率关系:scale = resolution × 96 / 0.0254(0.0254是一英寸的米数)
- 反向求分辨率:resolution = scale × 0.0254 / 96
举例,z=18时,resolution=156543.03/262144,约0.597米/像素。按DPI=96换算,scale约0.597×96/0.0254,约2257。也就是说,z=18大致对应1:2257。如果你看到某个数据规范里写“建筑轮廓在1:2000到1:5000之间显示”,那它大致对应z=17到z=18附近的区间。
注意,这是Web墨卡托下的近似标定。因为墨卡托投影在纬度方向存在无限拉伸,同一级别在不同纬度下,像素代表的真实地面米数并不相同。标准标注默认按赤道轴计算。纬度越高,同样一个像素代表的实地距离越小,地图表现得更“放大”。所以做全球业务时,比例尺标注要讲清楚“这个比例尺是在哪个基准下的”,而做本地高精度量算时,就更不能偷懒直接套全球公式了。
1.5 为什么不能只靠zoom level
前端代码里到处是map.setZoom(18),数据配置里也写着visibleLevels: [2, 8, 17]。但zoom level只是一个离散的索引下标,它对应的地面分辨率和比例尺,取决于投影、瓦片尺寸和DPI三个变量。同一级别,在256瓦片和512瓦片下,分辨率差一倍,页面表现完全不同。团队内部凡是做瓦片算法、数据抽稀、样式配置的人,必须统一“级别-比例尺”映射表。否则前端、数据、样式各写各的,最后联调时互相甩锅,浪费的就是整个迭代周期。
2. 比例尺驱动的数据组织:瓦片金字塔的底层逻辑
2.1 为什么数据要分“级”
比例尺的本质,是“信息密度的上限”。1:1000的图上能画出0.3米宽的小路,但到1:100万比例尺下,这条路连0.03毫米都不到,画出来只会是一片噪声。所以数据设计的第一原则是:不同比例尺下,同一要素的表现形式和数据本身应当不同。
这里引出“分级”的核心理由。实际数据生产时,至少会准备三套内容:最详细级,包含全部坐标点和全部属性字段,用于底图生产;概略级,对几何做抽稀、对属性做裁剪,只保留必要字段;中间级则是两者之间的过渡。为什么不是只留最详细级?因为渲染和存储都有物理极限。线上地图的加载速度、内存占用、渲染帧率都要求数据量可控。想想看,一条高速公路在源数据里可能有数万个坐标点,每个点都来自真实测量。在1:10万比例尺下把它画成几万个点,用户看到的就是一团毛刺;化简过头,路线走向又对不上。每个级别,你都在做“几何化简”和“图形保真”之间的平衡。
分级不是拍脑袋定的,而是由目标比例尺的分辨率倒推出来的。当前级别能容纳多少有效像素,就保留相应量级的坐标密度,这就是数据量规划的起点。
2.2 金字塔切片规则:从第0级到第N级
栅格瓦片和矢量瓦片都遵循金字塔结构。规则很直接:第0级一张瓦片覆盖全球;第1级4张;第2级16张;每增加一级,瓦片数是上一级的4倍。到第20级,理论瓦片数是4的20次方,约1.1万亿张。当然实际瓦片只需要覆盖陆地和业务区域,但“指数爆炸”的增长模型,决定了数据切片的成本上限。
具体怎么切?以XYZ标准为例,原点在左上角,x向右,y向下。级别z下,瓦片坐标(tx, ty)由经纬度经投影计算得到。全球范围经度从-180到180,纬度在Web墨卡托投影后从约-85.06到85.06。把全球投影平面按2^z×2^z网格均匀划分,每个格就是一张瓦片。这个规则的简单性,是它成功的原因。任意坐标都能通过整数运算定位瓦片,不需要额外空间索引。
但比切片规则更重要的,是“每一级切到什么范围”。常见优化策略有三条。第一,按业务区域裁剪,全球底图按陆地边界裁剪,避免海洋区域切出大量无意义瓦片。第二,按数据内容设定最小和最大级别,POI数据可能只切到z=14,建筑轮廓切到z=18。第三,控制瓦片体积,矢量瓦片用二进制格式压缩后,单瓦片可以控制在几十KB以内,栅格瓦片则多用有损压缩。这些策略背后的共同驱动力,就是比例尺决定的数据粒度。
2.3 矢量瓦片与栅格瓦片的比例尺差异
栅格瓦片是“提前渲染好的图片”,每张瓦片的分辨率与级别严格对应。它的比例尺含义最直接:z=16的瓦片,就是16级分辨率。但也正因为是图片,跨级别切换时必须重新请求、重新渲染,父级瓦片淡出过渡是最常见的做法。数据量方面,栅格瓦片每个级别都是独立图片,存储量跟着级别数线性增长。
矢量瓦片则完全不同。它存的是“几何坐标加属性”,渲染完全在前端完成。这意味着矢量瓦片的级别,并不严格绑定渲染比例尺。你可以把z=10的矢量瓦片加载到z=14的地图上,让前端做几何插值放大,很多引擎支持这个能力,但细节会丢失。这在数据设计上有利有弊。好处是可以大幅减少请求量;坏处是如果几何没有按适当级别抽稀,放大后会出现叠边、锯齿和标签密度爆炸。
我的实践建议是,矢量瓦片依然要按级别做数据裁剪与抽稀,但允许“数据级别与显示级别存在一定跨度”。比如把道路数据按z=0到4、z=5到10、z=11到14、z=15以上四个粒度准备四套,而不是每个级别各准备一套。这样既能减少存储,又能保证显示效果。这是很多商业地图平台常用的“多级瓦片复用”策略。你可以在数据预处理阶段把级别范围直接写进过滤规则,不需要改引擎。
2.4 级别与数据量的“指数陷阱”
做瓦片服务最怕遇到指数陷阱:以为多切几个级别无所谓,结果存储和带宽双双爆炸。举一个具体计算:某团队决定把全球道路网切到z=18,源头道路数据大约有2000万条线段。理论上,每一条线段会出现在很多级别的很多瓦片里,平均一个要素被重复写入几十次。最终瓦片数如果是几千万张,存储可能要占用数百GB甚至上TB。
怎么避免?经验法则是用“数据级别范围表”来规范。先算每一类数据的“可见性价比”。比例尺极细的级别通常只覆盖核心城区,绝不全球覆盖。比如建筑轮廓只切城市核心区(z=15到18),道路网在郊区只保留主干道(z=8到14)。这背后是两种比例尺策略的组合:一是按比例尺决定是否显示,二是按地理区域决定预处理范围。数据设计规范里至少要写清楚:某类数据在哪些级别下覆盖全球,在哪些级别下覆盖业务区,在哪些级别下被限制在某区域。没有这个约束,任何一个实习生都可能把瓦片任务跑出一台服务器的账单。
3. 内容层级设计:什么比例尺显示什么要素
3.1 LOD(细节层次)的本质
LOD这个概念从3D图形学借过来,在地图里是指“不同比例尺显示不同详细程度”。这可不是一个可选优化,而是地图可读性的基本要求。比例尺大到一定程度,人和车辆的空间位置能分开;比例尺小到一定程度,整个城市只占指甲盖大小,如果再显示每条胡同和每个POI,视觉上就是一团乱麻。
LOD设计的第一步,是给所有数据类别排一张优先级表。我通常按这个顺序:行政区划边界、主要道路、水系、次要道路、居民地、POI、建筑。这个顺序不是拍脑袋,而是基于“人在地图上识别信息的顺序”。优先级高的要素,在任何级别都必须给骨架;优先级低的要素只在合适级别出现。比如行政边界在z=3就要能看清,建筑轮廓到了z=16再显示,这是一条硬规则。
关键技巧是,每个要素类目都要定义“最小可见尺寸”。低于这个尺寸就不显示。例如POI图标的最小像素尺寸可能是16×16,如果某个POI在z=13时只占8像素,就不应该显示。这个最小可见尺寸换算到比例尺,就是该要素显示范围的下限。数据生产时按这个下限裁剪,比前端临时判断更可控。
3.2 要素取舍的最小可见尺寸原则
“最小可见尺寸”是LOD设计里最实用的工具。它解决一个核心矛盾:地图上到底哪些要素该显示?与其凭感觉,不如靠数学。公式很简单:要素的实际大小(米),除以当前级别分辨率(米/像素),得到要素的屏幕大小(像素)。
比如一栋楼长宽30米。在z=17(分辨率约0.597米/像素)时,屏幕尺寸约50像素,完全可以显示。在z=13(分辨率约9.55米/像素)时,只有约3像素,画出来就是几个像素点,还容易和图形符号混淆,应该隐藏。再比如一条小路宽度只有2米,在z=16(分辨率约2.39米/像素)时,屏幕宽度约0.8像素,肉眼几乎看不见。这时就值得问一句:这条小路在该级别是不是唯一可达路径?如果是,就不能只按尺寸规则裁掉,而要给它一个“重要性等级”升级的机制。
所以我的取舍规则是这样写的:先按最小可见尺寸做一道硬过滤,把小于阈值的全部删掉;再按要素等级做一道软过滤,对低等级但语义关键的要素单独保留。这套规则建议写进数据字典,作为瓦片生产的过滤条件,而不是丢给前端运行时去判断。前端判断的结果不可预期,数据预处理的结论则是一致的。
3.3 注记(标签)碰撞与比例尺的关系
比例尺一变,注记空间也跟着全变。一个大城市名在z=10时,可能要占小半个屏幕,需要用小字号、短名称;到z=14时,几十个地名可以各就其位。注记排布的难点,永远在碰撞检测和权重取舍。碰撞的本质是:屏幕空间有限,数据无限。
比例尺在这里的角色,是提供“候选池”的准入门槛。你不可能让z=10的图上同时处理所有道路名和POI名,那只会让整张图变成字符堆。我的做法是,每一级注记都设一个最大条数阈值,超过阈值就按权重截断。权重规则包括要素等级、人口规模、商业热度、名称长度等。这些都写在样式配置和数据预处理规则里,而不是依赖引擎随机取舍。
还有一个和比例尺强相关的坑:注记优先级会随比例尺变化。在z=13时,“市中心商圈”的注记优先级最高,到了z=16,它可能被具体街道名和POI名挤出去。只有在数据配置里明确写“当级别大于多少时,某类注记权重降级”,才能保证用户体验连续。如果不写,引擎只能按静态权重一直优先显示同一个名字,用户放大缩小看到的拥挤程度会很奇怪。
3.4 按比例尺分层的图层组织实践
做样式配置时,很多新手把几百个图层全堆在样式表里,然后依赖引擎的可见性开关。这会导致两个问题:一是配置文件体积变大,加载变慢;二是渲染引擎在每帧都要遍历大量图层做可见性判断,性能下降。更优的实践是“逻辑分组加按比例尺分组建模”。
我的建议做法是四步。第一,把图层分为底图层(地形、影像)、基础图层(道路、水系、行政区划)、业务图层(POI、建筑、热力)。第二,每个分组内部,按要素类型排优先级。第三,每个图层必须配置minZoom和maxZoom,不能只写一个初始可见性。第四,高优先级图层可以不设上限,但低优先级图层一定要有上限,从源头上减少渲染器负担。
这个“按比例尺管理图层”的规范,能让样式配置体积减少一半左右,同时渲染性能有肉眼可见的提升。具体到瓦片数据,每个级别的瓦片只打包该级别真正需要的图层,渲染时少解析、少判断,自然就快了。这一节的内容,直接决定你的地图“卡不卡”。
4. 不同业务场景下的比例尺策略
4.1 导航地图:动态比例尺与路径优先
导航地图的比例尺不是固定的,它跟着驾驶行为走。高速巡航时用较大比例尺看全局,比如1:100000;接近路口时自动放大到交叉口详图,比如1:5000。这种场景下,比例尺设计的关键是“视角切换的连续性”。如果从1:10万直接跳到1:5000,用户会瞬间迷失方向,所以必须做动态平滑过渡,让视野一层一层推进。
导航场景还有一个特殊要求:路径线必须始终可见,无论比例尺多大。这导致路径线图层在数据设计里的优先级,通常高于底图所有要素。在数据层面,可以给路径线图层配置独立的分级策略。普通底图在低级别时隐藏次要要素,导航底图则要把路径线保留为最高优先级,最多允许适当简化顶点,但绝不允许消失。这比普通LOD策略复杂,因为同一个道路数据同时服务于底图显示和路径高亮,两套规则要分开管理。
4.2 数据可视化大屏:固定层级与视觉密度平衡
大屏地图通常不提供自由缩放,而是固定在几个预设比例尺上轮播或切换。这种场景下,比例尺设计更像“版面设计”。你要为每个预设比例尺分别设计图层可见性、字号、图标大小,确保视觉密度在可接受范围内。我参与过某个智慧城市项目,屏幕固定在z=11和z=13两个级别最常用,那么数据预处理就重点优化这两个级别:z=11时让所有区县名称清晰,z=13时显示片区轮廓和主要街道,其余级别可以简化处理。
固定层级的另一个好处,是可以做大量预渲染。热力图、聚合图、路径动画这类样式,在固定层级下几乎零开销。很多可视化平台正是靠“固定级别加预渲染”的模式,把大数据量地图压缩到毫秒级交互。但要注意,大屏比例尺的“视觉密度”需要反复验证。字号、图标、注记间距在32寸屏幕和55寸屏幕上差异很大,设计时最好先按物理尺寸计算像素密度,再定级别。
4.3 户外与野外场景:比例尺与精度解耦
户外地图(登山、徒步、野外作业)有一个独特需求:离线可用,屏幕尺寸小,交互方式有限。比如户外手表屏幕不到3寸,能显示的比例尺非常有限,但用户需要在小屏幕上快速判断地形起伏和路径危险性。这时候比例尺设计的核心矛盾,是数据精度与数据量的冲突。
我的经验是,户外场景不要试图保留过高级别数据,而是把重点放在中间级别(z=10到14)的等高线地形渲染和路径安全提示上。等高线在低级别时合并,高级别时拆分。关键是精度必须可靠——户外导航一旦比例尺标注错误,用户可能误判距离,这是安全级别的事故隐患。所以这类场景里,投影变形补偿和比例尺标注的校验要更严格。数据上线前,需要拿实测控制点反算比例尺,验证渲染模型是否正确。
注意:任何涉及人身安全的地图应用,不能依赖单一来源的比例尺标注。必须有“比例尺校验”流程。常见做法是,选取一段已知距离的地物,在目标级别下截图,用像素距离反推比例尺分母,确认误差在容忍范围之内。
4.4 移动端适配:字体大小与点击热区
移动端地图屏幕小、触控为主,比例尺策略受“最小可点击尺寸”约束。一个POI图标如果小于44×44像素,在移动端就很难点中,这是移动交互领域的一个通用经验值。所以移动端需要把POI碰撞检测的阈值提高到44像素,而不是PC端的16像素。这意味着同样的数据,移动端要在z=16才显示某些POI,而PC端在z=14就能显示。
这个设计差异看着小,实际影响非常大。一套数据如果不区分终端,移动端会出现大量无法点击的POI,用户会觉得地图“点不准”。因此,比例尺数据规范里应该明确目标设备类型,并根据设备类型调整可见性级别、字号、图标尺寸和聚合策略。很多平台之所以维护“PC端瓦片”和“移动端瓦片”两套配置,根因就在这里。从数据设计一开始就把终端差异考虑进去,比后面返工要省力得多。
5. 实操中的参数计算与常见坑
5.1 常用比例尺级别对照表(Web墨卡托,256瓦片)
下面这张表是一套常用基准,可以直接写进数据字典里。以Web墨卡托、256×256瓦片、赤道基准、DPI=96为前提。
| zoom级别 | 分辨率(米/像素) | 比例尺分母(近似) | 大致尺度感 |
|---|---|---|---|
| 0 | 156543.03 | 591657527 | 全球 |
| 3 | 19567.88 | 73957191 | 大洲 |
| 6 | 2445.98 | 9244649 | 国家或省 |
| 10 | 152.87 | 577791 | 城市周边 |
| 14 | 9.55 | 36112 | 城区 |
| 16 | 2.39 | 9028 | 街道级 |
| 18 | 0.60 | 2257 | 街区级 |
| 20 | 0.15 | 564 | 建筑级 |
表里的比例尺分母是近似值,正式出图时最好用项目统一的计算工具算到小数点后两位。很多规范文档会直接引用“z=16等于1:9028”,其实这个数字是赤道基准下的标准标定。在同一级别不同纬度,真实地面比例尺会变化,但瓦片网格始终保持一致,所以全球服务以此为索引是合理的。关键是每个人都要清楚,这个数字是“索引编号”,不是所有地方的物理真实比例尺。
5.2 分辨率(resolution)与DPI计算
很多人问,为什么按公式算了比例尺,出的图还是和平台不一样?大概率是DPI没对齐。你的出图软件默认96DPI,地图引擎内部可能用90.7或72,同一个缩放级别算出来的比例尺分母,差异在6%到33%之间。做纸图输出的场景,比如不动产测绘、规划审批,DPI必须统一,否则图纸上的比例尺标注在验收时就是错的。
实用建议是,把DPI=96定为团队默认值,并在数据字典里写明;只对专门走印刷品的流程,用300DPI重新换算。不要在同一套配置里混用DPI,否则后期排查会非常痛苦。每次接新项目,我都会先问一句:你们的地图引擎用的什么DPI?如果对方说“不知道”,那第一件事就是去代码里确认,而不是继续往下设计数据。
5.3 投影变形问题
Web墨卡托把所有地图当作圆柱投影处理,纬线被无限拉伸。这导致两个后果。第一,面积变形严重,高纬度地区看起来面积格外大,这是老生常谈的“地图为什么失真”问题。第二,“比例尺分母”在不同纬度含义不同。标准标注默认按赤道,但如果你在北纬60度以上量算距离,实际比例尺分母会比标注小。因为高纬度地区地面距离在Web墨卡托下会被拉伸,所以同样的比例尺,高纬度地图表现得更“放大”。
因此,做距离量算类功能时,务必在投影层面补偿。最常见的做法是转本地切平面投影,比如高斯-克吕格、UTM,不要直接用Web墨卡托量距离。更合理的数据架构是:业务数据按原始经纬度存储,只在前端渲染时切到Web墨卡托,需要量算时再动态转换到本地投影。这样业务精度和展示效果各取所长,不会互相拖累。
5.4 常见问题排查与避坑指南
我整理了几个高频问题,每个都来自真实项目中的排查记录。
问题一:瓦片错位,叠加图层对不齐。原因通常是两个数据源使用了不同瓦片网格定义,比如原点位置不同,或切片尺寸不同。排查步骤是:先确认所有数据是否在同一投影坐标系下,比如EPSG:3857;再对比两个瓦片在相同zoom级别、相同经纬度下的像素坐标是否一致;最后检查瓦片行列号算法。90%的问题出在y轴方向,XYZ标准原点在左上,TMS标准原点在左下,混用时行号会差一倍。
问题二:数据级别配置看起来没问题,但地图加载时某些要素一闪而过。原因往往是样式表达式里的minZoom和maxZoom,与数据实际精度不匹配,或者LOD抽稀后几何退化。比如原本是面的要素,化简后退化成了线,渲染规则里是面样式就画不出来。排查时打开开发者工具逐个瓦片查看要素属性,确认该要素出现在哪个级别,同时检查它的几何类型。更稳妥的办法,是在数据生产阶段给要素打上source_zoom标记,排查时直接按标记回溯。
问题三:比例尺标注与实际量测距离不符。原因通常是在Web墨卡托下没有按纬度修正,或者DPI不一致。排查顺序是:先确认量测位置是否靠近赤道,再检查DPI设置,最后用经纬度之间的距离公式验证一段已知距离。如果全程都对不上,要考虑是不是误用了本地投影坐标系,还把数据和投影混在一起存了。
问题四:瓦片存储量超过预估。原因基本都是切了超过业务需求的高级别,或者边缘冗余瓦片太多。排查方法很简单:检查数据级别范围表是否严格执行,关闭“自然切到全球”的默认选项,改为按业务bounding box裁剪,并定期清理无效瓦片。记住前面说的指数陷阱,级别每加一,瓦片量至少翻四倍。
5.5 用“级别契约表”管理比例尺配置
最后分享一个我自己很受益的管理技巧,叫“级别契约表”。它其实是一张二维表,行是数据类别,比如道路、水系、建筑、POI;列是每一级zoom;单元格里写的是该数据在那一级别的状态——不显示、仅显示简化版、显示完整版、高精度——以及过滤条件。团队里任何成员拿到这张表,就能判断该在哪个级别准备什么数据。
这张表我建议放在项目仓库里,纳入版本管理。每次调整级别映射,都要走评审。数据生产的同事按表切数据,前端同事按表写可见性,测试同事按表验收,整个链路就闭合了。地图数据的稳定性,很大程度来自这种契约化管理,而不是某几个老员工脑子里的经验。
最后再多说一句我的个人体会。做地图数据设计这些年,我越来越觉得比例尺是个“看不见但无时无刻不在起作用”的基建变量。你在前端看到的每一条路、每一个POI图标,背后都有比例尺参与决策。踩过的坑多了以后,我养成一个习惯:每接手一个新项目,第一件事不是看地图样式,而是拉出全量数据的级别映射表,把“级别-比例尺”的换算关系在团队里对齐。这个动作看起来朴素,但能省下后面数不清的联调时间。
还有一个细节想特别提醒:如果你的瓦片服务同时支撑Web端和移动端,除了分辨率,一定要把“目标DPI”和“点击热区”也写进比例尺规范里。这套配置越早统一,后面返工的体量就越小。比例尺设计看似是个小点,实际是整个地图数据体系的尺度观念。这一篇把尺度观念讲透,下一篇就可以直接聊“矢量瓦片数据组织”了。