为什么Spatial数据类型不能保持超过15位数的精度,因为它使用Double来保存数据?

时间:2014-03-13 07:11:03

标签: geocoding geospatial spatial mysql-5.6 hibernate-spatial

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

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

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

1 个答案:

答案 0 :(得分: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算法来计算距离 - 这会带来严重的开销与hasrsine方法相比)。地球上也没有任何设备准确记录,因此你永远不会在这些级别上获得“绝对”结果。

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

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

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