【问题标题】:How to populate a google maps autocomplete search result with custom options on an interactive map?如何在交互式地图上使用自定义选项填充谷歌地图自动完成搜索结果?
【发布时间】:2016-08-14 11:15:13
【问题描述】:

所以我坚持这一点 - 我正在构建一个网站,根据他们输入的位置显示用户附近的活动,即如果我在搜索框中输入“肯特,伦敦”或邮政编码,它'将显示带有大头针的交互式地图和/或详细说明附近活动的列表 - 本质上类似于 Trivago 在您输入位置时显示酒店的功能,并且您可以查看列表/显示地图。

到目前为止,我已经设法通过创建一个输入框并像这样调用 Google Maps API 来让自动完成功能在现场工作:

    <head>
...
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=places"></script>
...
</head>
<body>
...
<input id="searchTextField" type="text" size="50">
...
</body>

然后调用一个JS函数:

    function initialize() {

var input = document.getElementById('searchTextField');
var autocomplete = new google.maps.places.Autocomplete(input);
}

google.maps.event.addDomListener(window, 'load', initialize);

但是我不知道怎么做:

  1. 在用户按 Enter 或单击 “搜索”按钮,显示带有交互式地图的页面 - 待 老实说,我认为这将是一个 onClick 功能或类似的东西 如果有人可以澄清并向我提供正确的信息 用这个打开新页面的语法?

    1. 在这个新页面上 - 我希望交互式地图显示的数据取决于用户输入的位置 - 我可以 感谢并非所有地点都能正常工作,我不打算 覆盖整个国家-相反,我想从 一两个位置并在依赖于它们的地图上列出活动 - 因此,例如,如果我输入“肯特”甚至是邮政编码-我将如何 要显示地图吗?

    2. 至于活动本身,我知道我想放入哪些活动,但是按照上述要求输入和调用这些活动的正确方法是什么?我需要创建然后从某种数据库中导入它们吗?这些是否可以作为图钉填充在地图上,并且当您单击图钉时会显示更多信息?或者作为地图侧面或下方的列表?

感谢任何帮助我能理解这是一个复杂的问题,我绝不打算做一些像 Trivago 这样规模的事情——在他们的搜索精神下,更像是一个超级低调的版本。

【问题讨论】:

    标签: javascript html css google-maps


    【解决方案1】:

    您可以尝试从Google Maps JavaScript API提供的不同示例代码开始。

    这里是如何使用Place Autocomplete的示例代码。

    // This example requires the Places library. Include the libraries=places
    // parameter when you first load the API. For example:
    // <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places">
    
    function initMap() {
      var map = new google.maps.Map(document.getElementById('map'), {
        center: {lat: -33.8688, lng: 151.2195},
        zoom: 13
      });
      var input = /** @type {!HTMLInputElement} */(
          document.getElementById('pac-input'));
    
      var types = document.getElementById('type-selector');
      map.controls[google.maps.ControlPosition.TOP_LEFT].push(input);
      map.controls[google.maps.ControlPosition.TOP_LEFT].push(types);
    
      var autocomplete = new google.maps.places.Autocomplete(input);
      autocomplete.bindTo('bounds', map);
    
      var infowindow = new google.maps.InfoWindow();
      var marker = new google.maps.Marker({
        map: map,
        anchorPoint: new google.maps.Point(0, -29)
      });
    
      autocomplete.addListener('place_changed', function() {
        infowindow.close();
        marker.setVisible(false);
        var place = autocomplete.getPlace();
        if (!place.geometry) {
          window.alert("Autocomplete's returned place contains no geometry");
          return;
        }
    
    
    
        // If the place has a geometry, then present it on a map.
        if (place.geometry.viewport) {
          map.fitBounds(place.geometry.viewport);
        } else {
          map.setCenter(place.geometry.location);
          map.setZoom(17);  // Why 17? Because it looks good.
        }
        marker.setIcon(/** @type {google.maps.Icon} */({
          url: place.icon,
          size: new google.maps.Size(71, 71),
          origin: new google.maps.Point(0, 0),
          anchor: new google.maps.Point(17, 34),
          scaledSize: new google.maps.Size(35, 35)
        }));
        marker.setPosition(place.geometry.location);
        marker.setVisible(true);
    
        var address = '';
        if (place.address_components) {
          address = [
            (place.address_components[0] && place.address_components[0].short_name || ''),
            (place.address_components[1] && place.address_components[1].short_name || ''),
            (place.address_components[2] && place.address_components[2].short_name || '')
          ].join(' ');
        }
    
        infowindow.setContent('<div><strong>' + place.name + '</strong><br>' + address);
        infowindow.open(map, marker);
      });
    
      // Sets a listener on a radio button to change the filter type on Places
      // Autocomplete.
      function setupClickListener(id, types) {
        var radioButton = document.getElementById(id);
        radioButton.addEventListener('click', function() {
          autocomplete.setTypes(types);
        });
      }
    
      setupClickListener('changetype-all', []);
      setupClickListener('changetype-address', ['address']);
      setupClickListener('changetype-establishment', ['establishment']);
      setupClickListener('changetype-geocode', ['geocode']);
    }
    

    现在,您可以将此代码作为起点,然后尝试在此处应用您希望应用程序执行的不同功能。

    【讨论】:

      猜你喜欢
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      • 2018-08-25
      • 2018-07-04
      • 2012-01-13
      • 2012-11-21
      相关资源
      最近更新 更多