数据质量

为什么坐标舍入比人们想象的更重要

在存储或显示之前把坐标截短到少数几位小数,这种情况很常见,往往只是为了让数字在表格或 URL 中看起来更整洁。容易被忽视的是,纬度或经度值中的每一位小数都对应地面上一段具体的、可计算的距离,舍去数字就是舍去真实的物理精度,而不只是视觉上的杂乱。

在赤道附近,保留到四位小数的坐标可以区分相距约十米的位置,大致相当于一栋建筑的宽度。如果改为保留两位小数,您能区分的位置就相距将近一公里,这很可能就是一个街区与下一个街区之间的差别。取整到零位小数,您只能区分整度,跨度达许多公里。每一位小数对应的确切距离会随着远离赤道、靠近两极而略微缩小,这一点专门针对经度,因为经线会汇聚,但小数位与现实距离之间的总体关系在任何地方都成立。

这在几种常见情况下会成为真正的问题。把坐标存入小数精度不足的数据库列,会在写入时悄无声息地截断数据,而且这种失败看起来一点都不像错误,因为得到的数字仍然是一个有效的坐标,只是不那么准确。让坐标经过一个为显示而取整的系统,然后再把取整后的值用于后续计算,例如距离检查或邻近搜索,会把最初的取整误差叠加到每一个下游结果中。在系统之间手动复制坐标,而操作者因为完整数值看起来过长就删掉几位数字,也会产生同样的效果。

稳妥的习惯是:以与实际使用场景相匹配的小数精度存储和传递坐标,对于需要在建筑或街道级别保持有意义准确性的任何场景,一般至少保留五到六位小数;并且只在向人展示数字之前的最后一步为显示而取整,绝不在计算之前取整。如果您确实只需要城市级别的区分,更早取整也没问题,但这应该是基于应用需求做出的有意选择,而不是数据库列宽或格式习惯造成的意外。

这里的正向逆地理编码返回的坐标带有足够的小数精度,可支持建筑级别的使用场景。至于您在下游如何处理这种精度,尤其是在存储和取整方面,值得有意识地检查,而不是想当然地认为它会原封不动地经过您管道中的每一个环节。