ECharts中GeoJson压缩和解码算法

    技术2022-07-11  72

    查看echarts例子中提供的地图文件,发现geo的coordinates中包含许多乱码,其文件内容比自己的小很多,猜测数据做了压缩。网上搜索并查看源码,确实对数据进行了压缩处理。

    压缩

    代码来自https://my.oschina.net/rodger/blog/838763

    代码未经测试,测试之后,转换为Python实现,并和省市区三级行政区数据获取和GeoJson地图下载中的下载代码整合。

    function encodePolygon(coordinate){ var prevX=0,prevY=0; var coorstr=""; var encodeOffsets=[]; var result={'coordinate':coorstr,'encodeOffsets':encodeOffsets}; for(var i=coordinate.length-1;i>0;i--){ var x=coordinate[i][0]; var y=coordinate[i][1]; x=x*1024;y=y*1024; x-=coordinate[i-1][0]*1024; y-=coordinate[i-1][1]*1024; x=(x << 1) ^ (x >> 31); y=(y << 1) ^ (y >> 31); coorstr=String.fromCharCode(x+64)+String.fromCharCode(y+64)+coorstr; } coorstr="@@"+coorstr; encodeOffsets=[coordinate[0][0]*1024,coordinate[0][1]*1024] return result; }

    解码

    代码来自官方源码

    function decodePolygon(coordinate, encodeOffsets, encodeScale) { var result = []; var prevX = encodeOffsets[0]; var prevY = encodeOffsets[1]; for (var i = 0; i < coordinate.length; i += 2) { var x = coordinate.charCodeAt(i) - 64; var y = coordinate.charCodeAt(i + 1) - 64; // ZigZag decoding x = (x >> 1) ^ (-(x & 1)); y = (y >> 1) ^ (-(y & 1)); // Delta deocding x += prevX; y += prevY; prevX = x; prevY = y; // Dequantize result.push([x / encodeScale, y / encodeScale]); } return result; }
    Processed: 0.010, SQL: 9