0

我正在尝试将 Geo CoOrdinates 存储在 mysql 数据库服务器中。如果我的坐标精度值超过 15 位,则该值会四舍五入并存储在数据库中。我相信这是因为这个文档而发生的。

但有趣的信息是 当我尝试使用双数据类型存储相同的坐标时。我可以存储高达 17 位的精度。

空间数据类型还将每个坐标存储为内部的双精度值。那么为什么 Spatial 数据类型不能存储超过 15 位的精度呢?我必须存储高达 20 位的精度现在该怎么办?

4

1 回答 1

1

这是一个很好的问题,也许对内部有更深入了解的人可以回答这个问题,但是,我个人会质疑为什么你“必须存储高达 20 位的精度”。

我从您之前的一些问题中注意到您正在处理纬度和经度坐标,这仍然正确吗?

假设是这样,对 20 位精度的需求是值得怀疑的,并且有充分的理由。赤道的单经度(最大)代表大约 110 公里。所以:

  • 小数点后 1 位是 11 公里
  • 2 位小数是 1.1 公里
  • 3 位小数是 110 米
  • 4 位小数是 11 米
  • 5 位小数是 1.1 米
  • 小数点后 6 位是 11 厘米
  • 小数点后 7 位是 1.1 厘米
  • 8 位小数是 1.1 毫米
  • 9 位小数是 0.11 毫米
  • 小数点后 10 位为 0.011 毫米

..我认为我不需要在这里继续,在小数点后 20 位,您将处理小于纳米尺度的距离。值得注意的是,实际上这些距离会随着您靠近两极而减小,尽管使用 MySQL 您正在处理平面模型,因此这不适用(除非您手动实现复杂的 vincenty 算法来计算距离 - 这会带来严重的开销与haversine方法相比)。地球上也没有任何设备可以准确记录这一点,因此您永远不会在这些级别上获得“绝对”的结果。

即使您不使用纬度和经度,而是在平面模型上使用几何,您的单位也可以是您想要的任何度量(只要您记住,根据需要进行转换并记录它 - 例如米),同样,不需要 20 位精度。

当然,您可以完全放弃对 Spatial 的使用,并使用支持所需精度的类型手动实现存储经纬度的类型。但是,您将不得不实施所有自己的计算并破坏空间索引所带来的好处,从而产生巨大的开销。我不推荐这种方法,也不推荐重新发明轮子。

希望这是有道理的。如果我遗漏了什么,请随时发表评论,我会更新我的答案。

于 2014-03-13T09:33:33.337 回答