我应该准确存储纬度和经度吗?

时间:2011-08-23 21:12:07

标签: mysql geolocation

我在这里读到这个问题:

What datatype to use when storing latitude and longitude data in SQL databases?

似乎普遍的共识是使用Decimal(9,6)是要走的路。对我而言,问题是,我真的需要这么准确吗?

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

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

在-122.0841430之外,我需要多少位数?我已经阅读了几本指南,但我无法从中得到充分的理解。

在我的问题中更准确一点:如果我想在距离确切位置50英尺内准确,我需要存储多少小数点?

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

这很简单吗?

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

7 个答案:

答案 0 :(得分:163)

赤道的准确度与小数位数

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

参考:https://en.wikipedia.org/wiki/Decimal_degrees#Precision

答案 1 :(得分:18)

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

如果您想要50英尺(15米)精度,请选择4位数。 所以decimal(9,6)

答案 2 :(得分:15)

我设计数据库并且已经研究了这个问题了一段时间。我们使用带有Oracle后端的现成应用程序,其中数据字段被定义为允许17个小数位。荒谬!这是千分之一英寸。世界上没有GPS仪器是那么准确。所以,让我们放下17位小数并处理实际问题。政府保证他们的制度适用于最坏的情况"伪距准确度为7.8米,置信水平为95%"但接着说实际FAA(使用他们的高质量仪器)显示GPS读数通常在一米之内。

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

手机不是特别准确,Google / MapQuest读数可能只有4或5位小数。高质量的GPS仪器可能会让你6(在美国境内)。但捕获更多不仅是浪费打字和存储空间。此外,如果对值进行了任何搜索,那么用户很容易知道6将是他/她应该寻找的最多(显然,输入的任何搜索值应首先四舍五入到与正在搜索的数据值。

此外,如果您要做的只是在Google地图中查看某个位置或将其放入GPS中,那么可以使用四到五个。

我不得不嘲笑这里的人输入所有这些数字。他们究竟在哪里进行测量?前门把手?邮箱在前面?建筑中心?细胞塔顶部? AND ...是不是每个人都一直把它放在同一个地方?

作为一个很好的数据库设计,我会接受来自用户的值,可能只有五位数以上的十进制数字,然后四舍五入,只捕获五个一致性[如果你的乐器很好并且你的最终使用保证它可能是六个]。

答案 3 :(得分:11)

每个纬度之间的距离因地球的形状而变化,每个经度之间的距离随着靠近极点而变小。那么让我们来谈谈赤道,其中distance between each degree的纬度为110.574公里,经度为111.320公里。

50英尺是0.01524公里,所以:

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

你需要四位数的刻度,足以达到千分之一度,总共七位精度。

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

答案 4 :(得分:3)

不要存储浮点值。虽然你可能认为它们是准确的,但事实并非如此。它们是近似值。事实证明,不同的语言有不同的解析方法"浮点信息。不同的数据库有不同的方法来实现值近似值。

相反,请使用GeohashThis video introduces and visually explains the Geohash in under 5 minutes. Geohash是BY FAR以一致的方式编码/解码经度/纬度信息的优越方式。从不"序列化"将经度/纬度的近似浮点值转换为数据库列,而使用Geohash,您将获得相同的理想往返一致性保证您获得String值。 This website is great for helping you play with a Geohash.

答案 5 :(得分:2)

如果您单击Google Maps上的位置,则可以得到经度和纬度,保留7位小数位

答案 6 :(得分:1)

考虑到球体的各个部分和对角线距离,下面是可用精度的表格:

   Datatype           Bytes       resolution
   ------------------ -----  --------------------------------
   Deg*100 (SMALLINT)     4  1570 m    1.0 mi  Cities
   DECIMAL(4,2)/(5,2)     5  1570 m    1.0 mi  Cities
   SMALLINT scaled        4   682 m    0.4 mi  Cities
   Deg*10000 (MEDIUMINT)  6    16 m     52 ft  Houses/Businesses
   DECIMAL(6,4)/(7,4)     7    16 m     52 ft  Houses/Businesses
   MEDIUMINT scaled       6   2.7 m    8.8 ft
   FLOAT                  8   1.7 m    5.6 ft
   DECIMAL(8,6)/(9,6)     9    16cm    1/2 ft  Friends in a mall
   Deg*10000000 (INT)     8    16mm    5/8 in  Marbles
   DOUBLE                16   3.5nm     ...    Fleas on a dog

- http://mysql.rjweb.org/doc.php/latlng#representation_choices