Leaflet / Mapbox - 拖放
Leaflet / Mapbox - Drag & Drop
我有一个使用 Mapbox / Leaflet JS 的基于网络的地图 API。
在地图上,我根据推送到浏览器的 GPS 数据移动了几个固定标记和其他标记。当移动标记落在静止标记上时,我想识别涉及的两个标记。
我已经为移动标记的 "dragend" 事件实现了一个处理程序,它使我能够识别 dragged/dropped 的标记。
我的问题是,我怎样才能识别它掉落在哪个标记上?
这很难做到,因为唯一能让您正确识别标记的是它的 latitude/longitude 位置。因此,如果您尝试将标记放到 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
缩放级别。这是你需要玩弄才能正确的东西。一旦您确定了正确的公差,您就可以在处理程序中实现它以及距离比较。
祝你好运,希望对你有所帮助
我有一个使用 Mapbox / Leaflet JS 的基于网络的地图 API。
在地图上,我根据推送到浏览器的 GPS 数据移动了几个固定标记和其他标记。当移动标记落在静止标记上时,我想识别涉及的两个标记。
我已经为移动标记的 "dragend" 事件实现了一个处理程序,它使我能够识别 dragged/dropped 的标记。
我的问题是,我怎样才能识别它掉落在哪个标记上?
这很难做到,因为唯一能让您正确识别标记的是它的 latitude/longitude 位置。因此,如果您尝试将标记放到 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
缩放级别。这是你需要玩弄才能正确的东西。一旦您确定了正确的公差,您就可以在处理程序中实现它以及距离比较。
祝你好运,希望对你有所帮助