代码之家  ›  专栏  ›  技术社区  ›  Yashit

使用Autocomplete设置自定义位置后,Google Maps标记不会保持可拖动状态

  •  2
  • Yashit  · 技术社区  · 7 年前

    因此,我试图制作一个自定义的谷歌地图,用户可以使用输入(带有位置自动完成建议)来选择地图中的位置,或者拖动标记来选择位置。

    当我创建没有自动完成功能的地图时,地图上的标记仍然可以拖动。但一旦我添加了自动完成监听器,一旦使用了自动完成功能,标记就不再是可拖动的了。

    下面是我正在使用的JS代码:

    defaultLatLong = {lat: xxxx lng: xxxx};
    
    var map = new google.maps.Map(document.getElementById('map'), {
      center: defaultLatLong,
      zoom: 13,
      mapTypeId: 'roadmap'
    });
    
    var input = document.getElementById('pac-input');
    
    var autocomplete = new google.maps.places.Autocomplete(input);
    
    autocomplete.bindTo('bounds',map);
    map.controls[google.maps.ControlPosition.TOP_LEFT].push(input);
    
    var marker = new google.maps.Marker({
        map: map,
        position: defaultLatLong,
        draggable: true,
        clickable: true
    });
    
    google.maps.event.addListener(marker, 'dragend', function(marker){
        var latLng = marker.latLng;
        currentLatitude = latLng.lat();
        currentLongitude = latLng.lng();
        var latlng = {lat: currentLatitude, lng: currentLongitude};
        var geocoder = new google.maps.Geocoder;
        geocoder.geocode({'location': latlng}, function(results, status) {
              if (status === 'OK') {
                if (results[0]) {
                  input.value = results[0].formatted_address;
                } else {
                  window.alert('No results found');
                }
              } else {
                window.alert('Geocoder failed due to: ' + status);
              }
            });
    });
    
    autocomplete.addListener('place_changed', function() {
        var place = autocomplete.getPlace();
        if (!place.geometry) {
          return;
        }
        if (place.geometry.viewport) {
          map.fitBounds(place.geometry.viewport);
        } else {
          map.setCenter(place.geometry.location);
        }
    
        marker.setPlace({
          placeId: place.place_id,
          location: place.geometry.location
        });
    
        currentLatitude = place.geometry.location.lat();
        currentLongitude = place.geometry.location.lng();
    
      });
    

    这个问题有什么解决方案吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   geocodezip    2 年前

    如果您使用 .setPlace() 标记的方法它是不可拖动的。

    使用 .setPosition() 方法。

    替换:

    marker.setPlace({
      placeId: place.place_id,
      location: place.geometry.location
    });
    

    使用:

    marker.setPosition(place.geometry.location);
    

    proof of concept fiddle

    代码段:

    defaultLatLong = {
      lat: 40.7127753,
      lng: -74.0059728
    };
    
    var map = new google.maps.Map(document.getElementById('map'), {
      center: defaultLatLong,
      zoom: 13,
      mapTypeId: 'roadmap'
    });
    
    var input = document.getElementById('pac-input');
    
    var autocomplete = new google.maps.places.Autocomplete(input);
    
    autocomplete.bindTo('bounds', map);
    map.controls[google.maps.ControlPosition.TOP_LEFT].push(input);
    
    var marker = new google.maps.Marker({
      map: map,
      position: defaultLatLong,
      draggable: true,
      clickable: true
    });
    
    google.maps.event.addListener(marker, 'dragend', function(marker) {
      var latLng = marker.latLng;
      currentLatitude = latLng.lat();
      currentLongitude = latLng.lng();
      var latlng = {
        lat: currentLatitude,
        lng: currentLongitude
      };
      var geocoder = new google.maps.Geocoder;
      geocoder.geocode({
        'location': latlng
      }, function(results, status) {
        if (status === 'OK') {
          if (results[0]) {
            input.value = results[0].formatted_address;
          } else {
            window.alert('No results found');
          }
        } else {
          window.alert('Geocoder failed due to: ' + status);
        }
      });
    });
    
    autocomplete.addListener('place_changed', function() {
      var place = autocomplete.getPlace();
      if (!place.geometry) {
        return;
      }
      if (place.geometry.viewport) {
        map.fitBounds(place.geometry.viewport);
      } else {
        map.setCenter(place.geometry.location);
      }
    
      marker.setPosition(place.geometry.location);
    
      currentLatitude = place.geometry.location.lat();
      currentLongitude = place.geometry.location.lng();
    
    });
    html,
    body,
    #map {
      height: 100%;
      width: 100%;
      margin: 0px;
      padding: 0px
    }
    <script src="https://maps.googleapis.com/maps/api/js?libraries=geometry,places&key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk"></script>
    <input id="pac-input" />
    <div id="map"></div>