使用Javascript中的相对坐标定位压缩

时间:2016-11-17 13:58:02

标签: javascript arrays geojson

Goodafternoon。我有一组坐标

[ [ 52.52132, 4.52342 ], [ 52.52144, 4.52352 ], [ 52.52154, 4.52354 ], [ 52.52166, 4.52376 ] ]

如何将第一个位置(前两个坐标)变为基础。以下所有位置都是与该基地的相对距离?

所以,完全伪示例:

[ [ 52.52132, 4.52342 ], [ 52.52144, 4.52352 ], [ 52.52154, 4.52354 ], [ 52.52166, 4.52376 ] ]

然后会变成这样:

[ [ 52.52132, 4.52342 ], [ 0.4123, 0.1232 ], [ 0.1232, 0.5523 ], [ 0.1233, 0.1232 ] ]

第一部分[52.52132,4.52342]是起点。所有其他坐标都与前一个坐标相关。

1 个答案:

答案 0 :(得分:1)

这是你的事后......

我不确定你得到0.4123,0.1232, 如52.52144 - 52.52132 = 0.00012

此外,如果你的后续是一个简单的LatLng压缩/解压缩系统。 我在这里做了一点,这是一个非常简单的压缩器,它可以解决你的问题。但是多个循环将差异乘以1 10 100 1000等。并跟踪将返回最小字符串化结果的内容。然后将乘数存储为第一个元素。

例如。您的示例将压缩为 - > 5,52.52132,4.52342,12,10,10,2,12,22

5将等于100000的差异mutliplier,它将使用它来计算出除以差异的区别。将zlib添加到此处很可能会压缩得更多。

var g = [ [ 52.52132, 4.52342 ], [ 52.52144, 4.52352 ], [ 52.52154, 4.52354 ], [ 52.52166, 4.52376 ] ],
    n = g.slice(0,1);

function compressLatLng(g) {
  var smallest = null, r, mul;
  if (!g.length) return '';
  for (var l = 1; l < 6; l ++) {
    mul = Math.pow(10, l);
    r = [l,g[0][0],g[0][1]];
    for (var k = 1; k < g.length; k ++) {
      r.push(
        ((g[k][0] - g[k-1][0])*mul).toFixed(5)*1,
        ((g[k][1] - g[k-1][1])*mul).toFixed(5)*1
      );
    }
    var j = r.join(',');
    if (!smallest) smallest = j;
    else if (j.length < smallest.length) smallest = j;
  }  
  return smallest;
}

function uncompressLatLng(s) {
  var r = s.split(',');
  if (!r.length) return [];
  var mul = Math.pow(10,r[0]);
  var j = [[r[1]*1, r[2]*1]];
  var last = j[0];
  for (var l = 3; l < r.length; l += 2) {
    var t = [
      (last[0] + r[l] / mul).toFixed(5)*1,
      (last[1] + r[l+1] / mul).toFixed(5)*1
    ];
    j.push(t);
    last = t;
  }
  return j;
}


for (var l = 1; l < g.length; l ++) {
  n.push([
    (g[l][0] - g[l-1][0]).toFixed(5)*1,
    (g[l][1] - g[l-1][1]).toFixed(5)*1
  ]);
}

console.log('O:Original S:Simple C:Compressed U:Uncompressed');
console.log('O: ' + JSON.stringify(g));
console.log('S: ' + JSON.stringify(n));
var compressed = compressLatLng(g);
console.log('C: ' + compressed);
console.log('U: ' + JSON.stringify(uncompressLatLng(compressed)));