我应该如何准确地存储经纬度?

我在这里读到这个问题:

在SQL数据库中存储纬度和经度数据时使用哪种数据types?

看来普遍的共识是使用十进制(9,6)是要走的路。 对我来说,问题是我真的需要这个准确吗?

例如,Google的API会返回如下结果:

"lat": 37.4219720, "lng": -122.0841430 

在-122.0841430之外,我需要多less位数? 我已经阅读了几个指南,但是我不能从中弄清楚这些。

更准确地说,在我的问题中:如果我想要在精确位置的50英尺范围内准确,我需要存储多less个小数点?

也许一个更好的问题实际上是一个非编程问题,但它会是:每个小数点给你多less准确?

这是简单的吗?

  1. 项目清单
  2. x00 = 6000英里
  3. xx0 = 600英里
  4. xxx = 60英里
  5. xxx.x = 6英里
  6. xxx.xx = .6英里
  7. 等等?

精确度与赤道的小数位数

 decimal degrees distance places ------------------------------- 0 1.0 111 km 1 0.1 11.1 km 2 0.01 1.11 km 3 0.001 111 m 4 0.0001 11.1 m 5 0.00001 1.11 m 6 0.000001 0.111 m 7 0.0000001 1.11 cm 8 0.00000001 1.11 mm 

ref: https : //en.wikipedia.org/wiki/Decimal_degrees#Precision

 +----------------+-------------+ | Decimals | Precision | +----------------+-------------+ | 5 | 1m | | 4 | 11m | | 3 | 111m | +----------------+-------------+ 

如果你想50英尺(15米)精度去4位数。 所以decimal(9,6)

我devise数据库,一直在研究这个问题。 我们使用带有Oracle后端的现成应用程序,其中数据字段被定义为允许17位小数。 荒谬! 这是千分之一英寸。 世界上没有GPS仪器是准确的。 所以让我们放下十七个小数位并处理实际。 政府保证他们的系统在“95%的置信度下,伪距精确度达到7.8米”这个最坏的情况下是好的,但是接下来说实际的FAA(使用他们高质量的仪器)显示GPS读数通常是好的在一米之内。

所以你必须问自己两个问题:1)你的价值观来源是什么? 2)数据将用于什么?

手机不是特别准确,Google / MapQuest的读数可能只有4或5位小数。 高质量的GPS仪器可能会让你6(在美国境内)。 但是捕获更多的东西是浪费打字和存储空间。 此外,如果对这些值进行了任何search,那么对于用户来说,知道6应该是他/她应该查找的最多(显然,任何input的search值应该先被四舍五入以与search的数据值相同的准确度)。

此外,如果您只想在Google地图中查看某个位置,或者将其放置在GPS中,则有四五个就够了。

我不得不嘲笑在这里input所有这些数字的人。 他们究竟在哪里进行测量? 前门把手? 邮箱在前面? build筑中心? 手机塔顶? 而且…每个人都一直在同一个地方吗?

作为一个好的数据库devise,我会接受来自用户的数值,可能只有五个十进制数字,然后四舍五入为了一致性[也许六个,如果你的仪器是好的,你的最终使用保证]。

每个纬度之间的距离因为地球的形状而变化,每个经度之间的距离越小,越接近极点。 那么我们来谈谈赤道,纬度为110.574km,经度为111.320km。

50英尺是0.01524km,所以:

  • 0.01524 / 110.574 = 1/7255的纬度
  • 0.01524 / 111.320 = 1/7304的经度

你需要四位数的刻度,足够下降到万分之一度,总共有七位数的精度。

DECIMAL(7,4)应该足够您的需求。

不要存储浮点值。 虽然你可能认为他们是准确的,但他们不是。 这是一个近似值。 事实certificate,不同的语言有不同的“parsing”浮点信息的方法。 而不同的数据库有不同的实现价值近似的方法。

相反,使用geohash 。 这是BY FAR以一致的方式对经度/纬度信息进行编码/解码的高级方法。 通过从不“序列化”经度/纬度的近似浮点值到数据库列中,相反,使用geohash,您将获得令人满意的往返一致性,从而保证您使用string值。 这个网站很棒,可以帮助你看到一个geohash。