我想使用Leaflet API构建Web应用程序。首先,我的用户使用IP进行地理定位,然后如果他接受我尝试使用HTML5地理位置更新他的位置(准确性更好)。
我的问题是地图上的标记位置没有更新,下面的代码失败而没有错误。我从leaflet documentation尝试了数百种不同的语法和方法来更新标记位置(即.setLatLng),但我没有成功。我想了解我的代码有什么问题。
通过这样做解决了我的问题:
var lat = (e.latlng.lat);
var lng = (e.latlng.lng);
var newLatLng = new L.LatLng(lat, lng);
marker.setLatLng(newLatLng);
旧代码是:
//initial IP based geolocation
var lat = google.loader.ClientLocation.latitude;
var lng = google.loader.ClientLocation.longitude;
//place marker on the map
var marker = L.marker([lat,lng]).addTo(map);
//start HTML5 geolocation
map.locate({setView: true, maxZoom: 16});
function onLocationFound(e) {
var marker = L.marker([e.latlng.lat,e.latlng.lng]).update(marker);
alert ('New latitude is ' + e.latlng.lat)
}
map.on('locationfound', onLocationFound);
答案 0 :(得分:39)
您的问题中的代码有点令人困惑,当您只发布代码段时,很难说出问题是什么。
实际上,这段代码:
var lat = (e.latlng.lat);
var lng = (e.latlng.lng);
var newLatLng = new L.LatLng(lat, lng);
marker.setLatLng(newLatLng);
..应该在onLocationFound()
内按预期工作。
您可以简化它:
marker.setLatLng(e.latlng);
但是,我猜这个问题是范围问题,你的一些变量(例如标记)在onLocationFound中是不可访问的。
这里有一个如何实现它的例子:
function init(){
var map = L.map('map', {center: [51.505, -0.09], zoom: 13}),
marker = L.marker(map.getCenter()).addTo(map),
glcl = google.loader.ClientLocation,
onLocationfound = function(e){
marker.setLatLng(e.latlng);
map.setView(marker.getLatLng(),map.getZoom());
alert('Marker has been set to position :'+marker.getLatLng().toString());
};
L.tileLayer('http://{s}.tile.cloudmade.com/[yourCloudmadeKey]/997/256/{z}/{x}/{y}.png').addTo(map);
map.on('locationfound', onLocationfound);
if(glcl){//when google.loader.ClientLocation contains result
onLocationfound({latlng:[glcl.latitude,glcl.longitude]});
}else{alert('google.loader.ClientLocation fails');}
map.locate();
}
答案 1 :(得分:10)
尝试update()标记方法,它适用于我
var lat = (e.latlng.lat);
var lng = (e.latlng.lng);
marker.setLatLng([lat, lng]).update(); // Updates your defined marker position