2

我已经在搜索中实现了谷歌地图 API。我的代码在自动生成位置之前正常工作,但我想要这样的设施,通过只提供城市名称而不是整个格式字符串,我可以得到准确的位置。

例如:

请检查此图片http://demo.ncryptedprojects.com/nct_bnb_clone_new/Untitled.png

我在搜索框中输入城市名称孟买,谷歌地图 API 检索下拉列表中的所有值。当有人没有从下拉列表中选择任何值并在城市名称后直接按 Enter 键时,我无法在地图中准确搜索孟买市。我真正想做的是,当有人输入城市名称然后搜索时,它应该自动从下拉菜单中搜索第一次出现,例如“印度孟买马哈拉施特拉邦”

HTML 表单

<input name="location" id="location" type="text"/>

谷歌地图API

<script src="https://maps.googleapis.com/maps/api/js?sensor=false&libraries=places"></script>

$(function() {
            var e;
            e = $('.search-form input[name="location"]')[0];
            return new google.maps.places.Autocomplete(e, {
                types: ["geocode"]
            })

    });
4

1 回答 1

0

这很棘手,因为默认情况下,无论下拉菜单中的建议如何,谷歌地方都会查找地图中心附近的位置。

因此,您必须从下拉列表中找到第一个建议,document.querySelector('.pac-item')- 提取位置并使用地理编码器查找该位置的 latlng。

提取位置的代码:

function extractLocation(item) {
    var text = item.innerText || item.textContent;
    var upper = text.toUpperCase();
    var result='';
    for (var i=0;i<text.length;i++) {
        if (text[i]==upper[i]) {
            result+=' ';
        }
        result+=text[i];
    }
    return result;
}

在搜索框输入,选择第一个建议,提取位置,通过地理编码器查找 latlng 并放置标记:

input.onkeyup = function(e) {
   var code = (e.keyCode ? e.keyCode : e.which);
   var places = searchBox.getPlaces();
   if (code == 13 && places!=[]) {
     var firstSuggestion = document.querySelector('.pac-item');
     var query = extractLocation(firstSuggestion);
     geocoder.geocode({"address":query }, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
          clearMarkers();   
          var latLng = new google.maps.LatLng(results[0].geometry.location.lat(), results[0].geometry.location.lng());
          var marker = new google.maps.Marker({
             map: map,
             title: results[0].address_components[0].long_name,
             position: latLng,
          });
          markers.push(marker);
          map.setCenter(latLng);
          map.setZoom(10);
       }
     });
   } 
}

工作小提琴-> http://jsfiddle.net/cdnT8/

于 2013-10-17T15:13:34.073 回答