2016-11-17 16 views
-1

Goodafternoon. У меня есть набор координатСжатие положения с использованием относительных координат в Javascript

[ [ 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.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, он будет использовать это для определения того, что разделить разность. Добавление say 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)));

+0

Спасибо так много! Это действительно помогло мне понять, в чем я ошибаюсь и в своих мыслях. – Marco

 Смежные вопросы

  • Нет связанных вопросов^_^