对于 GPS 坐标,我应该在数据库中存储多少位有效数字?

Posted

技术标签:

【中文标题】对于 GPS 坐标,我应该在数据库中存储多少位有效数字?【英文标题】:How many significant digits should I store in my database for a GPS coordinate? 【发布时间】:2009-12-22 16:29:19 【问题描述】:

我的 mysql 数据库中有经度和纬度坐标(GPS 数据)。

目前存储为:

column     type
------------------------
geolat     decimal(10,6)
geolng     decimal(10,6)

问题:我真的需要像decimal(10,6) 这样大的数据类型来正确存储坐标数据吗?

由于我有一个经度和纬度的组合索引,所以这个索引大小很大。如果我可以在不影响任何东西的情况下将其缩小,那就太好了。

【问题讨论】:

另外,我确实意识到 MySQL 有一个 SPATIAL 插件 - 但不幸的是我的虚拟主机没有安装它,所以这不是一个选项(以防有人推荐它) 欢迎来到 ***!第一个问题很好。 别忘了,您还需要知道地理坐标系,否则您的纬度/经度值将毫无用处。目前大多数 GPS 设备都会在 WGS84 中为您提供答案,但您可能应该在保存数据之前确认数据。 What is the ideal data type to use when storing latitude / longitudes in a MySQL database? 的可能重复项 另见***.com/a/55600320/1766831 【参考方案1】:

WGS84 数据通常以完全十进制表示法的坐标形式给出,通常有 5 个小数位,因此对于纬度(-90 到 +90),您可以使用小数(7, 5)(-90.00000 到 90.00000),对于经度,您可以使用 decimal(8, 5)(-180.00000 到 180.00000)。

.00001 gives an precision of around a meter at the equator

DECIMAL/NUMERIC data type is a fixed precision scaled integer 以及范围的正负部分始终可用 - 它们不会影响精度或比例(显然需要存储空间,但对于 DECIMAL,您没有选择余地)

【讨论】:

符号(正/负)不占空间吗?意思是,“-90.12345”不会占用 8 个数字而不是 7 是的,它占用了数据库中的空间,但是对于给定的 DECIMAL 规范,数据库中所需的空间始终允许使用符号。我不熟悉 MySQL 的内部存储要求,但是对于 SQL Server,小数需要 5 字节(1-9 位)/9 字节(10-19 位)/13 字节(20-28 位)/17 字节(29-38 位)取决于指定的精度位数(显然,它与比例无关)。 Google 地图使用小数点后 6 位。放大你的房子,在地图上右键单击它,然后选择“居中”。单击地图外左上方的链接按钮,然后在链接 URL 中找到 GPS 坐标。我试过时是小数点后 6 位。 如果您的来源始终为您提供 6 个小数位的精度,那么您可以使用接受精度规范的字段。但是,请小心从精度低于您指定的源存储。我您的来源为您提供了像“.5872”这样的低精度数据,并且您将其存储在具有 6 个小数位的精度字段中,您将得到“.587200”,它看起来像一个高精度数字。如果您的来源具有不同级别的精度,请将其存储在字符字段中。【参考方案2】:

这取决于您进行的调查的准确性。一般来说:

小数点后 6 位表示精确度约为 10 cm 约 1 厘米的小数点后 7 位 小数点后 13 位 - 原子结构的准确度...

因此,除非非常精确的研究,即构造板块运动,使用 6 位数字就足够了。


这是full answer from whuber (GIS stack overflow):的副本

准确度是您的测量值与真实值一致的趋势。 精度是您的测量确定实际值的程度。问题是关于准确性和精确度的相互作用。

作为一般原则,您在记录测量值时不需要比内置的精度更高的精度。使用过多的精确度会误导人们认为精确度高于实际值。

一般来说,当您降低精度(即使用较少的小数位)时,您可能会损失一些准确性。但是多少钱?很高兴知道米最初是由法国人定义的(大约在他们革命时期,当时他们正在抛弃旧系统并热心地用新系统取代它们),因此其中一千万个将带你从赤道到一根杆子。那是 90 度,所以 1 度的纬度覆盖大约 10^7/90 = 111,111 米。 (“大约”,因为米的长度在此期间发生了一点变化。但这没关系。)此外,经度(东西)的长度与纬度的长度大致相同或更少,因为当我们从赤道向任一极移动时,纬度圈会缩小到地轴。因此,可以肯定的是,一个十进制度的小数点后六位有 111,111/10^6 = 大约 1/9 米 = 大约 4 英寸的精度。

因此,如果您的准确度需求是 10 米或 10 米,那么 1/9 米就不算什么:使用小数点后六位基本上不会失去准确度。如果您需要亚厘米以下的精度,那么您至少需要 7 个小数位,可能还有 8 个小数位,但多一点对您没有什么好处。

小数点后 13 位将位置确定为 111,111/10^13 = 大约 1 埃,大约是小原子厚度的一半。

使用这些想法,我们可以构建一个十进制度中每个数字表示的表格:

标志告诉我们我们是在北方还是南方,东方还是西方 地球。 一个非零百位告诉我们我们使用的是经度,而不是纬度! 十位数字给出了大约 1,000 公里的位置。它为我们提供了有关我们所在的大陆或海洋的有用信息。 个位(十进制度数)给出的位置最大为 111 公里(60 海里,约 69 英里)。它可以告诉我们 大致是我们在哪个州或国家。 第一个小数位的价值高达11.1公里:它可以区分一个人的位置 来自邻近大城市的大城市。 第二个小数位是 价值高达 1.1 公里:它可以将一个村庄与下一个村庄分开。 该 小数点后三位最高可达 110 m:它可以识别一个大 农业领域或机构校园。 第四位小数位 价值高达 11 m:它可以识别一块土地。这是 与未经校正的 GPS 单元的典型精度相当 干涉。 小数点后五位的值最高为 1.1 m:它 区分树木。精度达到这个水平 商业 GPS 单元只能通过差分来实现 更正。 小数点后六位的值最大为 0.11 m:您可以 使用它来详细布置结构,用于设计 景观,修路。它应该足够好 跟踪冰川和河流的运动。这可以通过 用GPS采取艰苦的措施,例如差分 修正 GPS。 第 7 位小数 的值最大为 11 毫米:这个 适合大量测量,并且接近基于 GPS 的极限 技术可以实现。 小数点后八位的值最高为 1.1 mm:这对于绘制构造板块的运动和 火山的运动。永久、校正、持续运行的 GPS 基站可能能够达到这种精度水平。 该 小数点后第九位 最高可达 110 微米:我们正在进入 显微镜的范围。对于几乎任何可以想象的应用 地球位置,这是矫枉过正,将比 任何测量设备的准确性。 十位或更多小数位 表示使用了计算机或计算器,并且没有引起注意 支付额外的小数是无用的事实。当心, 因为除非你是从设备上读取这些数字的人, 这可能表明处理质量低下!

【讨论】:

【参考方案3】:

我一直使用小数点后六位数。我曾经根据军事合同从事 GIS 工作,这就足够了。

【讨论】:

那么,你是说我可以把它改成“decimal(6,6)”就行了? 但正如 Jonathan 所说,这确实取决于您想要的精确度。据我了解,六位数的精度使我们下降到大约 +/- 1 米。这很重要,因为我们一直在追踪装满化学武器的掩体。 我相信“10”是整个字段的大小,不是吗?您需要适应 +/- xxx.xxxxxx 的经度和 +/- xx.xxxxxx 的纬度。 这是一个房地产应用程序,我们要在其中存储您的房屋/房屋的位置。所以它不需要精确到 +/- 1 米。 +/- 10 米之类的东西可能是可以接受的 +/- 10 米相当大 - 大约 65 英尺 - 在地图上渲染时,您可能会发现您的房子出现在街道中间。【参考方案4】:

请记住,减少数据比增加数据更容易。通常,如果不重新测量,甚至不可能提高数据准确性。重新测量是有代价的。对您的情况或行业一无所知,我会说尽可能多地捕获数据/特异性。

您实际使用的数据可以从这个集合中挑选出来。如果您最终需要更高程度的特异性,您可以随时重新计算而无需重新测量。

另外,我不确定索引原始数据是否是最好的做法,因为它不是一组离散的元素。创建一个包含不太准确/较小数据点的表会使索引变得更小。

【讨论】:

总是在考虑存储数据时会问这样的问题:它将用于什么?实现这一点需要什么精度/范围/什么?【参考方案5】:

如果这是用于房地产,你真的有这么多房子,每行节省 2 个字节会那么明显吗?除非有充分的理由不这样做,否则我会尽可能保持精确。

【讨论】:

我更关心索引的大小,因为我有一个经度和纬度的组合索引。所以现在,我的索引大小是小数(10,6)+小数(10,6)。这对于索引来说非常大。 本打算使用空间索引进行回复 - 但注意到您的评论说您无法使用它,因此您会遇到这些问题。【参考方案6】:

这取决于您希望定位的精确度。显然,越大越精确,越小,您的结果就会越广泛。我建议保持你的值更大,因为无论如何它并不是太多的数据。

【讨论】:

这仅用于存储房屋/家庭位置的地理数据(房地产应用程序)。所以它不需要非常准确但很接近。【参考方案7】:

NMEA Lat/lon 输出中的常规 GGA 句子只有 3 个小数位,赤道分辨率约为 10m。有些品牌会添加一个自定义的额外数字来表示 1m。

4 位 deg.mm mm/1000 也很常见。

如果您使用的是高端精度 RTK-GPS,您可能需要更多位置来获得毫米精度

【讨论】:

【参考方案8】:

您还可以尝试以不同的单位存储(和/或使用)您的坐标。我从事的一个项目,我们所有的坐标都以毫秒为单位存储为长整数(可能是整数,已经有几年了)。这部分是为了速度和存储空间(这是一个嵌入式系统)。但同样的逻辑也适用于此。

【讨论】:

【参考方案9】:

如果所有坐标都在特定区域,请固定某个中心点(即平均当前点并四舍五入以获得可以大声说出的数字),然后将坐标存储为相对于该点的坐标。这样,您可能可以跳过前 2-4 个最重要的数字,从而节省大量资金。但请记住仅通过返回真正 WGS84 坐标的类或视图来处理这些数据。

【讨论】:

以上是关于对于 GPS 坐标,我应该在数据库中存储多少位有效数字?的主要内容,如果未能解决你的问题,请参考以下文章

在django中计算附近的gps坐标

手持GPS西安80坐标系参数

如何在 mysql 中存储 gps 坐标,然后在没有时间延迟的情况下检索它?

基于与给定点的距离的最近 GPS 坐标

MongoDB架构:GPS位置的默认坐标

iOS Swift将GPS坐标存储到数组中