Клуб API Карт

Кодирование вершин ломаной для StaticApi, в чем ошибка?

KDV
17 февраля 2011, 13:11

Согласно методике описанной здесь на PHP подготовил скриптик для кодирования вершин следующего вида:

function EncodePLine($PL) {
if(count($PL)<2) return "";
$lng=0; $lat=0;
$line=""; $line2=""; $res="";
$pattern = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=";
for($i=0; $i<count($PL); $i++) {
$PL[$i]['LNG'] -= $lng; $lng += $PL[$i]['LNG'];
$PL[$i]['LAT'] -= $lat; $lat += $PL[$i]['LAT'];
$line.= str_pad(decbin($PL[$i]['LNG']), 32, '0', STR_PAD_LEFT);
$line.= str_pad(decbin($PL[$i]['LAT']), 32, '0', STR_PAD_LEFT); }
for($i=0; $i<strlen($line); $i+=32) {
for($j=24; $j>=0; $j-=8) {
$line2.= substr($line,$i+$j,8); }}
for($i=0; $i<strlen($line2); $i+=6) {
$len = strlen(substr($line2,$i,6));
if($len >= 6) {
$n = bindec(substr($line2,$i,6));
  if($n<0 or $n>=strlen($pattern)) exit("Error encoding ".$line2);
$res.= substr($pattern, $n, 1); }
elseif($len==4) $res.= "==";
elseif($len==2) $res.= "=";
else exit("Error encoding ".$line2); }
return $res; }


На входе массив координат ломаной $PL, каждый элемент которого: array('LNG'=>...., 'LAT'=>....). Широта и долгота в нем уже умножены на 1e6.

Прогнал через функцию пример из руководства - все супер, прогоняю свой небольшой трек - тоже ОК.

Пытаюсь закодировать трек на несколько километров разбивая его скажем на 10 участков(вершин) - Static Api возвращает ошибку:

Wrong base64 polyline 

Увеличиваю количество вершин до 50 в томже треке - ошибка исчезает. 

Все возможные проверки внутри самой функции по exit() не вылетают.

Помогите найти ошибку? Или это несовершенство алгоритма кодирования вершин?

4 комментария
Подписаться на комментарии к посту
Недавно   выложил пример на питоне, который делает всё тоже самое.
Попробуйте скормить ему Вашу ломаную и сравнить результат.

К сожалению у меня нет возможности проверить скрипт на питоне....


Вот если бы можно было передать исходный массив через HTTP GET/POST и сравнить полученные строки - это да.


PS Однако в любом случае исходная просьба остается - НАЙТИ ошибку, а не просто проверить на совпадение и все.

Есть же готовый пример на джаваскрипте. Зачем питон?

Cравнивать лучьше на карте, так как между моим питоновскм скриптом и примером от яндекса не выходило полное соответствие строки (приблизительно каждая восьмая буква отличалась на единичку) но на карте различий я не заметил


Скрипт предназначен для Static API для устройств, который с Java-версией API не "дружат".


Но поизгиляться попробую конечно :) чтоб хоть както сверить.