我正在尝试对瑞士天气服务的天气地图进行逆向工程,因为我想提取信息以在某些电子纸显示器上显示。你可以在这里看到这样的地图: https://www.meteosuisse.admin.ch/services-et-publications/applications/precipitations.html
我感兴趣的覆盖层包含在 JSON 文件中,其名称遵循模式
rate_YYYYMMDD_hhmm.json
。它包含一个“区域”数组,每个区域由 RGB 颜色和一个“形状”数组给出。到目前为止,一切都很好。但是我不明白这些形状使用的编码。这是一个例子:
{"i":621,"j":120,"d":"NLNLNLNNMOLNKM","o":"01257867","l":0}
我猜
i
和j
是形状的位置,而d
和o
以某种方式描述了它的边界?我注意到 d.length
始终等于 (o.length - 1) * 2
,并且 l
似乎等于该区域形状数组中形状的索引。
d
似乎只使用N
、M
、K
、L
和O
。
o
似乎使用了 0
和 9
之间的所有数字。
有人认识这个吗?它是标准的,还是至少是某些图书馆使用的某种格式? JavaScript 被混淆了,所以很难弄清楚它是在哪里解析的。
好吧,这看起来不像是标准编码。解码函数在页面的混淆 Javascript 中称为
f
,其工作原理大致如下:
i
和 j
是多边形的一个顶点的坐标d
中的每对连续字母表示下一个顶点的方向。从 K
到 O
的字母映射到从 -2 到 +2 的偏移量。例如,最初的 NL
从 (621; 120)
移动到 (621+1; 120-1)
o
中的数字通过指定0.05
和0.95
之间的偏移量提供额外的精度。由于某种原因,编码只允许在水平坐标(如果它是奇数)或垂直坐标(如果水平坐标是奇数)上添加这样的偏移量。CHtoWGS
的函数,大概是为了转换为 WGS 坐标系之一。