Клуб API Карт

Смещаются метки при изменении масштаба карты. Yandex Maps API 2.0

xploits
29 июля 2014, 16:21

Добрый день. Моя задача состит в том, что бы вывести объекты из сервиса Wialon(предоставляет геоданные, где в данный момент находится объект) на яндекс карты.

Собственно вот код:

 

<script>

var map, marker, unitID, unitEventID, polyline, mypositin, mapWaypts = []; // global variables


// Print message to log

function msg(text) { $("#log").prepend(text + "<br/>"); }


function init() { // Execute after login succeed

var sess = wialon.core.Session.getInstance(); // get instance of current Session

// specify what kind of data should be returned

var flags = wialon.item.Item.dataFlag.base;


sess.loadLibrary("itemIcon"); // load Icon Library 

sess.updateDataFlags( // load items to current session

[{type: "type", data: "avl_unit", flags: flags, mode: 0}], // items specification

function (code) { // updateDataFlags callback

if (code) { msg(wialon.core.Errors.getErrorText(code)); return; } // exit if error code

 

var units = sess.getItems("avl_unit"); // get loaded 'avl_resource's items

if (!units || !units.length){ msg("No units found"); return; } // check if units found

for (var i = 0; i< units.length; i++) // construct Select list using found resources

$("#units").append("<option value='"+ units[i].getId() +"'>"+ units[i].getName()+ "</option>");

// bind action to select change event

$("#units").change( showUnit );

});

}


function showUnit(){ // show selected unit on map

var val = $("#units").val(); // get selected unit id

if (!val) return; // exit if no unit selected

var sess = wialon.core.Session.getInstance(); // get instance of current Session

// specify what kind of data should be returned

var flags = wialon.item.Unit.dataFlag.lastMessage;

var unit = null;

if (unitID) { // check if we already have previous unit

unit = sess.getItem(unitID);

sess.updateDataFlags( // remove previous item from current session

[{type: "id", data: unitID, flags: flags, mode: 2}], // item specification

function(code) {

if (code) { msg(wialon.core.Errors.getErrorText(code)); return; }

 

if (unitEventID) unit.removeListenerById(unitEventID); // unbinding event from this unit

});

}


unitID = val;

unitEventID = null; // empty event ID

mapWaypts = []; // remove all old checkpoints if they were here


sess.updateDataFlags( // load item with necessary flags to current session

[{type: "id", data: unitID, flags: flags, mode: 1}], // item specification

function(code) {

if (code) { msg(wialon.core.Errors.getErrorText(code)); return; }


unit = wialon.core.Session.getInstance().getItem(val); // get unit by id

if(!unit) return; // exit if no unit

            var position = unit.getPosition(); // get unit position

if (!position) return; // exit if no position 

if (map) { // check if map created and we can detect position of unit               

                mypositin = { // get unit position 

              x: position.x,

              y: position.y

              };

                if (!marker) {

                    //marker = new ymaps.Placemark(new ymaps.GeoPoint([position.y, position.x])); 

                    //marker = new ymaps.Placemark([position.y, position.x], {style: s});

                    marker = new ymaps.Placemark([position.y, position.x], {}, {

                            iconLayout: 'default#image',

                            iconImageHref: unit.getIconUrl(32),

                            iconImageSize: [32, 32],

                            iconImageOffset: [-143, 13]

                        });                                            

                } else {

                    marker.geometry.setCoordinates([position.y, position.x]);

                }

                console.log(marker);

                map.panTo([position.y, position.x], {flying: true});                

                map.geoObjects.add(marker);



//if (polyline) polyline.setMap(null); // if there is alreday path of map - remove it

//mapWaypts.push(latlon); // adding point to path array

}


msg("You chose unit: " + unit.getName());


unitEventID = unit.addListener("messageRegistered", showData); // register event when we will receive message

});

}


function showData(event) {

var data = event.getData(); // get data from event

 

if (!data.pos) return; // exit if no position 


var appended = ''; // here we will put all required information

var position = { // get unit position 

x: data.pos.x,

y: data.pos.y

};

  mypositin = { // get unit position 

x: data.pos.x,

y: data.pos.y

};

appended += "Position (x: " + data.pos.x + "; y: " + data.pos.y +")"; // printing position

if (data.t) appended += ", time " + wialon.util.DateTime.formatTime(data.t, 1); // printing event time (return user time)

msg(appended); // writing to log message about this event

                         

if (map) { // check if map created

        marker.geometry.setCoordinates([position.y, position.x]);

        /*if (polyline) {

            polyline.addLatLng({lat: position.y, lng: position.x});

        }     */

        map.panTo([position.y, position.x], {flying: true}); 


}

}

                          

function initMap() {

    // create a map in the "map" div, set the view to a given place and zoom

    map = new ymaps.Map("map", { center: [52.518593,13.388685], zoom: 15}); 

    map.events.add('boundschange', function (event) {

        if (event.get('newZoom') != event.get('oldZoom')) {

            marker.geometry.setCoordinates([mypositin.y, mypositin.x]);

            alert('Уровень масштабирования изменился');

        }

    });    

}


// execute when DOM ready

jQuery(document).ready(function ($) { 

wialon.core.Session.getInstance().initSession("https://hst-api.wialon.com"); // init session

wialon.core.Session.getInstance().login("{$login_wialon}", "{$pass_wialon}", "", // try to login

function (code) { // login callback

// if error code - print error message

if (code) { msg(wialon.core.Errors.getErrorText(code)); return; }

msg("Logged successfully");

            ymaps.ready(initMap); 

            //initMap();

            init(); // when login suceed then run init() function

});

});

 

 </script>  

 

Код отлично работает, единственное есть один косяк: при изменении масштаба метки нехило смещаются. Как можно исправить данную особенность? Или может есть способы привязки к ближайшей дороше?