Поскольку это вопрос, не зависящий от языка, я добавлю это решение PHP (так как оператор >>>
не существует в PHP) из блога единицы измерения Питера Чнга :
function decodePolylineToArray($encoded)
{
$length = strlen($encoded);
$index = 0;
$points = array();
$lat = 0;
$lng = 0;
while ($index < $length)
{
$b = 0;
$shift = 0;
$result = 0;
do
{
$b = ord(substr($encoded, $index++)) - 63;
$result |= ($b & 0x1f) << $shift;
$shift += 5;
}
while ($b >= 0x20);
$dlat = (($result & 1) ? ~($result >> 1) : ($result >> 1));
$lat += $dlat;
$shift = 0;
$result = 0;
do
{
$b = ord(substr($encoded, $index++)) - 63;
$result |= ($b & 0x1f) << $shift;
$shift += 5;
}
while ($b >= 0x20);
$dlng = (($result & 1) ? ~($result >> 1) : ($result >> 1));
$lng += $dlng;
$points[] = array($lat * 1e-5, $lng * 1e-5);
}
return $points;
}
Дополнительные инструкции от разработчиков Google
Обновление: инструкции по декодированию являются почти простыми, чтобы найти исходное значение, можно вычислить, является ли оно положительным или отрицательным по последнему биту накаждое значение, которое вы уже преобразуете из своих символов ASCII.
ex:
Шаг 5. Если ваше значение chunked (chunks of 5) имеет последний бит '0x1f', то оно отрицательное, и вы должныинвертировать его так: |= ($foo & 0x1f) << $shift;
00000010 00100101 01000011 11100001
4 Сдвиг двоичного значения вправо на один бит:
1111110111011010 10111100 00011110
3 Преобразуйте двоичное значение в десятичное. Помните, что если вы понимаете, что это отрицательное число, вы должны преобразовать его из дополнения до двух, Дополнение до двух : если он был положительным, то просто преобразовать двоичный файл как обычно :
11111110 11101101 01011110 00001111
11111110 11101101 01011110 00001110
00000001 00010010 10100001 11110001 <- наше исходное значение без знака </p>
2 Десятичное значение было умножено на 1e5, поэтому разделите его, чтобы получить начальное значение: 179.98321
1 Добавьте исходное значение к его знаку (если оно необходимо) -179.98321 (это небольшая потеря данных, но она совершенно не имеет значения)