2015-02-17 4 views
1

У меня есть веб-карта, использующая API-интерфейс Mapbox/Leaflet JS.Листовка/Mapbox - Drag & Drop

На карте у меня есть несколько неподвижных маркеров и других маркеров, которые я перемещаю на основе данных GPS, которые помещаются в браузер. Когда движущийся маркер удаляется на неподвижном маркере, я хочу идентифицировать два маркера, которые были задействованы.

Я применил обработчик события «dragend» движущегося маркера, который позволяет мне идентифицировать маркер, который был перетащен/сброшен.

Мои вопросы: как я могу определить маркер, на который он был сброшен?

ответ

2

Это довольно сложно сделать, потому что единственное, что позволяет вам правильно идентифицировать маркер, это положение широты/долготы. Поэтому, если вы попытаетесь сбросить маркер на маркер с помощью lat/lng 0,0, вам нужно сбросить его точно на эту позицию, которая окажется очень трудной задачей.

Вы могли бы сделать что-то вроде толерантности к нему, но этот толерант должен измениться в зависимости от уровня масштабирования, который, я думаю, будет очень трудно получить. Вы могли бы сделать что-то вроде этого:

// Drag has ended 
marker.on('dragend', function (e) { 

    // Get position of dropped marker 
    var latLng = e.target.getLatLng(); 

    // Object to hold nearest marker and distance 
    var nearest = {}; 

    // Loop over layer which holds rest of the markers 
    featureLayer.eachLayer(function(layer) { 

    // Calculate distance between each marker and dropped marker 
    var distance = latLng.distanceTo(layer.getLatLng()); 

    // Set the first as nearest 
    if (!nearest.marker) { 
     nearest.marker = layer; 
     nearest.distance = distance; 

    // If this marker is nearer, set this marker as nearest 
    } else if (distance < nearest.distance) { 
     nearest.marker = layer; 
     nearest.distance = distance; 
    } 

    }); 

}); 

Пример на Plunker: http://plnkr.co/edit/GDixNNDGqW9rvO4R1dku?p=preview

Теперь nearest объект будет содержать маркер, который находится ближе всего к вашей позиции перетаскивания. Ближайшее расстояние может варьироваться в зависимости от уровня масштабирования. Когда вы достигли уровня масштабирования 1, может показаться, что вы сбросили его точно на другом маркере, но вы можете находиться за тысячи миль. При масштабировании 18 разница будет намного меньше, но сбросить ее точно на том же lat/lng практически невозможно. В противном случае вы могли бы просто сравнить все latlng против упавшего latlng, но это не будет работать на практике.

Так что теперь у вас есть ближайший маркер, и это расстояние до упавших маркеров можно реализовать толерантность, то вдоль линий: if (nearest.distance < (x/y)) где x является расстоянием и y zoomlevel. Вам нужно будет поиграть, чтобы поправиться. После того, как вы определили правильный допуск, вы можете реализовать его прямо вместе с сравнением расстояния в обработчике.

Удачи, надеюсь, это поможет