我在这里读到这个问题:
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英尺内准确,我需要存储多少小数点?
也许一个更好的问题实际上是一个非编程问题,但它会是:每个小数点给你多少准确?
这很简单吗?
答案 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
答案 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公里,所以:
你需要四位数的刻度,足以达到千分之一度,总共七位精度。
DECIMAL(7,4)
应该足以满足您的需求。
答案 4 :(得分:3)
不要存储浮点值。虽然你可能认为它们是准确的,但事实并非如此。它们是近似值。事实证明,不同的语言有不同的解析方法"浮点信息。不同的数据库有不同的方法来实现值近似值。
相反,请使用Geohash。 This 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