【问题标题】:Get lat and lng from draggable pushed marker (places search box)从可拖动的推送标记(位置搜索框)获取 lat 和 lng
【发布时间】:2017-10-02 12:57:26
【问题描述】:

用户必须在注册表单上选择他们的位置,我使用位置搜索框。
对于以后的应用程序,我需要精确的 lat 和 lng,因此我需要一个可拖动的标记。

我提供了Plunker

已经尝试过各种组合但都没有成功,例如:

google.maps.event.addListener(markers, 'dragend', function (event) {
    document.getElementById("lat").value = event.latLng.lat();
    document.getElementById("lng").value = event.latLng.lng();

    $('#lat').val(event.latLng.lat())  ;
    $('#lng').val(event.latLng.lng())  ;


});

lat lng 框不会在拖动时更新。听众被忽略。

编辑附加信息:“标记”是我创建标记的变量。
#lat, #lng 是隐藏输入字段的 ID。

EDIT2:我从 plunker 中清除了我的整个代码,只针对这个问题使用了必要的代码:

var inputradius = document.getElementById('myRange');
function initAutocomplete() {

  var CenterToCountry = {lat: 50.9725, lng: 11.4804};
  var map = new google.maps.Map(document.getElementById('map'), {
    center: CenterToCountry,
    zoom: 6,
    mapTypeId: 'roadmap',
    streetViewControl: false,
    mapTypeControl: false
  });

  var input = document.getElementById('pac-input');
  var searchBox = new google.maps.places.SearchBox(input);

  map.controls[google.maps.ControlPosition.TOP_LEFT].push(input);

  map.addListener('bounds_changed', function() {
    searchBox.setBounds(map.getBounds());
  });

  var markers = [];

  searchBox.addListener('places_changed', function() {
    var places = searchBox.getPlaces();

    if (places.length === 0) {
      return;
    }

    markers.forEach(function(marker) {
      marker.setMap(null);
    });

    markers = [];

    var bounds = new google.maps.LatLngBounds();

    places.forEach(function(place) {
      if (!place.geometry) {
        console.log("Returned place contains no geometry");
        return;
      }


      markers.push(new google.maps.Marker({
        map: map,
        title: place.name,
        draggable:true,
        position: place.geometry.location
      }));


      var location = place.geometry.location;
      var lat = location.lat();
      var lng = location.lng();

      document.getElementById("lat").value = lat;
      document.getElementById("lng").value = lng;

      if (place.geometry.viewport) {
        bounds.union(place.geometry.viewport);
      } else {
        bounds.extend(place.geometry.location);
      }

    map.fitBounds(bounds);
  });
});


               google.maps.event.addListener(markers, 'dragend', function () {
                var lat = markers.getPosition().lat();
                var lng = markers.getPosition().lng();


                $('#lat').val(lat);
                $('#lng').val(lng);
            });



}

【问题讨论】:

  • 什么是markers
  • @geocodezip 嘿,检查 plunker。这是我标记的 var。我在那里使用标记而不是标记;D.
  • 所需信息应在问题本身中(不是指向外部网站的链接)
  • @geocodezip 抱歉,我认为这是合乎逻辑的。我现在添加。

标签: javascript google-maps google-maps-api-3 google-maps-markers


【解决方案1】:

您好,您可以在代码中使用 places_changed 事件,

google.maps.event.addListener(searchBox, 'places_changed', function () {
....
...
var places = searchBox.getPlaces();
for (var i = 0, place; place = places[i]; i++) {

    $('#MAP_LAT').val(place.geometry.location.lat());
    $('#MAP_LNG').val(place.geometry.location.lng());
}

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

请注意,我没有尝试过。

我已经测试过了,代码如下,我认为你无法正确获取标记变量或者我创建了标记并可以处理它;

 if ($('#MAP_LAT').val() > 0 && $('#MAP_LNG').val() > 0) {
            markerNew = new google.maps.Marker({
                position: {lat: parseFloat($('#MAP_LAT').val()), lng: parseFloat($('#MAP_LNG').val())},//event.latLng,//
                map: map,
                icon: '../maps/GoogleMapsMarkers/original/red_MarkerH.png',
                title: 'My Marker',
                draggable: true,
                animation: google.maps.Animation.DROP
            });
            google.maps.event.addListener(markerNew, 'dragend', function () {
                var lat = markerNew.getPosition().lat();
                var lng = markerNew.getPosition().lng();
                $('#MAP_LAT').val(lat);
                $('#MAP_LNG').val(lng);
            });
        }

我找到了,我认为你不能使用标记变量, 它是编辑你的 plunker 代码 screenshot your plunker code after edited

你可以看到整个 plunker 代码进行测试,在你的函数 "places.forEach(function(place) {" 之后添加这个代码

  console.log(markers);
  if(markers != null){
  google.maps.event.addListener(markers[0], 'dragend', function () {

  var lat = markers[0].getPosition().lat();
  var lng = markers[0].getPosition().lng();
  console.log(lat);
  });
  }

,享受

【讨论】:

  • 两者都不起作用。我认为第一个只会在我在搜索框中输入新地址时触发,而第二个问题就像我的代码一样,监听器会被忽略。 @Ferhat BAŞ
  • 您好,我已经测试过了,它可以工作,如果您创建了标记,那么您可以获得位置,
  • 我在我的 plunker 预览中添加了您的代码。您可以在那里看到它不适用于地点搜索框功能。
  • imgur.com/a/Ru6bm 你能告诉我我做错了什么吗? oO @Ferhat BAŞ
  • 你应该显示 addListener 函数监听了哪个对象,你没有把正确的对象(标记)交给函数,你的错误就是这个。
最近更新 更多