Google işaretçisinden Lat / Lng alma


89

Sürüklenebilir bir işaretleyiciye sahip bir Google Haritalar haritası yaptım. Kullanıcı işaretçiyi sürüklediğinde, yeni enlem ve boylamı bilmem gerekiyor, ancak bunu yapmak için en iyi yaklaşımın ne olduğunu anlamıyorum.

Yeni koordinatları nasıl alabilirim?

Yanıtlar:


132

İşte JSFiddle Demosu . Google Maps API V3'te, sürüklenebilir bir işaretçinin enlem ve boylamını izlemek oldukça kolaydır. Temel olarak aşağıdaki HTML ve CSS ile başlayalım.

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

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

#current{
     padding-top: 25px;
}

İşte google haritasını başlatan ilk JavaScript'imiz. Sürüklemek istediğimiz bir işaretleyici oluşturuyoruz ve bunun sürüklenebilir özelliğini true olarak ayarlıyoruz. Elbette, yüklenebilmesi için pencerenizin bir yükleme olayına eklenmesi gerektiğini unutmayın, ancak koda geçeceğim:

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

Burada dragstart, sürüklemenin başlangıcını izlemek ve dragendişaretleyicinin sürüklenmesini bıraktığında kaymak için iki olay ekliyoruz ve bunu kullanma şeklimiz google.maps.event.addListener. Burada yaptığımız şey current, işaretçi sürüklenirken div'in içeriğini ayarlamak ve ardından sürükleme durduğunda işaretleyicinin enlem ve boylamını ayarlamaktır. Google fare olayının, olay tetiklendiğinde "google.maps.LatLng" nesnesini döndüren "latlng" özellik adı vardır. Yani, burada yaptığımız şey, temelde bu dinleyici için, tarafından döndürülen google.maps.event.addListenerve latLngdragend'in mevcut konumunu çıkarmak için özelliği alan tanımlayıcıyı kullanmaktır. Sürükleme durduğunda Lat Lng'yi aldığımızda, div'inizde göstereceğiz current:

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

Son olarak, işaretçimizi ortalayacağız ve haritada göstereceğiz:

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

Cevabımla ilgili herhangi bir sorunuz olursa bana bildirin.


3
Bu mükemmel! Otomatik tamamlama adres giriş alanına ve sürüklenebilir bir işaretleyiciye sahip bir haritam var. Birisi giriş alanını kullanıyorsa, enlem uzun koordinatları da görüntülemem gerekiyor. Bunun basit bir çözümü var mı?
Kirk Ross


31

Sadece diyebiliriz getPosition()üzerindeMarker - Bunu denediniz mi?

JavaScript API kullanımdan kaldırıldı, v2 iseniz, çağırabilir getLatLng()üzerindeGMarker .


Sanırım kafa karışıklığım getPosition () 'u ne zaman çağırmam gerektiğidir - yapıcıya eklemem gereken bir şey mi, böylece işaretleyici hareket ettirildiğinde koordinatları sormayı biliyor mu?
Genadinik

@Genadinik Düzenlememde bağlantı verdiğim örnek yardımcı olabilir; Bu, işaretçiyi konumu için sorgulayabileceğiniz ve istediğiniz gibi kullanabileceğiniz drag olayları için bir dinleyicinin nasıl ekleneceğini gösterir.
no.good.at.coding

Harika, ve koordinatları oturumda veya db'de saklamak istersem, bunu bir AJAX çağrısı yoluyla mı yapmalıyım? Yoksa daha basit bir yol mu var?
Genadinik

İşaretçi kimliğine ve mevcut koordinatlarına sahip hızlı bir Ajax gönderisinden daha basit bir şey düşünemiyorum :) Ancak güncellemeleri toplu olarak yapmayı veya sürükleme tamamlanana kadar en azından birkaç saniye beklemeyi ve kullanıcının bunu yapmadığını görmeyi düşünebilirsiniz. daha fazla sürüklemeye başlayın, böylece işaretçiler sürüklenme sürecindeyken sunucuyu isteklerle boğmazsınız - tabiri caizse konumlar kararlı hale gelene kadar bekleyin. Bu, elbette, istemcinin gördüklerine kıyasla, sunucu tarafı durumunuzu ne kadar geride kaldığınıza bağlıdır.
no.good.at.coding

1
getPosition() bir nesne döndürür, bu nedenle özellikle enlem / boylamı elde etmek için aramanız gerekir lat() ve lng()bundan sırasıyla.
Jeff Puckett

20

bunu dene

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

İşaretçiye bir dinleyici eklemeli, sürükle veya sürükleme olayını dinlemeli ve bu olayı aldığınızda olaya konumunu sormalısınız.

İşaretçi tarafından tetiklenen olayların açıklaması için http://code.google.com/intl/fr/apis/maps/documentation/javascript/reference.html#Marker adresine bakın . Etkinlik dinleyicileri eklemeye izin veren yöntemler için http://code.google.com/intl/fr/apis/maps/documentation/javascript/reference.html#MapsEventListener'a bakın .


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
Bu kod soruyu yanıtlayabilirken, sorunu nasıl ve neden çözdüğüne dair bilgi sağlamak, uzun vadeli değerini artırır.
L_J

-3

Bu soruya benim için hiç işe yaramayan pek çok yanıt var (buna işaret nesneleri için uygun bir yöntem gibi görünmeyen getPosition () önerme dahil). V3 haritalarında benim için çalışan tek yöntem (basitçe):

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

1
Demek istediniz marker.position.lat()vemarker.position.lng()
Jeff Puckett

Yoksa kullanmak gerekir marker.getPosition().lat()vemarker.getPosition().lng()
Sergio Reis

değişken olarak "uzun" kullanamazsınız
Dinith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.