数据与精度
数据来自 Natural Earth 110m Admin 0。边界经过简化,结果适用于科普与视觉比较,不适用于法律、导航、测绘或 GIS 分析。
两根失真轴
第二期加入了第二个读数:形状失真。它来自 Tissot 指示椭圆——把地面上的一个无穷小圆投影到地图上,得到一个椭圆,长短轴之比就是形状失真,两轴之积就是面积失真。
两根轴都必须存在,因为总有一根是死的。在任何等积投影下,面积读数按定义恒为 1.00×,拖拽时纹丝不动;在任何保角投影下,形状读数恒为 1.00,同理。没有哪一根轴在五种投影里都活着,但每种投影至少有一根是活的。
失真椭圆网格用的是同一个函数,只是在约 15×8 个格点上求值。它是唯一能显示一种投影「好」的那一面的视图:墨卡托上每个椭圆都是正圆,等积地球投影上每个椭圆面积都相等。
面积倍数的基线
面积读数以「该投影自身赤道处的实测面积尺度」为 1。v1 用的是 projection.scale() 的平方——对墨卡托这两个数完全相同,所以 v1 的读数一个都没有变。对折中投影则不同:自然地球投影为了塞进画布把低纬压扁了,赤道处只有标称尺度的 0.877 倍,照搬会显示 0.88×。实测归一之后,「相对赤道」这句话对五种投影同时成立。
赤道装不下六大洲
「沿赤道排开」把可见图层按各自在赤道上的真实宽度并排放置。六大洲加起来需要 428 度经度,全部十四个对象需要 783 度,而赤道一圈只有 360 度。这不是命令出错,这是最直接的一句尺度陈述:地球的赤道容不下自己的大洲并排站着。
数据来源
边界数据来自 Natural Earth 110m Admin 0 国家数据集,公有领域。源文件随仓库一起提交,构建过程不联网——否则 CI 和部署会因为上游站点波动而随机失败。
110m 是为世界尺度显示准备的比例尺,本身已经过简化。因此海岸线是粗略的,很小的岛屿可能缺失。
形状是怎么移动的
拖动一个对象时,它在球面上作刚体旋转,而不是把经纬度各加一个偏移量。这个区别是本项目的核心。
墨卡托投影把经度线性映射到横轴,所以纯粹的经纬度平移不会改变形状的屏幕宽度——只有高度会变。那样的话,被拖到赤道的格陵兰仍然占据 62 个经度、约 6,900 公里,而它真实的东西宽度只有约 2,100 公里。界面会显示「无失真」,画面上却是一个被横向拉宽 3.2 倍的格陵兰。
刚体旋转保证形状内部的每一段地面距离都不变,所以它在赤道上缩小是真实的,不是画上去的。
把活动图层绕自身锚点旋转,用的是同一次球面旋转的第三个角。它同样是刚体运动:真实面积一点不变,但视觉面积会变,因为转过之后形状覆盖的纬度不一样了。这不是把画面转个角度,而是在球面上重新旋转后再投影一次。
一个诚实的副作用:斜向拖动会让形状轻微转动。球面上的刚体运动无法保持固定方位角,这是几何,不是渲染缺陷。沿锚点自身的经线南北拖动则不会有这种转动。
面积倍率是怎么算的
主读数直接测量画出来的几何:投影后的面积除以真实球面面积,再以赤道为基准归一化。它对整块多边形精确,包含洞和多部分几何,等价于 sec² 在整个形状上的面积加权平均。
锚点处的 sec² 只作为补充显示。对跨纬度大的对象两者差别明显:格陵兰的真实倍率约 16.4,而锚点估算只有 11.9,差 27%。原因是 sec² 是凸函数——格陵兰北端在 84°N,那里的局部放大已达 92 倍。
可拖动范围受限于把整个形状保持在墨卡托 85.05° 实用极限之内。对象越大,锚点能到达的纬度越窄。这是几何约束:一个足够宽的对象确实无法靠近极点而不绕过极地。
大洲是怎么定义的
这里的大洲是基于国家元数据的政治分组,不是地质意义上的大陆。每个国家只属于一个大洲。
有一处刻意的偏离:俄罗斯被归入亚洲,而源数据把它归在欧洲。照搬源数据的话,「欧洲」有 74% 的面积是俄罗斯,边界一直延伸到堪察加,锚点落在西伯利亚——欧洲与非洲的对比就无从谈起了。俄罗斯仍然可以单独选择。
另一处:源数据里的法国是一个包含法属圭亚那的整体。欧洲这个对象排除了那一部分。它只占欧洲面积的 1.4%,却距欧洲锚点 74 度,会把这个对象的可拖纬度范围从约 ±56 度压缩到 ±11 度。底图仍然完整绘制法国。
已知限制
面积计算与公开数值对照:加拿大、巴西、澳大利亚、俄罗斯、格陵兰都在约 1% 以内;印度约低 4%,简化和争议边界共同作用。
地球被当作正球体而非椭球体处理,误差不到百分之一,远小于边界简化带来的误差。
大洲保留内部国界,不做合并。
结论:适用于科普教学与视觉比较,不适用于法律、导航、测绘或 GIS 分析。