Согласно методике описанной здесь на PHP подготовил скриптик для кодирования вершин следующего вида:
if(count($PL)<2) return "";
$lng=0; $lat=0;
$line=""; $line2=""; $res="";
$pattern = "ABCDEFGHIJKLMNOPQRSTUVWX
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() не вылетают.
Помогите найти ошибку? Или это несовершенство алгоритма кодирования вершин?