我在数据库中应该存储多少个有效数字来表示GPS坐标?
在这个问题中,出现的原因是作者想知道存储在数据库中的GPS坐标应该保留多少个有效数字。他提到以前在军事合同下进行地理信息系统(GIS)工作时,使用了小数点后六位的精度,这已经足够了。
然而,他指出精度的选择取决于需要多么准确。他解释说,小数点后六位的精度可以达到大约正负1米的准确度,这在追踪装满化学武器的堡垒时非常重要。
作者提到,他需要适应整个字段的大小,经度可为正负xxx.xxxxxx,纬度可为正负xx.xxxxxx。
然后,他提到这是一个房地产应用程序,他们希望存储房屋的位置。所以,精度不需要像正负1米那么准确,正负10米可能是可以接受的。
接下来,作者询问对于decimal(9,5)这样的精度会有多少准确度,或者他可以在哪里找到这些信息。
有人指出正负10米的误差在地图上可能会导致房屋显示在街道中间。
另外一个人提供了一个链接,表明只需要五个数字就能达到1米的准确度。
最后,有人建议确保所有地理空间数据使用相同的投影/基准信息,因为不同的投影/基准参数可能会导致数据不准确。
对于最后一个问题,有人认为对于终端用户来说,标记显示在街道中间是否是一个问题并不重要,因为他们会四处寻找房屋。相比于渲染时多出来的几秒钟,这些不必要的数字可能对终端用户更重要。
这篇文章讨论了在存储GPS坐标时应该选择多少个有效数字的问题,并提供了不同的观点和解决方法。
在存储GPS坐标到数据库时,需要考虑到测量的准确性。一般来说:
- 保留6位小数可以表示约10厘米的准确度
- 保留7位小数可以表示约1厘米的准确度
- 保留13位小数可以表示原子结构的准确度
因此,除非进行非常精确的研究,例如构造板块运动的研究,一般情况下保留6位小数就足够了。
根据GIS堆栈溢出网站上whuber的完整回答,我们可以了解到:
准确性是指测量结果与真实值一致的倾向。而精度是指测量结果能够确定一个实际值的程度。这个问题涉及到准确性和精度的相互影响。
通常情况下,记录测量结果时,不需要比测量结果本身更高的精度。使用过多的精度可能会误导人们对准确性的理解。
根据米制单位的定义,从赤道到极点有一亿米,即90度,所以一度纬度大约等于10^7/90 = 111,111米。(当然,米的长度在此期间有所变化,但这并不重要。)此外,经度(东西方向)的长度大约与纬度相同或更小,因为从赤道向两极移动时,纬度圈会缩小到地球的轴线附近。因此,可以认为在一个十进制度数的第六位小数点后面有111,111/10^6 = 约1/9米 = 约4英寸的精度。
因此,如果您的准确性要求是10米左右,那么1/9米几乎可以忽略不计:使用六位小数点几乎不会影响准确性。如果您的准确性要求是亚厘米级别,那么至少需要七位甚至八位小数,但更多的小数位数对您几乎没有好处。
十三位小数可以确定位置到111,111/10^13 = 约1个埃,约为一个小原子的一半厚度。
根据这些想法,我们可以构建一张关于十进制度数中每个数字代表的表格:
- 符号告诉我们我们是在北半球还是南半球、东半球还是西半球。
- 非零的百位数告诉我们我们正在使用的是经度,而不是纬度!
- 十位数可以确定到约1000公里的位置。它可以告诉我们自己所在的大洲或大洋。
- 个位数(一位小数度)可以确定到111公里(60海里,约69英里)的位置。它可以大致告诉我们自己所在的大州或国家。
- 第一个小数位可以确定到11.1公里:可以将一个大城市的位置与相邻的大城市区分开来。
- 第二个小数位可以确定到1.1公里:可以将一个村庄与下一个村庄区分开来。
- 第三个小数位可以确定到110米:可以识别出一个大农田或机构园区。
- 第四个小数位可以确定到11米:可以识别一个地块。这个精度与没有干扰的GPS装置的典型精度相当。
- 第五个小数位可以确定到1.1米:可以将树与树区分开来。商用GPS装置只有通过差分校正才能达到这个级别的准确性。
- 第六个小数位可以确定到0.11米:可以用于详细规划结构、设计景观、修建道路。这对于追踪冰川和河流的运动应该足够了。通过采用GPS等仔细的措施,如差分校正的GPS,可以实现这个精度。
- 第七个小数位可以确定到11毫米:这对于大部分测量工作来说是足够的,接近了基于GPS技术能够达到的极限。
- 第八个小数位可以确定到1.1毫米:这对于制图构造板块运动和火山活动非常有用。永久、校正、持续运行的GPS基站可能能够达到这个精度。
- 第九个小数位可以确定到110微米:我们进入了显微镜的范围。对于几乎所有地球位置的应用来说,这都是过度精确的,比任何测量设备的精确度都要高。
十位或更多小数位意味着使用了计算机或计算器,并且没有注意到额外的小数位是没有意义的。所以要小心,因为除非你是从设备上读取这些数字,否则这可能表明处理质量较低!
在存储GPS坐标时,需要考虑到数据的精度和位数。一般情况下,WGS84坐标使用十进制表示,并且通常保留5位小数。例如,纬度范围为-90到+90,可以使用decimal(7, 5)来表示(-90.00000到90.00000),经度可以使用decimal(8, 5)来表示(-180.00000到180.00000)。
小数点后的第五位(即.00001)的精度在赤道附近大约为一米。
DECIMAL/NUMERIC数据类型是一个固定精度的缩放整数,正负范围始终可用,不影响精度或缩放(显然需要存储空间,但对于DECIMAL来说,你没有选择)。
符号(正/负)在数据库中占用空间吗?也就是说,“-90.12345”占用的是8个数字而不是7个?
是的,在数据库中需要占用空间,但给定DECIMAL规范的数据库中始终允许有一个符号。我不熟悉MySQL的内部存储要求,但对于SQL Server来说,一个decimal类型占用5个字节(1-9位数字)/9个字节(10-19位数字)/13个字节(20-28位数字)/17个字节(29-38位数字),具体取决于指定的精度(与缩放无关,显然)。
Google地图使用6位小数。在地图上放大到你家,右键点击它,然后选择“Center on this position”。在地图的左上方,找到位于地图外部的链接按钮,然后在链接URL中找到GPS坐标。当我尝试时,它是6位小数。
如果你的数据源始终提供6位小数的精度,那么使用接受精度规范的字段是可以的。但是,注意不要存储低于指定精度的数据源。如果你的数据源提供了低精度数据,比如“.5872”,并且你将其存储在具有6位小数精度的字段中,你将得到“.587200”,看起来像是高精度数字。如果你的数据源具有不同的精度级别,请将其存储在字符字段中。