编写了一套 GeoJSON 压缩解压代码,矢量边界坐标 6 位小数精度下可压缩到 1/3 - 1/5 大小, ECharts Map 四级中表现良好

2021-02-22 13:50:44 +08:00
 xiangyuecn

上礼拜开源了一个在线省、市、区县、乡镇街道 四级下钻 ECharts Map 的 demo 代码。

不过始终纠结于服务器传输的 geojson 数据太大,于是前天就参考 ZigZag 压缩自己搞了一套压缩解压代码:GeoZip,已开源 js 、c# 两个语言的实现,代码行数不超过 200 行(含注释)。可用于服务器端输出的 GeoJSON 数据压缩,减少服务器流量。

源码+在线测试: https://xiangyuecn.gitee.io/areacity-jsspider-statsgov/assets/geo-echarts.html 里面有 ECharts Map 四级下钻的前端 js 源码,后端源码也开源了是 C#的。


GeoZip 和 ECharts 自带的 ZigZag 压缩的对比:

  1. ECharts.ZigZag 只支持 3 位小数(源码里面写的乘数是 1024,学习时感觉用 1000 才符合正常脑回路),坐标压缩后误差可达几十米(当然用于 ECharts 显示毫无问题);
  2. GeoZip 支持 6 位小数(乘数是 1000000 ),坐标压缩后误差 0.2 米内。
  3. ECharts.ZigZag 可压缩到 1/5 甚至更低,压缩结果可安全的用 ASCII 纯文本直接输出;
  4. GeoZip 大部分情况下仅能压缩到 1/3 大小,压缩结果用了 Base64 编码(输出二进制结果压缩比可接近 ZigZag 的 1/5 大小)。

FQA:为什么我没用 ECharts.ZigZag 来压缩非要自己搞一套?因为我打算把 GeoJSON 显示到高德地图里面,用来对照边界是否偏差太大,压缩算法引入几十米误差比较难接受。

2092 次点击
所在节点    程序员
9 条回复
Jie0zero
2021-02-22 14:41:37 +08:00
建议申请专利
cg919
2021-02-22 15:23:51 +08:00
LZ 也做 GIS 开发?
gooin
2021-02-22 15:29:56 +08:00
前两天也在看这块,最后选了 geobuf
xiangyuecn
2021-02-22 16:10:59 +08:00
@cg919 #2 不是专业做 GIS 开发的,平时有接触
xiangyuecn
2021-02-22 16:11:47 +08:00
@gooin #3 翻了一下 geobuf,巨屌👍
iikebug
2021-02-22 16:36:30 +08:00
好东西,先收藏。
liuzhedash
2021-02-22 18:23:26 +08:00
建议弄到 github,这种应该给 star
xiangyuecn
2021-02-22 18:48:03 +08:00
@liuzhedash #7 github 上有,gitee 是镜像,github.io 经常被污染成 127.0.0.1,后面改成了 gitee.io 可访问性更高

GitHub: https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov
liuzhedash
2021-02-22 18:49:17 +08:00
@xiangyuecn #8 看了一下,几年前就 star 了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/755070

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX