Добрый день. Моя задача состит в том, что бы вывести объекты из сервиса 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.getIn
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>
Код отлично работает, единственное есть один косяк: при изменении масштаба метки нехило смещаются. Как можно исправить данную особенность? Или может есть способы привязки к ближайшей дороше?