Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

update marker location with leaflet API

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); 
like image 335
floflo Avatar asked Jan 05 '13 16:01

floflo


People also ask

How do you find the current location in a leaflet?

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.

What is Tilelayer in leaflet?

Used to load and display tile layers on the map, implements ILayer interface.

What is Latlng in leaflet?

Represents a geographical point with a certain latitude and longitude.


1 Answers

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/

like image 147
Dr.Molle Avatar answered Sep 19 '22 15:09

Dr.Molle