Клуб API Карт

Вывод нескольких ломаных линий на одной карте из базы

Пост в архиве.
youforceru
20 июля 2013, 23:47

Здравствуйте!

У меня возникла следующая проблема:

Есть 4 файла: main.js, user.html, process.php, таблица 'coordinates' в mysql

Допустим, заходим на страницу пользователя, id пользователя = 1, мне нужно из таблицы 'coordinates' взять все строки (каждая строка - координата одной ломаной линии) данного пользователя и показать их на карте. При этом координаты центра карты брать из первых координат первой совпавшей строки.

То есть, строки в таком виде:

37.67647804,55.74818943~-0.04377365,0.01122981~-0.01424790,-0.00958385~-0.01630782,0.01258437~0.00866890,0.00048393

37.60970177,55.76183903~0.10007858,0.00212929~0.00961304,-0.01577888~-0.03862381,-0.00784342~-0.06179810,0.01655648~-0.00858307,0.00212956

37.58669914,55.76532326~0.00257492,-0.00396818~0.01012802,0.00116146~-0.00995636,0.00696803

Я хочу, чтобы центр карты, где будут отмечены все ломаные линии пользователя, находился по координатам: 37.67647804,55.74818943

 

 

Вот как реализую сию идею (прошу строго не судить, я еще молод и неопытен):

 

 

user.html

<script src="http://api-maps.yandex.ru/2.0-stable/?load=package.full&lang=ru-RU" type="text/javascript"></script>
<script type='text/javascript' src='main.js'></script>

    <p style="margin-bottom: 15px">
        <h2 class="header-table">Карта: <span id="kolmar"></span></h2>
        <div id="usermap" data-user="{$oUserProfile->getLogin()}" style="width: 100%; height: 500px; margin: 20px 0;"></div>
    </p>

 

 

main.js

    if($("#usermap").size() > 0){
        user = $("#usermap").attr("data-user");

        $.ajax({ 
                type: "POST", 
                url: "process.php",
                data: 'action=getprofilemap&user='+user,
                success:  function(data) {
                    eval(data);
                }
        }); 
    }

 

process.php:

if($act == "getprofilemap"){
    $user = $_POST['user'];
    $res = $mysqli->query("SELECT * FROM  `coordinates` WHERE `active` =  '1' AND user = '1' LIMIT 0,999");
    
    $coordinates = "";
    $kolmaps = 0;
    
    while ($row = $res->fetch_array(MYSQLI_ASSOC)) {
        $coord = explode("~",$row['coordinates']);
        unset($long);
        unset($lat);
        
        foreach($coord as $oneCoord){
            $longlat = explode(",",$oneCoord);
            if(!isset($long)){
                $long = $longlat[0];
                $lat = $longlat[1];
            }else{
                $long = $longlat[0] + $long;
                $lat = $longlat[1] + $lat;
            }
            
            $coordinates .= "[".$lat.",".$long . "],";
        }
        $coordinates = substr($coordinates, 0, -1);
       
        if ($kolmaps == 0) {
            $longlatt = explode(",",$coord[0]);
            $longg = round($longlatt[0],2);
            $latt = round($longlatt[1],2);
            
            echo "
            myMap = new ymaps.Map('usermap', {
                center: [" . $latt . ", " . $longg . "],
                zoom: 12,
                behaviors: ['scrollZoom', 'drag']
            });";


            echo "
            myMap.controls.add('zoomControl');
            myMap.controls.add('typeSelector');";
        }
        
        $kolmaps += 1;
        
        echo 'var myPolyline'.$row['id'].' = new ymaps.Polyline([
            '.$coordinates.'
        ], {
            balloonContent: "'.$row['user'].'<br><a href=\'/profile/'.$row['user'].'\'>Профиль</a>"
        }, {
            balloonHasCloseButton:true,
            strokeColor: \''.randomColor().'\',
            strokeWidth: 4,
            strokeOpacity: 0.8
        });
        alert(' . $row['id'] . ');
    myMap.geoObjects.add(myPolyline'.$row['id'].');
    myMap.setBounds(myPolyline'.$row['id'].'.geometry.getBounds());';
    }
    
    if ($kolmaps == 0) {
        echo "
        var geolocation = ymaps.geolocation;
        coords = [geolocation.latitude, geolocation.longitude];
        myMap = new ymaps.Map('usermap', {
            center: coords,
            zoom: 10,
            behaviors: ['scrollZoom', 'drag']
        });";
        
        echo "
        myMap.controls.add('zoomControl');
        myMap.controls.add('typeSelector');
        ";
    }
   
};

 

 

В общем, я все это добро пытаюсь загрузить, и получается следующее:

1) Если у пользователя нет никаких ломаных линий в базе, то выдается просто пустая карта с центром по его ip.

2) Если у пользователя 1 ломаная, то выдается карта с одной ломаной, все отлично, центр карты - первые координаты ломаной.

3) Если у пользователя больше 1 ломаной, то происходит ужас, выдает: "TypeError: e is undefined" Пытаюсь увеличить или уменьшить карту, она зависает. Показывает только первую ломаную из базы, остальные не показывает.


Помогите, пожалуйста, разобраться в чем проблема тут? Уже второй день подряд пытаюсь сделать =(

5 комментариев

Уберите Ваш код под кат (редактирование поста -> кнопка врезка)

и ссылку на страницу лучше прикладывать.

 

 success:  function(data) {
                    eval(data);
                }

data покажите для случая "Если у пользователя больше 1 ломаной"

 myMap = new ymaps.Map('usermap', {  center: [55.75, 37.68],  zoom: 12,  behaviors: ['scrollZoom', 'drag']  });  myMap.controls.add('zoomControl');  myMap.controls.add('typeSelector');var myPolyline19 = new ymaps.Polyline([  [55.74818943,37.67647804],[55.75941924,37.63270439],[55.74983539,37.61845649],[55.76241976,37.60214867],[55.76290369,37.61081757]  ], {  balloonContent: "admin
Профиль"
}, { balloonHasCloseButton:true, strokeColor: '#E72E11', strokeWidth: 4, strokeOpacity: 0.8 }); alert(19); //это для отладки myMap.geoObjects.add(myPolyline19); myMap.setBounds(myPolyline19.geometry.getBounds());var myPolyline29 = new ymaps.Polyline([ [55.74818943,37.67647804],[55.75941924,37.63270439],[55.74983539,37.61845649],[55.76241976,37.60214867],[55.76290369,37.61081757][55.76532326,37.58669914],[55.76135508,37.58927406],[55.76251654,37.59940208],[55.76948457,37.58944572] ], { balloonContent: "admin
Профиль"
}, { balloonHasCloseButton:true, strokeColor: '#2C6247', strokeWidth: 4, strokeOpacity: 0.8 }); alert(29); //это для отладки myMap.geoObjects.add(myPolyline29); myMap.setBounds(myPolyline29.geometry.getBounds());

посмотрите, у вас во второй ломаной между пятой и шестой парой координат теряется запятая - в этом проблема. Проверте цикл формирования этой строки или данные

Спасибо огромное, я невнимателен.

Переписал кусок в process.php:

        foreach($coord as $oneCoord){
            $longlat = explode(",",$oneCoord);


            if(!isset($long)){
                $long = $longlat[0];
                $lat = $longlat[1];
            }else{
                $long = $longlat[0] + $long;
                $lat = $longlat[1] + $lat;
            }
           
            $coordinates .= "[".$lat.",".$long . "],";
           
        }
        $coordinates = substr($coordinates, 0, -1);