Отримання Lat / Lng від маркера Google


89

Я створив карту Google Maps із маркером, який можна перетягнути. Коли користувач перетягує маркер, мені потрібно знати нові широту та довготу, але я не розумію, який найкращий підхід до цього.

Як я можу отримати нові координати?

Відповіді:


132

Ось демонстрація JSFiddle . В API Карт Google V3 досить просто відстежувати ширину та довжину маркера, який можна перетягнути. Почнемо з наступних HTML та CSS як основи.

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

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

#current{
     padding-top: 25px;
}

Ось наш початковий JavaScript, який ініціалізує карту Google. Ми створюємо маркер, який ми хочемо перетягнути, і встановлюємо його властивість перетягування на true. Звичайно, майте на увазі, що його слід прикріпити до події завантаження вашого вікна, щоб воно завантажилося, але я перейду до коду:

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
});

Тут ми додаємо дві події, dragstartщоб відстежувати початок перетягування та dragendтягнути, коли маркер перестає перетягуватися, і спосіб, яким ми його прикріплюємо, використовувати google.maps.event.addListener. Що ми тут робимо, це встановлюємо currentвміст div , коли маркер перетягується, а потім встановлюємо lat та lng маркера, коли перетягування зупиняється. Подія миші Google має назву властивості 'latlng', яка повертає об'єкт 'google.maps.LatLng', коли подія спрацьовує. Отже, те, що ми робимо тут, - це в основному використання ідентифікатора для цього слухача, який повертається методом google.maps.event.addListenerі отримує властивість latLngвитягувати поточну позицію драгенда. Як тільки ми отримаємо цю Lat Lng, коли перетягування припиниться, ми відобразимо у вашому 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>';
});

Нарешті, ми відцентруємо наш маркер і покажемо його на карті:

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

Повідомте мене, якщо у вас виникнуть запитання щодо моєї відповіді.


3
Це чудово! У мене є карта з полем автоматичного заповнення адреси, а також маркером, який можна перетягнути. Мені також потрібно відображати довгі координати, якщо хтось використовує поле введення. Чи є просте рішення цього?
Кірк Росс

38
var lat = marker.getPosition().lat();
var lng = marker.getPosition().lng();

Більше інформації можна знайти в API Карт Google - LatLng


як створити екземпляр markerперед викликом методів на ньому? наприклад, я переглядаю developers.google.com/maps/documentation/javascript/examples/… і після того, як буде здійснено пошук і з’явиться маркер, як отримати лат / довжину цього маркера?
user1063287

31

Ви можете просто подзвонити getPosition()наMarker - ви пробували це?

Якщо ви перебуваєте на застарілій, v2 з API JavaScript, ви можете зателефонувати getLatLng()наGMarker .


Я думаю, де моя плутанина полягала в тому, коли викликати getPosition () - це щось, що я повинен додати до конструктора, щоб він знав запитувати координати при переміщенні маркера?
Генадінік 13.03.11

@Genadinik Приклад, на який я посилався у своєму редагуванні, може допомогти; він показує, як приєднати слухач до подій перетягування, де ви можете запитати маркер щодо його позиції та використовувати його як завгодно.
no.odod.at.coding

Ах круто, і якщо я хочу зберегти координати в сеансі або в базі даних, чи слід це робити за допомогою виклику AJAX? Або є простіший спосіб?
Генадінік 13.03.11

Я не можу придумати нічого простішого, ніж швидкий допис Ajax з ідентифікатором маркера та його поточними координатами :) Але ви можете подумати про пакетне оновлення або, принаймні, почекати кілька секунд, поки перетягування не буде завершено, і побачити, що користувач не починайте більше перетягування, щоб ви не заливали сервер запитами, поки маркери перетягуються - зачекайте, поки позиції стабільні, так би мовити. Це, звичайно, залежить від того, наскільки далеко ви можете дозволити собі стан свого сервера на відміну від того, що бачить клієнт.
no.odod.at.coding

1
getPosition()повертає об'єкт, тому, щоб конкретно отримати широту / довготу, вам доведеться зателефонувати lat()і lng()відповідно з цього.
Джефф Пакетт

20

спробуйте це

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

Вам слід додати слухача на маркер та прослухати подію перетягування або перетягування та запитати подію про її місце, коли ви отримаєте цю подію.

Див. Http://code.google.com/intl/fr/apis/maps/documentation/javascript/reference.html#Marker для опису подій, викликаних маркером. І див. Http://code.google.com/intl/fr/apis/maps/documentation/javascript/reference.html#MapsEventListener щодо методів, що дозволяють додавати слухачі подій.


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
Хоча цей код може відповісти на питання, надання інформації про те, як і чому він вирішує проблему, покращує його довгострокове значення.
L_J

-3

На це питання є багато відповідей, які ніколи не працювали для мене (включаючи пропозицію getPosition (), яка, здається, не є доступним методом для об’єктів маркерів). Єдиний метод, який працював у мене на картах V3 (це просто):

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

1
Думаю, ви маєте на увазі marker.position.lat()іmarker.position.lng()
Джефф Пакетт

Або вам потрібно скористатися marker.getPosition().lat()іmarker.getPosition().lng()
Серхіо Рейс

ви не можете використовувати "довгий" як змінну
Дініт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.