Клуб API Карт

Помогите с кодированием вершин полилинии на PHP.

boicoff
18 февраля 2010, 10:15

Пытаюсь сделать кодирование полилинии на ПХП, но затыкаюсь на 5 шаге документации.


Вот что получилось сейчас:

 

$points = array('37.593578,55.735094', '37.592159,55.732469', '37.589374,55.734162');


Route2Str($points);


 

 

function Route2Str($points)

{

$coef = 1000000;

$prev = Array(0,0);


$out='';


for($i=0; $i < count($points); $i++)

{

    $currentPoint = explode(',', $points[$i]);

    

    $currentPoint[0]=($currentPoint[0]*$coef);

    $currentPoint[1]=($currentPoint[1]*$coef);

    

    $geoVector[0] =  abs(round($currentPoint[0]-$prev[0]));

    $geoVector[1] =  abs(round($currentPoint[1]-$prev[1]));

    

    $prev=$currentPoint;

    $geoVector[0] = str_pad(decbin($geoVector[0]), 32, 0, STR_PAD_LEFT);

    $geoVector[1] = str_pad(decbin($geoVector[1]), 32, 0, STR_PAD_LEFT);

    

    

    preg_match("/([\d]{8})([\d]{8})([\d]{8})([\d]{8})/is", $geoVector[0], $geo_1);

    //$out.=base64_encode($geoVector[0].$geoVector[1]);

    //print_r($geoVector);

    unset($geo_1[0]);

    $geo_1 = array_reverse($geo_1);

    

    $geo_1 = join('', $geo_1);

    

    for($a=0; $a<strlen($geo_1); $a=+6)

    {

        $out .= base64_encode(bindec(substr($geo_1, $a, 6)));

    }

  break;  

 echo $out;

    

}

Т.е. при попытке закодировать в base64 получается не то, что в примере документации.

 

2 комментария
Подписаться на комментарии к посту
Для кодирования вершин ломаной используется не совсем обычный base64. Подробно процесс кодирования вершин ломаной описан в руководстве разработчика:
http://api.yandex.ru/maps/jsapi/doc/dg/tasks/how-to-add-polyline.xml#encoding-polyline-points
Это я уже изучил вдоль и поперек, интересна была реализация на PHP. В итоге всё сделал сам, просо переписав JS из примера на PHP.
 
$points = array('37.593578,55.735094', '37.592159,55.732469', '37.589374,55.734162');
echo Route2Str($points); function Route2Str($points) { $coef = 1000000; $prev = Array(0,0); $out = Array();
for($i=0; $i < count($points); $i++) {    $currentPoint = explode(',', $points[$i]);
   $currentPoint[0]=($currentPoint[0]*$coef);    $currentPoint[1]=($currentPoint[1]*$coef);
   $geoVector[0] =  round($currentPoint[0]-$prev[0]);    $geoVector[1] =  round($currentPoint[1]-$prev[1]);
   $prev=$currentPoint;    $out = array_merge($out, encode4bytes($geoVector[0]), encode4bytes($geoVector[1]) ); }    return mybase64_encode($out); }

function encode4bytes ($x) { for ($i = 0; $i < 4; $i++) { $chr[$i] = $x & 0x000000ff; $x = $x >> 8; } return $chr;
}
function mybase64_encode($input) {
    $BinaryMap="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=";         $output = "";         $chr1 = $chr2 = $chr3 = $enc1 = $enc2 = $enc3 = $enc4 = null;         $i = 0;         while($i < count($input)) {             $chr1 = $input[$i++];             $chr2 = $input[$i++];             $chr3 = $input[$i++];
            $enc1 = $chr1 >> 2;             $enc2 = (($chr1 & 3) << 4) | ($chr2 >> 4);             $enc3 = (($chr2 & 15) << 2) | ($chr3 >> 6);             $enc4 = $chr3 & 63;
            if (is_nan($chr2)) {                 $enc3 = $enc4 = 64;             } else if (is_nan($chr3)) {                 $enc4 = 64;             }
            $output .=  $BinaryMap[$enc1]                       . $BinaryMap[$enc2]                       . $BinaryMap[$enc3]                       . $BinaryMap[$enc4];         }
return $output; }