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


103

我在这里阅读这个问题:

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

似乎普遍的共识是使用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 = 0.6英里
  7. 等等?

7
坐标的精度取决于这些坐标所在的位置,因为行星表面不是一个完美的球体,并且距两极的距离也是主要因素。不过,平均小数点后三位大约是120米/ 400英尺。4个小数将是12米/ 40英尺,等等...
Marc B

1
查看GIS stackexchange这样一个问题:gis.stackexchange.com/questions/8650/...
Flimm

Answers:


191

赤道精度与小数位的关系

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


4
如果这些都在赤道,那是否意味着这些是最坏情况的错误?
Liath 2014年

6
实际上,赤道是最好的情况。在赤道处,一个纬度和一个经度的大小相同(69英里),但是当接近两个极点时,一个经度缩小为零。这里是一个非常不错的解释:nationalatlas.gov/articles/mapping/a_latlong.html#four
codingoutloud

11
@codingoutloud这将导致这些最坏情况的错误。或者要学究,这些是在海平面上使用经/纬度时最差的错误。在海拔6,378 m处,误差增加了0.1%。
Scott B

@codingoutload:该链接显然不再存在:(
Tom Stambaugh


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

如果要50英尺(15m)精度,请输入4位数字。所以decimal(9,6)


9
如果您使用的是SQL Server ...值得注意的是1-9的精度使用5个字节。因此,您最好使用小数(9,6)代替小数(7,4),并利用较高的精度,因为它们都占用相同的空间量。
2013年

对于纬度,使用(8,6)(或(6,4)保存保存一个字节(在MySQL)。
里克·詹姆斯

15

我设计数据库,并且已经研究了一段时间。我们使用带有Oracle后端的现成应用程序,其中数据字段被定义为允许小数点后17位。荒谬!那是千分之一英寸。世界上没有GPS仪器如此精确。因此,让我们将17个小数位放在一边并加以处理。政府保证其系统对“最坏情况”的伪距精度达到7.8米,置信度为95%时是好的”,但是接着说,实际的FAA(使用其高质量的仪器)显示出GPS读数通常对一米之内。

因此,您必须问自己两个问题:1)您的价值观的根源是什么?2)数据将用于什么?

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

此外,如果您要做的就是在Google地图中查看位置或将其放入GPS中,那么四到五个就足够了。

我不得不嘲笑这里周围的人输入所有这些数字。他们到底在哪里测量?前门把手?邮箱在前吗?建筑中心?细胞塔的顶部?AND ...每个人都始终如一地在同一地方服用吗?

作为一个好的数据库设计,我会接受用户的值,可能会超过五个十进制数字,然后四舍五入并仅捕获五个以保持一致性(如果您的仪器很好并且最终使用可以保证,则为六个)。


4
我同意17位数字过多,但我建议如果要对数据进行后处理,则6位数字太少。在执行半径查询(“在此点的0.5英里半径内回答要素”)之类的操作时,错误(包括截断)会被放大。如果在这样的查询的输出中需要6个十进制数字,则输入应以更多的数字开头。我们的商店倾向于使用DECIMAL(18,15)。我们的目标是确保分贝不是空间计算准确性的限制因素。
汤姆·斯坦博

超过小数点后六位是当今GPS卫星无法提供的精度。后处理不会引入大量错误。 DECIMAL(18,15)占用9个字节。
瑞克·詹姆斯

11

每个纬度之间的距离因地球的形状而异,并且随着您靠近两极,每个经度之间的距离也会变小。因此,我们来谈谈赤道,纬度在每个度之间距离是110.574 km,经度在111.320 km。

50ft是0.01524km,因此:

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

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

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


5

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

   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


3

不要存储浮点值。尽管您可能会认为它们是准确的,但事实并非如此。它们是一个近似值。事实证明,不同的语言具有“解析”浮点信息的不同方法。不同的数据库具有不同的实现值近似的方法。

相反,请使用Geohash该视频介绍并在5分钟内直观地解释了Geohash。Geohash是BY FAR的一种上乘方式,以一致的方式对经度/纬度信息进行编码/解码。通过永不将经度/纬度的近似浮点值“序列化”到数据库列中,而是使用Geohash,您将获得与String值相同的期望的往返一致性保证。该网站非常适合帮助您使用Geohash。


FLOAT并且DOUBLE在这种情况下,不从一些你所描述的问题的影响。
瑞克·詹姆斯

@RickJames您没有充分指定“此上下文”。如果您的意思是,严格来说是在两个DB列中存储一个值,那么也许。但是,给定的值不只是位于未使用的DB列中,而是隐式假设将针对这些值编写(接近)查询。因此,保持这个相当实际的假设意味着继续存在所有不可靠近似的问题。
chaotic3quilibrium

1
如果一个FLOAT值和“下一个”值彼此非常接近,以至于您无法将一个城市(或车辆,人或跳蚤)与另一个城市区分开,那么四舍五入和表示错误就无关紧要。同时,将两个FLOATsDOUBLEs或近似值DECIMALs)与'=' 进行比较几乎是愚蠢的。
瑞克·詹姆斯

您似乎错过了要点。如果未明确查询,则任何尝试查询都将隐式使用等于。并且这假定您没有使用其他带有值的层和语言,严格将其保留在SQL Server中。这是Microsoft针对SQL Server的官方回复:blogs.msdn.microsoft.com/qingsongyao/2009/11/14/…–
chaotic3quilibrium

抱歉,我以为该问题被标记了[mysql],而不是SQL Server。
瑞克·詹姆斯

2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.