Zonkod 的设计理念是简洁、快速且通用。但它的背后蕴含着许多技术。让我们深入了解一下!

地球被精确地分割成 10,000 个精度相近的表面。大致了解 Zonkod 的工作原理。

几年前,我在旅行途中,试图将一家餐厅的地理坐标输入到一辆高档汽车的导航系统中。尽管我是一名拥有博士学位的工程师,但我还是费了十五分钟功夫也没能成功。
那一刻,我意识到确实存在一个尚未解决的问题。还好,那天晚上我最后还是吃上了晚饭 ;)

这就是最终的解决方案:一个地理电话号码:拨号方便,全球通用,地球上的每个人都能轻松使用。
然而,要将一个球体精确地分割成100,000,000,000,000个完全相同的面,是极其困难的。事实上,这是不可能的。

然后第二个伟大的想法出现了:忘记完全相同的表面,专注于真正重要的东西:精度。
选取某个位置,将其位置编码成一个数字,然后将该数字解码回一个新的位置。唯一重要的是这两个位置之间的距离不能太远。整个系统的精度在于最坏情况下这两个位置之间的最大距离。这才是唯一重要的因素!
它还必须简单易懂,一眼就能辨认出来,因此采用了单精度和前导 ZK:。

另一个限制因素是编码和解码的便捷性以及完全可复现性。每个系统(从微型嵌入式物联网设备到手机、台式电脑或大型机)都必须始终给出完全相同的结果。
但计算机的精度是有限的。在科学和技术计算中,计算机使用所谓的浮点数。使用三角函数或其他特殊函数时,浮点数也是必不可少的。不幸的是,浮点系统、编程语言和库种类繁多,彼此之间只有细微的差别。此外,浮点系统要么速度慢,要么成本高,或者两者兼而有之。
所以:不使用三角函数,不使用浮点运算,只使用整数运算,因为这是唯一确定性的解决方案。
设计这样一个系统耗时良久,但最终成功了。如今,我们可以使用Zonkod。这项技术正在申请专利。其关键目标之一是建立标准,确保只有一个ZK:,从而杜绝格式之争。
我们可以计算给定数字长度下理论上的最佳精度。对于 14 位数字,精度为 1.5969 米。Zonkod 编码几乎完美:其精度为 1.5988 米,即最佳精度的 99.9%。这一点至关重要,因为它最大限度地提高了每个数字的利用率。

Zonkod 已在多种不同语言中实现,包括 C、JavaScript、WASM、FORTRAN 和 Python。它们都给出了完全相同的结果,精确到最后一位数字。
它甚至被移植到了 COBOL 语言上,COBOL 是一种 1959 年为商业会计而设计的语言,最初并非用于处理测地线计算。然而,它却能正常运行。如果 Zonkod 能在 COBOL 中运行,那么它就能在任何地方运行。

速度和紧凑性也很重要。
在 Arduino Nano(8 位 ATmega328P,16 MHz)上,一个完整的裸机编码+解码程序(包括 I/O 和伪随机数生成器)需要 11,956 字节的 ROM 和 192 字节的 RAM。
它的平均往返时间仅为 1.48 毫秒。在手机或台式机上,时间更是缩短到了纳秒级。
Zonkod 将一个复杂的几何问题转化为一个简单的整数运算。其结果是生成的位置代码,它足够紧凑,适用于 8 位微控制器;速度足够快,可以在任何系统上运行;精度足够高,可以满足日常使用;并且在地球上的每个设备上都完全相同。一个数字,一个标准,一个 ZK:。