任何人都不会知道最有效的代表权纬度/经度坐标?精确水平应该足以满足消费者的GPS设备。

大多数实施似乎使用 double 对于每一单元,但我怀疑这个 float 或固定点的格式应该是足够的。我会想听到任何人试图压缩和或储存大阵列的这些价值观。

编辑:

换句话说,什么是最低精确度要求表示纬度/经度一消费水平的设备?

有帮助吗?

解决方案

我个人会使用的一个32位小数的固定点的表示,除1,000,000个为每埃文的答案,我的评论意见。

但是,如果空间是真正的溢价,这里有一些额外的想法:

  • 你可以使用的26位的固定点表示在电线上。这将需要调集和解组的纬度和经度变成一个大的字节阵列,但会救你的12位的每个位置的32位的价值表示,几乎有19%的节约,因此它可能是值得的。

  • 你可以利用的事实,即经价值观需要较少的精确度作为你接近极的-他们只需要26位价值在赤道。所以你可以写一个方案,其中使用的位数编码的纬度上取决于价值的纬度。

  • 如果你的数据有其他可压缩的特性-也就是说,所有的点通常都很靠近在一起-你可能需要特定的优势的那些,如使用三角洲的编码方案(其中每一点比其他第一编码可作为一个三角从最后一点)。

其他提示

地球的周长约为。 40.000公里或24900英里。

你需要一米精度(3英尺)才能将gps精度提高一个数量级。

因此,您需要精确度来存储40.000.000个不同的值。这至少是26位信息。 32位浮点数或整数将很好。

编辑:在评论中添加了一些点,32位值应该能够提供足够的精度。

我会使用32位定点表示法。如果值是:

42.915512-99.521654我会将values * 100000存储在 int32_t中(它们可能是否定的)。

int32_t lat = 42915512;
int32_t lon = -99521654;

这是简单和准确之间的良好折衷( 5 小数点通常足够好,如果需要,您可以随时将其提升到1000000以获得6)。

要向用户显示,请执行 caf 建议:

  

...向用户显示 - 使用整数   除以模数,例如printf("Lat = %d.%06d\n", lat / 1000000, abs(lat) % 1000000)

由于将保留相对排序,因此这些也将具有可比性/可排序性。

编辑:另一个好处是它可以通过网络发送或以便携方式以二进制格式存储到磁盘。

即使消费级GPS设备具有接近其声称准确度的任何地方,浮动也足以存储GPS坐标。如果您不相信这是真的,请尝试以下两个简单的实验:

  1. 将两个或更多GPS设备带到某个地方的某个地点,然后记下每个设备测量的坐标。回到里面并在地图上绘制每个设备的点数(我认为谷歌有一些能为你做这件事)。你会惊讶于这些点有多远(尽管它们都应该测量完全相同的位置)。
  2. 拿你的(据称)最准确的设备,把它放在可以获得卫星定位但不会下雨的地方,并记录几天内进行的一系列测量。绘制所有读数(如#1)。再一次,你会惊讶于这些点(应该都是相同或几乎相同)在整个地图上徘徊,有时会长达几百英尺。
  3. 我多年来一直在为支持GPS的PDA编写应用程序,我已经一次又一次地为可疑客户验证了这一点(我甚至以这种方式赢得了赌注)。有更高质量的GPS设备可以达到比这更好的精度,但更昂贵的芯片组可以获得更好的精度,并且设备可以在一个地方放置数天甚至数周,读数平均随时间变化。 / p>

    四字节浮点数比设备本身更准确。只要2X因素对你来说不是问题,那当然不会伤害你使用双倍。

经度为179度的23位精度可提供10米以下的精度,这是普通GPS设备所能提供的最佳精度。在赤道上:

% gps distance "0.0, 179.0" "0.0, $((179 * (1 + 2**-23)))"
From 0.0, 179.0 to 0.0, 179.00002133846283 is 7.79 feet E
From 0.0, 179.0 to 0.0, 179.00002133846283 is 2.38 meters E

因此,C编译器称为float的IEEE 754单精度浮点数仅适用于表示。小心使用浮动进行扩展计算!舍入错误可能会吃掉你的午餐。咨询数值分析师。

在Garmin的IMG地图格式中,他们使用浮动将坐标存储在边界框内,以设置框的边缘。方框内的坐标使用可变数量的位来定义,这些位在最小值和最大值之间是线性的,具体取决于所需的精度。

例如: minlat = 49.0,maxlat = 50.0,minlon = 122.0,maxlon = 123.0,位数= 16
点击 所以价值:
32768,32768将转换为49.5,122.5
16384,0将是49.25,122.0
点击 如果您需要较少的精度,可以使用多个位= 4
生成相同的输出 8,8将转换为49.5,122.5
4,0将是49.25,122.0

如果要存储这些值的大型数组,如果进行增量压缩,存在一些简单的技巧,并且存储增量,则可以大大减小数据流的大小。 您可以从<!>“关键点<!>”

进行增量

K D D D D D D D D D D D D D D D ...

k + d让你到任何一点

增量都引用了之前的K,所以要重建任何一点,你需要一个K和一个D

或者你可以做实力增值

K I I I I I I I I I I I K K

这可能需要多次总和才能到达所需的位置。但整体数据较小。所以重建

k + i + i + i到达第4点

最后你可以将两者结合起来

K D I I I D I I I I I I I I K K

这就像带有IPB帧的mpeg-2,但这样你就不会超过任何位置的4个总和,并且你可以获得Delta和Incrimental Compression的一些好处。

您可以在单个32位整数中打包纬度和经度值,分辨率最差为~2.4米/像素(在赤道处)你使用递归的平铺系统。每级使用两位,可以以32位存储16个级别。您可以了解一下如何查看有关 Virtual Earth的平铺的文章系统。这使用墨卡托,所以它会给你两极的问题。您可以使用不同的投影,但仍会得到非常相似的结果。

这也可以用于粗滤波器来查找给定父图块中的任何点,因为前N位将是相同的(因此搜索变为位屏蔽)。

假设地球是一个完美的球体(它不是,但足够接近),半径<!>#8216; R <!>#8217; 3959英里(或<!>#215; 5280英尺/英里= 20903520英尺),周长为131340690英尺(使用2 <!>#215; PI <!>#215; R)。

经度360度,涵盖131340690英尺。 180度纬度覆盖65670345英尺。

如果要将lat / lng存储到3英尺的精度,则需要能够存储43780230(131340690/3)经度值和21890115(65670345/3)纬度值。 43780230需要25.38位(log(43780230)/ log(2))来存储,而21890115需要24.38位(log(21890115)/ log(2))来存储<!>#8211;或者只是不到50位(或6.25字节)。

所以显而易见的问题是,如果你想用6个字节存储纬度和经度,准确度是多少?那么,6个字节是48位。这意味着纬度为23.5位,经度为24.5位(经度值为两倍,只有一位,24.5-23.5 = 1位)。因此,23.5位允许您表示0到11863282之间的数字(11863283值)。 65670345英尺除以11863283值为5.53英尺(经度相同的精度值)。

底线:那么,如果您能够以5.5英尺的精度生活在纬度和经度上,那么您可以将这两个值打包成六个字节。

*侧面注意:关于纬度和经度对于在球体周围存储位置信息非常糟糕的评论(因为存储在极点的信息较少)<!>#8211;好吧,那些评论不是为了数学!让<!>#8217; s搞清楚。让我们想要设计一个新的完美系统,它可以在地球每一平方英尺的中心记录并放置地面。地球表面积(R为3959英里;球体表面积公式)为5490965469267303 SQ FT <!>#8211;许多赌注需要52.29位代表。现在,现有的纬度和经度系统使用矩形系统。矩形的宽度是地球的圆周,矩形的高度是圆周的1/2。<!>#8211;这是131340690 * 65670345(见上文),或8625188424838050 SQ FT <!>#8211;这需要52.94位来代表(这个系统放置<!>#8216;太多<!>#8217;在两极附近的地面赌注)。因此,令人震惊的答案是,新的完美系统和旧的lat / lng系统都需要53个实际位来存储地球上的单个位置,精度低至1英尺!

我很惊讶没有人发布这样的事实:长/拉是一种在球体上存储数据的可怕方式(有人确实提到经度在极点附近需要较低的精度)。

基本上,您可以将数据位置存储为X和Y坐标(以米为单位)。想象一下,地球周围的立方体非常适合(哈哈,几乎适合它)。你只需要存储X和Y位置,而不是所有3个共同点,因为3-rd co-ord可以来自地球的redius,r =平方根[x ^ 2 + y ^ 2 + z ^ 2]

因此将lat / long转换为x / y(以米为单位)。每个合作只需要12756200m(即地球的直径)。所以你的总价值只需要0到25,512,400(其他人声称40,000,000,因为他们使用长/纬度)精确到+/- 0.5米。

这将导致每个位置仅25位。如果我是你,我会在2米内完成精度,每个位置使用24位,因为这是一个整齐的3个字节。

此外,如果要在路径上存储路点信息,则可以将每个路点存储为距离最后一个路点的偏移量。就像24位x / y合作开始一样。然后进行16位'更新',通过添加/减去x / y米来调整位置。 16bit将允许航点更新超过400米。因此,如果您知道该设备不是经常用于飞机和更新,那么这也是可以接受的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top