Ottenere Lat / Lng dall'indicatore di Google


89

Ho creato una mappa di Google Maps con un indicatore trascinabile. Quando l'utente trascina l'indicatore, ho bisogno di conoscere la nuova latitudine e longitudine, ma non capisco quale sia l'approccio migliore per farlo.

Come posso recuperare le nuove coordinate?

Risposte:


132

Ecco la demo di JSFiddle . Nell'API di Google Maps V3 è piuttosto semplice tenere traccia della latitudine e dell'estensione di un marker trascinabile. Cominciamo con i seguenti HTML e CSS come base.

<div id='map_canvas'></div>
<div id="current">Nothing yet...</div>

#map_canvas{
    width: 400px;
    height: 300px;
}

#current{
     padding-top: 25px;
}

Ecco il nostro JavaScript iniziale che inizializza la mappa di Google. Creiamo un marker che vogliamo trascinare e impostiamo la sua proprietà trascinabile su true. Ovviamente tieni presente che dovrebbe essere allegato a un evento di onload della tua finestra affinché possa essere caricato, ma salterò al codice:

var map = new google.maps.Map(document.getElementById('map_canvas'), {
    zoom: 1,
    center: new google.maps.LatLng(35.137879, -82.836914),
    mapTypeId: google.maps.MapTypeId.ROADMAP
});

var myMarker = new google.maps.Marker({
    position: new google.maps.LatLng(47.651968, 9.478485),
    draggable: true
});

Qui alleghiamo due eventi dragstartper tracciare l'inizio del trascinamento e dragendper trascinare quando il marcatore smette di essere trascinato, e il modo in cui lo colleghiamo è quello di usarlo google.maps.event.addListener. Quello che stiamo facendo qui è impostare il currentcontenuto del div quando il marker viene trascinato e quindi impostare lat e lng del marker quando il trascinamento si interrompe. L'evento del mouse di Google ha un nome di proprietà "latlng" che restituisce l'oggetto "google.maps.LatLng" quando l'evento si attiva. Quindi, ciò che stiamo facendo qui è fondamentalmente utilizzare l'identificatore per questo listener che viene restituito da google.maps.event.addListenere ottenere la proprietà latLngper estrarre la posizione corrente del dragend. Una volta ottenuto quel Lat Lng quando il trascinamento si interrompe, verrà visualizzato nel tuo currentdiv:

google.maps.event.addListener(myMarker, 'dragend', function(evt){
    document.getElementById('current').innerHTML = '<p>Marker dropped: Current Lat: ' + evt.latLng.lat().toFixed(3) + ' Current Lng: ' + evt.latLng.lng().toFixed(3) + '</p>';
});

google.maps.event.addListener(myMarker, 'dragstart', function(evt){
    document.getElementById('current').innerHTML = '<p>Currently dragging marker...</p>';
});

Infine, centreremo il nostro indicatore e lo visualizzeremo sulla mappa:

map.setCenter(myMarker.position);
myMarker.setMap(map);

Fammi sapere se hai domande sulla mia risposta.


3
Questo è eccellente! Ho una mappa con un campo di immissione dell'indirizzo a completamento automatico e un indicatore trascinabile. Devo anche visualizzare le coordinate lat long se qualcuno usa il campo di input. C'è una soluzione semplice a questo?
Kirk Ross


31

Potresti semplicemente chiamare getPosition()ilMarker - hai provato?

Se siete sulla deprecato, v2 delle API JavaScript, è possibile chiamare getLatLng()suGMarker .


Penso che la mia confusione fosse quando chiamare getPosition () - è qualcosa che devo aggiungere al costruttore in modo che sappia chiedere le coordinate quando il marker viene spostato?
Genadinik

@Genadinik L'esempio a cui ho collegato nella mia modifica potrebbe essere d'aiuto; mostra come collegare un listener per gli eventi di trascinamento in cui è possibile interrogare il marker per la sua posizione e utilizzarlo come si desidera.
no.good.at. Codifica

Ah cool, e se voglio memorizzare le coordinate nella sessione o nel db, dovrei farlo tramite una chiamata AJAX? O c'è un modo più semplice?
Genadinik

Non riesco a pensare a niente di più semplice di un rapido post Ajax con l'id del marker e le sue coordinate correnti :) Ma potresti prendere in considerazione la possibilità di inviare in batch gli aggiornamenti o almeno aspettare qualche secondo fino a quando il trascinamento è completato e vedere che l'utente non lo fa inizia altri drag in modo da non inondare il server di richieste mentre i marker sono in procinto di essere trascinati - aspetta che le posizioni siano stabili, per così dire. Questo ovviamente dipende da quanto ti puoi permettere di avere il tuo stato lato server rispetto a quello che vede il client.
no.good.at. Codifica

1
getPosition()restituisce un oggetto, quindi per ottenere specificamente latitudine / longitudine, dovrai chiamare lat()e lng()rispettivamente da quello.
Jeff Puckett

20

prova questo

var latlng = new google.maps.LatLng(51.4975941, -0.0803232);
var map = new google.maps.Map(document.getElementById('map'), {
    center: latlng,
    zoom: 11,
    mapTypeId: google.maps.MapTypeId.ROADMAP
});
var marker = new google.maps.Marker({
    position: latlng,
    map: map,
    title: 'Set lat/lon values for this property',
    draggable: true
});

google.maps.event.addListener(marker, 'dragend', function (event) {
    document.getElementById("latbox").value = this.getPosition().lat();
    document.getElementById("lngbox").value = this.getPosition().lng();
});

8
// show the marker position //

console.log( objMarker.position.lat() );
console.log( objMarker.position.lng() );

// create a new point based into marker position //

var deltaLat = 1.002;
var deltaLng = -1.003;

var objPoint = new google.maps.LatLng( 
  parseFloat( objMarker.position.lat() ) + deltaLat, 
  parseFloat( objMarker.position.lng() ) + deltaLng
);

// now center the map using the new point //

objMap.setCenter( objPoint );

2

È necessario aggiungere un ascoltatore sul marcatore e ascoltare l'evento di trascinamento o trascinamento e chiedere all'evento la sua posizione quando si riceve questo evento.

Vedi http://code.google.com/intl/fr/apis/maps/documentation/javascript/reference.html#Marker per la descrizione degli eventi attivati ​​dal marcatore. E vedi http://code.google.com/intl/fr/apis/maps/documentation/javascript/reference.html#MapsEventListener per i metodi che consentono di aggiungere listener di eventi.


2

var map = new google.maps.Map(document.getElementById('map_canvas'), {
  zoom: 10,
  center: new google.maps.LatLng(13.103, 80.274),
  mapTypeId: google.maps.MapTypeId.ROADMAP
});

var myMarker = new google.maps.Marker({
  position: new google.maps.LatLng(18.103, 80.274),
  draggable: true
});

google.maps.event.addListener(myMarker, 'dragend', function(evt) {
  document.getElementById('current').innerHTML = '<p>Marker dropped: Current Lat: ' + evt.latLng.lat().toFixed(3) + ' Current Lng: ' + evt.latLng.lng().toFixed(3) + '</p>';
});
google.maps.event.addListener(myMarker, 'dragstart', function(evt) {
  document.getElementById('current').innerHTML = '<p>Currently dragging marker...</p>';
});
map.setCenter(myMarker.position);
myMarker.setMap(map);

function getLocation() {
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(showPosition);
  } else {
    x.innerHTML = "Geolocation is not supported by this browser.";
  }
}

function showPosition(position) {
  document.getElementById('current').innerHTML = '<p>Marker dropped: Current Lat: ' + position.coords.latitude + ' Current Lng: ' + position.coords.longitude + '</p>';
  var myMarker = new google.maps.Marker({
    position: new google.maps.LatLng(position.coords.latitude, position.coords.longitude),
    draggable: true
  });
  google.maps.event.addListener(myMarker, 'dragend', function(evt) {
    document.getElementById('current').innerHTML = '<p>Marker dropped: Current Lat: ' + evt.latLng.lat().toFixed(3) + ' Current Lng: ' + evt.latLng.lng().toFixed(3) + '</p>';
  });
  google.maps.event.addListener(myMarker, 'dragstart', function(evt) {
    document.getElementById('current').innerHTML = '<p>Currently dragging marker...</p>';
  });
  map.setCenter(myMarker.position);
  myMarker.setMap(map);
}
getLocation();
#map_canvas {
  width: 980px;
  height: 500px;
}

#current {
  padding-top: 25px;
}
<script src="http://maps.google.com/maps/api/js?sensor=false&.js"></script>
<!DOCTYPE html>
<html lang="en">

<head>

</head>

<body>
  <section>
    <div id='map_canvas'></div>
    <div id="current">
      <p>Marker dropped: Current Lat:18.103 Current Lng:80.274</p>
    </div>
  </section>


</body>

</html>


1
Sebbene questo codice possa rispondere alla domanda, fornire informazioni su come e perché risolve il problema ne migliora il valore a lungo termine.
L_J

-3

Ci sono molte risposte a questa domanda, che non ha mai funzionato per me (incluso il suggerimento di getPosition () che non sembra essere un metodo disponibile per gli oggetti marker). L'unico metodo che ha funzionato per me in Maps V3 è (semplicemente):

var lat = marker.lat();
var long = marker.lng();

1
Penso che intendi marker.position.lat()emarker.position.lng()
Jeff Puckett

Oppure devi usare marker.getPosition().lat()emarker.getPosition().lng()
Sergio Reis il

non puoi usare "long" come variabile
Dinith
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.