做地图可视化这行,
八年了,
真的累觉不爱。
昨天有个兄弟
在群里哭诉,
说他的地图
比例尺怎么都对不上。
我一看代码,
好家伙,
直接用d3.geo.length
去算直线距离。
这能准吗?
地球是圆的啊!
朋友,
你那是平面几何,
不是球面几何。
我当年刚入行
也犯这错,
被老板骂得
狗血淋头。
现在想想,
真是尴尬。
d3.geo.length
这玩意儿,
它算的是
投影后的长度。
注意,
是投影后。
不是真实距离。
如果你用的是
Web Mercator,
那在高纬度地区,
误差大得吓人。
比如格陵兰岛,
看着跟非洲差不多大,
其实非洲是它的
十四倍。
你拿d3.geo.length
去算那里的路,
差个十万八千里。
我有个项目,
是做物流路径的。
客户非要精确到米。
我用默认的投影,
结果误差
超过了百分之五。
客户直接
把方案打回。
后来我换了
d3.geoAlbersUsa,
或者更高级的
d3.geoConicEqualArea。
误差立马
降到了千分之三。
这差距,
肉眼可见。
所以,
别偷懒,
选对投影。
d3.geo.length
本身没问题,
问题是你
用在哪。
它适合
小范围,
或者
等积投影下。
要是跨国,
跨大洋,
赶紧换算法。
或者用
d3.geoDistance。
这俩别搞混。
length是长度,
distance是角度。
虽然都能算,
但语义不同。
我见过太多人,
为了省事,
直接复制粘贴
网上的代码。
也不看看
用的什么投影。
结果上线后,
数据全歪了。
修bug修到
凌晨三点。
何必呢?
前期多花
十分钟,
后期省十天。
这账,
得算清楚。
还有,
注意坐标系。
如果是
WGS84,
记得先转成
投影坐标系。
不然
d3.geo.length
算出来的,
就是一堆
毫无意义的数字。
就像你
用尺子量
地球周长,
能准吗?
肯定不准。
我现在的习惯,
是先打印出
投影的参数。
看看中心纬度,
标准纬线。
这些细节,
决定了
最终的精度。
别小看
这几行配置。
关键时刻,
能救你的命。
当然,
也不是说
d3.geo.length
完全不能用。
如果你只是
做个示意图,
大概看看
哪个长哪个短。
那随便用,
无所谓。
但要是
涉及商业决策,
涉及钱。
那就得严谨。
毕竟,
数据不会撒谎,
但会误导人。
希望兄弟们,
别再踩这坑。
少走弯路,
早点下班。
这才是
硬道理。
记住,
工具是死的,
人是活的。
选对工具,
用对方法,
才能
事半功倍。
共勉。