如何在 Google 地图自动完成建议中显示附加信息?

2023-12-10

我正在使用 Google 地方信息自动完成功能按名称选择城市。目前,它在建议下拉列表中仅显示城市名称及其所属国家/地区。

我检查并发现,选择城市时填充的“address_components”对象具有其他属性,例如州/省和地址的其他部分。因此,很明显,Google 的 API 不仅提供城市和国家/地区名称,还提供其他信息。

我想要实现的是,在建议下拉列表中显示一些附加数据。

有没有办法做到这一点?

(I have marked on the screenshot where I need to display the additional attributes)enter image description here

这是代码。

 <script src="https://maps.googleapis.com/maps/api/js?key=API_KEY&libraries=places&callback=initAutocomplete&query=locality" async defer></script>

 <script>
   var searchBox;
   function initAutocomplete() {

   var options = {types: ['(cities)']};

   var input = document.getElementById('placeAuto');
    searchBox = new google.maps.places.Autocomplete(input);
   searchBox.addListener('place_changed', fillInAddress);
   }

  function fillInAddress()
  {
      var place = searchBox.getPlace();
      console.log(place);
  }

  </script>

正如我已经评论过的,您可以通过使用自动完成和地点服务以及getPlacePredictions方法,但是我不推荐这种方法因为它会向 API 发出大量请求(每次用户在地址字段中键入内容时,每个结果对应一个请求)。

以全屏模式查看代码片段,因为它不适合下面的内容或检查它JSFiddle.

在此示例中,我在自动完成结果中添加了地点纬度和经度。

var autocompleteService, placesService, results, map;

function initialize() {

  results = document.getElementById('results');

  var mapOptions = {
    zoom: 5,
    center: new google.maps.LatLng(50, 50)
  };

  map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);

  // Bind listener for address search
  google.maps.event.addDomListener(document.getElementById('address'), 'input', function() {

    results.style.display = 'block';
    getPlacePredictions(document.getElementById('address').value);
  });

  // Show results when address field is focused (if not empty)
  google.maps.event.addDomListener(document.getElementById('address'), 'focus', function() {

    if (document.getElementById('address').value !== '') {

      results.style.display = 'block';
      getPlacePredictions(document.getElementById('address').value);
    }
  });

  // Hide results when click occurs out of the results and inputs
  google.maps.event.addDomListener(document, 'click', function(e) {

    if ((e.target.parentElement.className !== 'pac-container') && (e.target.parentElement.className !== 'pac-item') && (e.target.tagName !== 'INPUT')) {

      results.style.display = 'none';
    }
  });

  autocompleteService = new google.maps.places.AutocompleteService();
  placesService = new google.maps.places.PlacesService(map);
}

// Get place predictions
function getPlacePredictions(search) {

  autocompleteService.getPlacePredictions({
    input: search,
    types: ['geocode']
  }, callback);
}

// Place search callback
function callback(predictions, status) {

  // Empty results container
  results.innerHTML = '';

  // Place service status error
  if (status != google.maps.places.PlacesServiceStatus.OK) {
    results.innerHTML = '<div class="pac-item pac-item-error">Your search returned no result. Status: ' + status + '</div>';
    return;
  }

  // Build output for each prediction
  for (var i = 0, prediction; prediction = predictions[i]; i++) {

    // Get place details to inject more details in autocomplete results
    placesService.getDetails({
      placeId: prediction.place_id
    }, function(place, serviceStatus) {

      if (serviceStatus === google.maps.places.PlacesServiceStatus.OK) {

        // Create a new result element
        var div = document.createElement('div');

        // Insert inner HTML
        div.innerHTML += '<span class="pac-icon pac-icon-marker"></span>' + place.adr_address + '<div class="pac-item-details">Lat: ' + place.geometry.location.lat().toFixed(3) + ', Lng: ' + place.geometry.location.lng().toFixed(3) + '</div>';

        div.className = 'pac-item';

        // Bind a click event
        div.onclick = function() {

          var center = place.geometry.location;
          var marker = new google.maps.Marker({
            position: center,
            map: map
          });

          map.setCenter(center);
        }

        // Append new element to results
        results.appendChild(div);
      }
    });
  }
}

google.maps.event.addDomListener(window, 'load', initialize);
body,
html {
  font-family: Arial, sans-serif;
  padding: 0;
  margin: 0;
  height: 100%;
}

#map-canvas {
  height: 150px;
  margin-bottom: 5px;
}

table {
  border-collapse: collapse;
  margin-left: 20px;
}

table td {
  padding: 3px 5px;
}

label {
  display: inline-block;
  width: 160px;
  font-size: 11px;
  color: #777;
}

input {
  border: 1px solid #ccc;
  width: 170px;
  padding: 3px 5px;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  box-shadow: 0 2px 6px rgba(0, 0, 0, .1);
}

.pac-container {
  background-color: #fff;
  z-index: 1000;
  border-radius: 2px;
  font-size: 11px;
  box-shadow: 0 2px 6px rgba(0, 0, 0, .3);
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
  overflow: hidden;
  width: 350px;
}

.pac-icon {
  width: 15px;
  height: 20px;
  margin-right: 7px;
  margin-top: 6px;
  display: inline-block;
  vertical-align: top;
  background-image: url(https://maps.gstatic.com/mapfiles/api-3/images/autocomplete-icons.png);
  background-size: 34px;
}

.pac-icon-marker {
  background-position: -1px -161px;
}

.pac-item {
  cursor: pointer;
  padding: 0 4px;
  text-overflow: ellipsis;
  overflow: hidden;
  white-space: nowrap;
  line-height: 30px;
  vertical-align: middle;
  text-align: left;
  border-top: 1px solid #e6e6e6;
  color: #999;
}

.pac-item:hover {
  background-color: #efefef;
}

.pac-item-details {
  color: lightblue;
  padding-left: 22px;
}

.pac-item-error,
.pac-item-error:hover {
  color: #aaa;
  padding: 0 5px;
  cursor: default;
  background-color: #fff;
}
<div id="map-canvas"></div>
<table>
  <tr>
    <td>
      <label for="address">Address:</label>
    </td>
  </tr>
  <tr>
    <td>
      <input id="address" placeholder="Enter address" type="text" tabindex="1" />
    </td>
  </tr>
  <tr>
    <td colspan="2">
      <div id="results" class="pac-container"></div>
    </td>
  </tr>
</table>


<script src="https://maps.googleapis.com/maps/api/js?libraries=places&key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk"></script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Google 地图自动完成建议中显示附加信息? 的相关文章

  • 创建地图后向 Google 地图 v3 添加标记

    我对使用 Google Maps API 比较陌生 现在我正在开发一个项目 用户可以选择各种搜索过滤器并查看结果自动显示在地图上 而无需重新加载页面 到目前为止 我的方法是创建一个控制地图的 Javascript 对象 以便我可以按照我的意
  • 来自 geoJSON 的 Google 地图航点

    我想从 geoJSON 文件加载行程 目前来说 它是有效的 但只有两点 但我需要添加 4 或 5 个航路点 我的代码只读取前两个点并将它们设置为起点和目的地 这是我的代码 google maps event addListener map
  • 使用 Google Autocomplete API 根据位置名称获取纬度和经度

    我的页面中有一个文本框 它获取位置名称和带有文本的按钮getLat Long 现在点击我的按钮我必须显示一个警报latitude and longitude文本框中的位置 有什么建议吗 您可以使用谷歌地理编码服务 http code goo
  • 如何免费使用谷歌路线API

    我使用 Google Directions Api 的限制是每天 2500 条路线查询 而且是免费的 一切正常 现在 当它明确写入时 在请求 api 时 它会突然出现此错误https developers google com maps d
  • Google Map v3 地图加载事件[重复]

    这个问题在这里已经有答案了 是否有任何侦听器来处理完全加载的地图 就我而言 我需要从地图获取边界 所以我这样做了 google maps event addListener this map bounds changed this mapL
  • Google 地图第二次无法加载 - AngularJS

    我正在使用 GoogleMap API angular google maps js 包 并且我有一个非常奇怪的行为 The first time I load it i get the full map loaded like here
  • 在 Google Map API V3 中隐藏信息窗口上的阴影

    我想隐藏 Google Map API V3 中 infowindow 上的阴影 我尝试访问 Floatshadow 窗格 但我不知道该怎么做
  • 将事件添加到 Google Maps API InfoWindow 内的元素

    我想在 Google Maps API v3 InfoWindow 内放置一个带有输入字段和提交按钮的表单 提交后 我想调用一个函数 该函数使用输入字段中输入的地址启动方向服务 这是我的代码 我目前只测试方向事件是否被触发 我已经编写了完整
  • 414 请求 URI 太大错误 Google 地图 v3

    当我调用构造函数来创建具有超过 15 个不同 KMZ 文件的新 KmlLayer 时 似乎会发生此错误 构造函数的调用是 var layer new google maps KmlLayer http 我每次都可以使用 15 个不同的 KM
  • Google 地图 InfoBubble PixelOffset(从标记上方的默认位置移动)

    我正在尝试实现一个自定义 infoBubble 它的框打开到标记的侧面 而不是顶部的默认位置 事实证明这比预期的要困难 使用普通的infoWindow 您可以使用pixelOffset 请参阅此处文档 https developers go
  • 如何找到特定路线上两点之间的距离?

    我正在为我的大学开发一个 Android 应用程序 可以帮助学生跟踪大学巴士的当前位置 并为他们提供巴士到达他们的预计时间 截至目前 我获取了公交车的当前位置 通过公交车上的设备 和学生的位置 我陷入了必须找到两个 GPS 坐标之间的距离的
  • GeoJson 要素坐标以米为单位,而不是 [lng, lat]。如何在google地图上显示?

    例如 360590 555610 lng lat 以米为单位 来自 google 地图 api GeoJson数据 type FeatureCollection features type Feature geometry type Mul
  • Google 地图 API:忽略 DirectionService 请求中的季节性限制

    我目前正在开发一张地图 其中显示两点之间的最短路线 使用不同的交通工具 我注意到 有时 例如在冬季关闭的道路不会被考虑在内 我发现我可以使用方向服务 下面的代码 忽略高速公路 收费站和渡轮 但我一生都无法弄清楚如何 是否可以忽略季节性限制
  • 检查外部 JS 库是否已加载[重复]

    这个问题在这里已经有答案了 我当前的设置是用户单击链接来动态加载内容 其中还包括加载脚本 我希望能够测试是否加载了外部脚本 特别是 Google Maps JS API 如果没有加载 则继续执行此操作 这是我的代码 if href cont
  • 致命错误:在字典中发现“地理编码地标”类型的重复键。 (Mapbox 地理编码器)

    我引用 这通常意味着要么该类型违反了 Hashable 的要求 要么此类字典的成员在插入后发生了变化 我正在使用 Mapbox Geocoder 当发生此运行时错误时 我的 XCode 将我带到线程 1 0 swift runtime on
  • Bootstrap 导航栏与 Google 位置重叠自动完成下拉菜单

    我有一个导航栏 我试图在其中添加一个地点搜索框 除了谷歌位置提示框的一小部分被导航栏重叠 如下图所示 之外 一切几乎都有效 我尝试过改变z index输入框的值改为10或2000或90000但似乎没有效果 我还缺少其他需要做的事情吗 这是
  • 谷歌地图 API 没有密钥?

    如何在没有密钥的情况下使用 Google Maps v3 API 我在里面见过这个例子 http www birdtheme org useful v3largemap html但无法弄清楚具体是什么导致它不出错 编辑 如果有人建议 Sta
  • Google 地图 - 使用自定义 json 样式*和* 地形视图

    因此 我创建了一些自定义 JSON 以使海洋更加饱和的蓝色 但现在似乎无法将地图默认为地形视图 它只是转到标准路线图视图 似乎无法弄清楚为什么会这样正在发生 有什么想法吗 function initialize Create an arra
  • 带有航点的 Google 路线服务无法正常工作

    这是我的代码 用于显示带有谷歌方向的航路点 Show Route if e keyCode 109 booking docket dialog isOpen var pickup txt pickup lat long val var pi
  • 如何在 Google 地图 V3 中创建编号地图标记?

    我正在制作一张上面有多个标记的地图 这些标记使用自定义图标 但我还想在顶部添加数字 我已经了解了如何使用旧版本的 API 来实现这一点 我怎样才能在V3中做到这一点 注意 当您将鼠标悬停在标记上时 标题 属性会创建一个工具提示 但我希望即使

随机推荐

  • 操作员删除签名意外行为[重复]

    这个问题在这里已经有答案了 stroustroup 在他的 C 编程语言 第 4 版 一书中提到 可以通过编写具有以下签名的全局函数来重载全局运算符 new delete void operator new size t use for i
  • 使用 Deriv 包求导 wrt 向量

    我正在探索 autodiff 我想使用Deriv用于计算函数对向量的导数 我写的 library numDeriv library Deriv h function x c 1 2 x grad h c 1 2 ok 1 1 2 dh De
  • 使 Console.ReadLine 始终位于最后一行

    我有一个用 C 编写的应用程序 它通过 while true 循环和 Console ReadLine 连续获取用户的命令 我也有各种后台操作通过控制台报告 查看这个简单的例子 class Program static void Main
  • 在单独运行的 Python 脚本之间传递数据

    如果我有一个正在运行的 python 脚本 带有完整的 Tkinter GUI 和所有内容 并且我想将它正在收集的实时数据 内部存储在数组等中 传递给另一个 python 脚本 那么最好的方法是什么 我不能简单地将脚本 A 导入脚本 B 因
  • TSQL 函数计算指定日期的 30 个工作日日期 (SQL Server 2005)

    TSQL 函数计算指定日期的 30 个工作日日期 SQL Server 2005 输入参数为日期和工作日数 输出将是计算日期 这不包括周六 周日 节假日和休息日 即 如果假期适逢周末 但在假期后的周五或周一举行 对于假期 我们有一个表格 其
  • EF Code First - 一对一可选关系

    我想使用 EF Code First 在现有数据库中映射可选的一对一关系 简单架构 User Username ContactID Contact ID Name 显然 ContactID 加入到 Contact ID 中 ContactI
  • 动态和/或递归读取并合并两个 Yaml 文件

    这个问题已经得到解答 用于合并两个 yaml 的顶级 map string interface 值 但是是否可以合并两个yaml文件 A 没有定义结构体和 B 具有多个未知级别的嵌套 我尝试解组到同一个空白界面 但覆盖 yaml 完全被擦除
  • 自定义 JUnit 报告?

    我正在使用 ant 任务 junit 和 junitreport 来运行我的 JUnit 测试并在最后生成报告 gt 单元测试结果 是否有一些简单的方法可以以某种方式扩展此输出以获得报告中显示的更多信息 例如 添加一个附加列 其中包含指向测
  • ListView 绑定中的 SelectedItem

    我是 WPF 新手 在我的示例应用程序中 我使用 ListView 来显示属性的内容 我不知道如何将ListView中的SelectedItem绑定到属性 然后绑定到TextBlock 窗口 xaml
  • 我可以让 WatchKit 应用程序在 Apple Watch 的后台运行吗?

    我想知道是否有办法让我的 WatchKit 应用程序在后台运行 或者我是否可以对其进行编程以在满足特定条件后启动 即从非活动状态转移到活动状态 当 WK 应用程序打开并处于活动状态时 我的应用程序可以完美运行 甚至当 iPhone 处于睡眠
  • MySQL:多行作为逗号分隔的单行

    我有两个表 DISH 和 DISH HAS DISHES Dish 表包含所有菜肴 Dish has dishes 表与 Dish 表具有一对多关系 IE 一个菜可以有多个菜 例如 DISH dish id dish name 1 dish
  • 获取一行sql中具有最大值的列名

    我的数据库中有一个表 其中存储新闻文章的类别 每次用户阅读文章时 都会增加相关列中的值 像这样 现在我想执行一个查询 在其中可以获得每条记录的 4 个最高值的列名 例如 对于用户 9 它将返回 我尝试了很多事情 搜索了很多 但不知道该怎么做
  • 在具有有序因子的 data.frame 上使用 apply 与排名和顺序时出现奇怪的行为

    我发现了一些奇怪的行为apply 假设我有一个任意有序变量矩阵 set seed 4 x lt ordered sample 1 10 size 4 replace T y lt ordered sample 1 10 size 4 rep
  • 类似 Ruby 的问题:让这个函数更短(ActionScript 3)

    我刚刚编写了这段极其冗长的代码 将 2 这样的数字转换为 02 您能否缩短此功能 保持功能 public static function format n int minimumLength int String var retVal St
  • 迭代到大范围时出现 Python 内存错误

    total 0 x 2 32 for i in range x total total i print total 我得到了MemoryError循环到某个范围时2 32 有没有办法在不耗尽内存的情况下进行迭代 This is what h
  • typescript 中 switch 的替代方案

    我正在尝试为我的开关盒寻找任何替代方案 因为它很长 我有嵌套的开关盒 看起来像这样 switch currentTab case pending switch status case approved case denied break c
  • Scrapy 中的嵌套选择器

    我无法按照 Scrapy 文档中的描述让嵌套选择器工作 http doc scrapy org en latest topics selectors html 这是我得到的 sel Selector response level3field
  • 错误:运行 Spring 集成测试时没有 ServletContext 资源的 URL

    我正在为我的 Spring 控制器运行集成测试 测试包括一个配置文件 view configuration xml 具有tilesConfigurer我收到错误的 beanNo URL for ServletContext resource
  • 如何绘制物体的特定或多个轮廓

    我似乎找不到一种方法来绘制多个物体的轮廓 输入图像 Code import cv2 import numpy as np import image img cv2 imread img png 0 Thresh ret thresh cv2
  • 如何在 Google 地图自动完成建议中显示附加信息?

    我正在使用 Google 地方信息自动完成功能按名称选择城市 目前 它在建议下拉列表中仅显示城市名称及其所属国家 地区 我检查并发现 选择城市时填充的 address components 对象具有其他属性 例如州 省和地址的其他部分 因此