Кодирование координат Gmap

Статус
В этой теме нельзя размещать новые ответы.

jewtagan

Новичок
Кодирование координат Gmap

Доброго времени суток!
Столкнулся с такой проблемой: необходимо закодировать координаты для gmap, есть алгоритм:

Этапы кодирования числа со знаком приведены ниже.

1. Возьмите первоначальное значение:
-179.9832104
2. Затем возьмите десятичное значение и помножьте его на 1e5, округляя результат:
-17998321
3. Преобразуем десятичное значение в двоичное. Учтите, что отрицательное значение следует вычислить, используя его дополнительный код числа, путем инвертирования двоичного значения и добавления единицы к результату:
00000001 00010010 10100001 11110001
11111110 11101101 01011110 00001110
11111110 11101101 01011110 00001111
4. Сдвиг двоичного значения:
11111101 11011010 10111100 00011110
5. Если исходное десятичное число отрицательно, инвертируем этот код:
00000010 00100101 01000011 11100001
6. Разбиваем двоичное значение на пятиразрядные сегменты (начиная справа):
00001 00010 01010 10000 11111 00001
7. Располагаем пятиразрядные сегменты в обратном порядке:
00001 11111 10000 01010 00010 00001
8. ИЛИ выполняем логическое сложение каждого значения с числом 0x20, если следует еще один сегмент:
100001 111111 110000 101010 100010 000001
9. Преобразуем каждое значение в десятичное:
33 63 48 42 34 1
10. Складываем каждое значение с 63:
96 126 111 105 97 64
11. Преобразуем каждое значение в его эквивалент в ASCII:
`~oia@
первоисточник

есть даже интерактивное кодирование кодирование на JS.
есть необходимость кодирования большого количесва координат, поэтому данный вариант не устраивает.
написал кодировку на РНР, но почему то не хочет работать :)
PHP:
$num = -179.9832104; 
if ($num<0) $num = ~ $num; 
while($num >= 0x20) { 	
  $result+= chr((0x20 | ($num & 0x1F)) + 63); 	
  $result>>5; 
} 
$result+=chr($num + 63); 
var_dump($result);
Подскажите, пожалуйста, что я не так делаю. В чем ошибка?
 

Вурдалак

Продвинутый новичок
PHP:
function GMapEncode($in)
{
    $n = round($in * 1e5) << 1;

    if( $in < 0 ) {
        $n = ~ $n;
    }

    $result = '';

    for($i = 0; $i < 6; $i++) {
        $m = ($i == 5) ? 0x00 : 0x20;
        $result .= chr((($n & 0x1F) | $m) + 63);
        $n >>= 5;
    }

    return $result;
}

echo GMapEncode(-179.9832104);
-~{}~ 02.05.10 22:39:

Сейчас посмотрел это и исправил так:

PHP:
function GMapEncode($in)
{
    $n = round($in * 1e5) << 1;

    if( $in < 0 ) {
        $n = ~ $n;
    }

    $result = '';

    while( $n > 0x20 ) {
        $result .= chr((($n & 0x1F) | 0x20) + 63);
        $n >>= 5;
    }

    $result .= chr(($n & 0x1F) + 63);  

    return $result;
}
Вся ломаная кодируется хитро:
PHP:
function getEncPolyline(array $points)
{
    if( empty($points) ) {
        return false;
    }

    $result = GMapEncode($points[0][0]) . GMapEncode($points[0][1]);

    for($i = 1; $i < count($points); $i++) {
       $result .=  GMapEncode($points[$i][0] - $points[$i - 1][0]) . GMapEncode($points[$i][1] - $points[$i - 1][1]);
    }

    return $result;
}

echo getEncPolyline(array(

    array(38.5, -120.2),
    array(40.7, -120.95),
    array(43.252, -126.453),    

));
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху