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

Cit*_*zen 93 mysql geolocation

我在这里读到这个问题:

在SQL数据库中存储纬度和经度数据时要使用的数据类型是什么?

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

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

"lat": 37.4219720,
"lng": -122.0841430
Run Code Online (Sandbox Code Playgroud)

超出-122.0841430,我需要多少位数?我已经阅读了几本指南,但我无法从中得到足够的理解来解决这个问题.

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

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

这很简单吗?

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

小智 174

赤道的准确度与小数位数

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
Run Code Online (Sandbox Code Playgroud)

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

  • @codingoutloud哪会出现这些最坏的情况.或者说是迂腐,这些是在海平面使用纬度/经度的最坏情况误差.在海拔6,378米处,误差增加0.1%. (10认同)
  • 实际上,赤道是最好的情况.一个纬度和一个经度在赤道(69英里)处大小相同,但当接近任一极点时,一度经度收缩到零.这是一个非常好的解释:http://nationalatlas.gov/articles/mapping/a_latlong.html#four (6认同)
  • 如果这些是在赤道,这是否意味着这些是最坏的情况错误? (4认同)

Gus*_*tav 19

+----------------+-------------+
|    Decimals    |  Precision  |
+----------------+-------------+
|    5           |  1m         |
|    4           |  11m        |
|    3           |  111m       |
+----------------+-------------+
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你正在使用SQL Server ......值得注意的是1-9的精度使用5个字节.所以你可能会使用小数(9,6)代替小数(7,4)并利用更高的精度,因为它们都占用相同的空间量. (8认同)

小智 15

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

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

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

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

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

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

  • 虽然我同意17位数字太多,但我建议如果数据将被后处理,则6太少.在执行半径查询("在此点0.5英里范围内回答要素")时,错误(包括截断)会被放大.如果在这样的查询的输出上需要6个十进制数字,那么*input*应该从更多开始.我们的商店倾向于使用DECIMAL(18,15).我们的目标是确保数据库不是空间计算准确性的限制因素. (3认同)
  • 超出小数点后 6 位就超出了当今 GPS 卫星的可用精度。后处理不会引入大量错误。`DECIMAL(18,15)` 占用 9 个字节。 (2认同)

Bil*_*win 11

每个纬度之间的距离因地球的形状而变化,每个经度之间的距离随着靠近极点而变小.那么让我们来谈谈赤道,其中每个度数之间距离为纬度110.574千米,经度111.320千米.

50英尺是0.01524公里,所以:

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

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

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


Ric*_*mes 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
Run Code Online (Sandbox Code Playgroud)

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