I want to build web app with the Leaflet API. First my user is geolocated with IP then if he accepts I try to update his position with HTML5 geolocation (accuracy is better).
My problem is that the marker position is not updated on the map and the code bellow fails with no error. I have try hundred of different syntax and methods from leaflet documentation to update marker position (ie. setLatLng) but I did not succeed. I would like to understand what's wrong with my code.
My problem is solved by doing like this :
var lat = (e.latlng.lat); var lng = (e.latlng.lng); var newLatLng = new L.LatLng(lat, lng); marker.setLatLng(newLatLng);
Old code was:
//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);
Leaflet has a very handy shortcut for zooming the map view to the detected location — locate method with the setView option, replacing the usual setView method in the code: map. locate({setView: true, maxZoom: 16}); Here we specify 16 as the maximum zoom when setting the map view automatically.
Used to load and display tile layers on the map, implements ILayer interface.
Represents a geographical point with a certain latitude and longitude.
The code inside your question is a little bit confusing, it's hard to say what the issue is when you only post snippets.
As it is, this code:
var lat = (e.latlng.lat); var lng = (e.latlng.lng); var newLatLng = new L.LatLng(lat, lng); marker.setLatLng(newLatLng);
..should work as expected inside onLocationFound()
.
You can simplify it:
marker.setLatLng(e.latlng);
However, I guess the problem is a scope-issue, some of your variables (e.g. marker) is not accessible inside onLocationFound.
Here an example how to achieve it:
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(); }
Demo: http://jsfiddle.net/doktormolle/6ftGz/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With