Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Latitude longitude 如何最有效地存储纬度和经度数据?_Latitude Longitude_Space Efficiency - Fatal编程技术网

Latitude longitude 如何最有效地存储纬度和经度数据?

Latitude longitude 如何最有效地存储纬度和经度数据?,latitude-longitude,space-efficiency,Latitude Longitude,Space Efficiency,这个问题来自给我的家庭作业。您可以使用以下三种格式之一作为存储系统的基础: DD MM SS.S DD MM.MMM DD.DD 您希望通过使用尽可能少的字节来最大化可以存储的数据量 我的解决方案基于第一种格式。我使用了3个字节表示纬度:8位表示DD(-90到90),6位表示MM(0-59),10位表示SS.S(0-59.9)。然后我使用25位表示经度:9位表示DDD(-180到180),6位表示MM,10位表示SS.S。这个解决方案不适合字节边界,但我认为下一次读取可以在上一次读取之后立即存储

这个问题来自给我的家庭作业。您可以使用以下三种格式之一作为存储系统的基础:

DD MM SS.S

DD MM.MMM

DD.DD

您希望通过使用尽可能少的字节来最大化可以存储的数据量

我的解决方案基于第一种格式。我使用了3个字节表示纬度:8位表示DD(-90到90),6位表示MM(0-59),10位表示SS.S(0-59.9)。然后我使用25位表示经度:9位表示DDD(-180到180),6位表示MM,10位表示SS.S。这个解决方案不适合字节边界,但我认为下一次读取可以在上一次读取之后立即存储,8次读取只需要49字节


我很好奇别人能想出什么办法。有没有更有效的方法来存储这些数据?值得注意的是,我考虑了基于偏移量的存储,但问题并没有说明读数之间的值可能会有多大变化,所以我假设任何变化都是可能的。

坚持现有技术:

如果您过去只存储DD.ddd数据,则可以节省大量空间,但您必须接受15,这意味着:存储的坐标可能不精确,但与原始值存在偏移

这是由于浮点数的存储方式,本质上是:一个标准化的有效值乘以一个指数得到一个数字,而不是仅仅存储一个值(如整数,即您为解决方案计算数字的方式)

下一个最高的常用浮点数机制使用32位(在许多编程语言中为“float”类型)——仍然有效,但比自定义格式大


但是,如果您也要设计自己的自定义浮点类型,并逐渐添加更多的位,那么结果将更加精确,并且仍然比您最初找到的解决方案更有效。只需使用有效位数和指数位数,了解fp近似值与期望结果的接近程度(以度为单位)

您建议的方法不是最佳方法。您正在使用10位(1024个可能的值)来存储范围(0..599)内的值。这是浪费空间

如果要使用3个字节作为纬度,则应将范围[0,2^24-1]映射到范围[-90,90]。因此,每个2^24值表示180/2^24度,即0.086秒

如果你只需要0.1秒的精度,那么纬度需要23位,经度需要24位(精度为0.077秒)。总共是47位,而不是49位,精确度更高

我们能做得更好吗?

0.1秒精度所需的准确位数为log2(180*60*60*10*360*60*60*10)<46.256。这意味着您可以使用46256位(5782字节)来存储1000(lat,lon)对,但所涉及的数学运算将需要处理非常大的整数

我们能做得更好吗?


视情况而定。如果您的数据集具有浓度,则可以使用较少的位,仅存储一些点以及与这些点的相对距离。应该使用聚类算法。

好吧,如果这是为了大量阅读,那么你可以尝试一种差分方法。从绝对位置开始,然后开始保存增量更改,理想情况下,根据更改的性质,增量更改需要更少的位。这有效地压缩了流。但不知怎的,我不认为这就是这个家庭作业的目的