- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有很多关于此的问题和可用的文档,但似乎我找不到我要解决的用例的解决方案。
我想做什么:
所以它基本上是在扩展the places autocomplete提到最后一个项目符号
-或-
使用 geocomplete library ,更具体地说 the form example ,因为它已经提供了下面列出的所有需要的详细信息。我缺少的是如何不在搜索中放置标记,以及如何仅在用户点击时从机构获取详细信息。
我希望在点击时从该机构获得的详细信息(可通过 geocomplete 直接获得)是:
更新
使用 geocomplete 库,您可以绑定(bind)一个点击事件,如下所示:
$("#geocomplete_input_field").bind("geocode:click", function(event, latLng){
$("input[name=lat]").val(latLng.lat());
$("input[name=lng]").val(latLng.lng());
});
这样我们就得到了纬度和经度。但是您是否也可以像表单示例中那样获取 formatted_address、name 和 url?
最佳答案
好吧,您不需要任何外部库来完成此操作。由于一切都已完成(代码),您只需添加一个“POI Click Event”即可。它监听 POI 图标上的点击事件,然后使用 placeId 来实现您想要实现的任何目标。在您的情况下,您想获取这些:名称、格式化地址、url、lat、lng 和网站。
在我将为您提供的示例中,我刚刚创建了一个构造函数“ClickEventHandler”。您可以检查 POI Click 用于示例和文档。
var ClickEventHandler = function(map, origin) {
this.origin = origin;
this.map = map;
this.placesService = new google.maps.places.PlacesService(map);
this.infowindow = new google.maps.InfoWindow();
// Listen for clicks on the map.
this.map.addListener('click', this.handleClick.bind(this));
};
然后,在您的 init() 函数中创建一个新实例并提供参数:map 和 origin。
var clickHandler = new ClickEventHandler(map, {lat: -33.8688, lng: 151.2195});
在“ClickEventHandler”对象中,创建接受参数“placeid”的原型(prototype)“getPlaceInformation”。您需要使用 Google Maps Javascript API Place Details 在本节中。在 Google Maps Javascript API Place Details getDetails 方法中,您将使用您提供的 placeid 作为来自您之前创建的函数 (getPlaceInformation) 的参数。 getDetails 方法需要 2 个参数:地点和状态。此方法从您提供的 placeid 获取所有详细信息。一旦您获得status === 'OK',它就会返回您所期望的数据。
ClickEventHandler.prototype.getPlaceInformation = function(placeId) {
this.placesService.getDetails({placeId: placeId}, function(place, status) {
if (status === 'OK') {
}
});
};
下面的工作示例(信息窗口中有详细信息和 POI 提供的输入元素值):
// This example adds a search box to a map, using the Google Place Autocomplete
// feature. People can enter geographical searches. The search box will return a
// pick list containing a mix of places and predicted search terms.
// 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 initAutocomplete() {
var map = new google.maps.Map(document.getElementById('map'), {
center: {lat: -33.8688, lng: 151.2195},
zoom: 13,
mapTypeId: 'roadmap'
});
// Create the search box and link it to the UI element.
var input = document.getElementById('pac-input');
var searchBox = new google.maps.places.SearchBox(input);
map.controls[google.maps.ControlPosition.TOP_LEFT].push(input);
// Bias the SearchBox results towards current map's viewport.
map.addListener('bounds_changed', function() {
searchBox.setBounds(map.getBounds());
});
// Listen for the event fired when the user selects a prediction and retrieve
// more details for that place.
searchBox.addListener('places_changed', function() {
var places = searchBox.getPlaces();
if (places.length == 0) {
return;
}
// For each place, get the icon, name and location.
var bounds = new google.maps.LatLngBounds();
places.forEach(function(place) {
if (!place.geometry) {
console.log("Returned place contains no geometry");
return;
}
if (place.geometry.viewport) {
// Only geocodes have viewport.
bounds.union(place.geometry.viewport);
} else {
bounds.extend(place.geometry.location);
}
});
map.fitBounds(bounds);
});
var clickHandler = new ClickEventHandler(map, {lat: -33.8688, lng: 151.2195});
}
var ClickEventHandler = function(map, origin) {
this.origin = origin;
this.map = map;
this.placesService = new google.maps.places.PlacesService(map);
this.infowindow = new google.maps.InfoWindow();
// Listen for clicks on the map.
this.map.addListener('click', this.handleClick.bind(this));
};
ClickEventHandler.prototype.getPlaceInformation = function(placeId) {
var me = this;
this.placesService.getDetails({placeId: placeId}, function(place, status) {
me.infowindow.close();
if (status === 'OK') {
var inputNames = [ 'name', 'formatted_address', 'url', 'website' ];
for ( var val in inputNames ) {
document.getElementById(inputNames[val]).value = place[inputNames[val]];
}
document.getElementById('lat').value = place.geometry.location.lat();
document.getElementById('lng').value = place.geometry.location.lng();
var template = '<div id="infoContent">';
template += '<ul>';
template += '<li><span>Name: </span>'+place.name+'</li>';
template += '<li><span>Formatted address: </span>'+place.name+'</li>';
template += '<li><span>Google Maps URL: </span><a href="'+place.url+'" target="_blank">'+place.url+'</a></li>';
template += '<li><span>Latitude: </span>'+place.geometry.location.lat()+'</li>';
template += '<li><span>Longitude: </span>'+place.geometry.location.lng()+'</li>';
template += '<li><span>Website: </span><a href="'+place.website+'" target="_blank">'+place.website+'</a></li>';
template += '</ul>';
me.infowindow.setContent(template);
me.infowindow.setPosition(place.geometry.location);
me.infowindow.open(me.map);
}
});
};
ClickEventHandler.prototype.handleClick = function(event) {
//console.log('You clicked on: ' + event.latLng);
// If the event has a placeId, use it.
if (event.placeId) {
//console.log('You clicked on place:' + event.placeId);
// Calling e.stop() on the event prevents the default info window from
// showing.
// If you call stop here when there is no placeId you will prevent some
// other map click event handlers from receiving the event.
event.stop();
this.getPlaceInformation(event.placeId);
}
};
#map {
height: 100%;
}
/* Optional: Makes the sample page fill the window. */
html, body {
height: 100%;
margin: 0;
padding: 0;
}
#description {
font-family: Roboto;
font-size: 15px;
font-weight: 300;
}
.pac-card {
margin: 10px 10px 0 0;
border-radius: 2px 0 0 2px;
box-sizing: border-box;
-moz-box-sizing: border-box;
outline: none;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
background-color: #fff;
font-family: Roboto;
}
#pac-container {
padding-bottom: 12px;
margin-right: 12px;
}
.pac-controls {
display: inline-block;
padding: 5px 11px;
}
.pac-controls label {
font-family: Roboto;
font-size: 13px;
font-weight: 300;
}
#pac-input {
background-color: #fff;
font-family: Roboto;
font-size: 15px;
font-weight: 300;
margin-left: 12px;
padding: 0 11px 0 13px;
text-overflow: ellipsis;
width: 400px;
}
#pac-input:focus {
border-color: #4d90fe;
}
#title {
color: #fff;
background-color: #4d90fe;
font-size: 25px;
font-weight: 500;
padding: 6px 12px;
}
#target {
width: 345px;
}
#infoContent {
width:100%;
float:left;
overflow:hidden;
display:block;
}
#infoContent > ul {
width:100%;
float:left;
overflow:hidden;
display:block;
}
#infoContent > ul > li {
width:100%;
float:left;
overflow:hidden;
clear:both;
font-size:12px;
}
#infoContent > ul > li span {
font-weight:bold;
}
#infoContent > ul > li a {
text-decoration:none;
}
#myForm {
width:100%;
float:left;
overflow:hidden;
display:block;
box-sizing:border-box;
padding: 10xp;
}
#myForm fieldset {
display:block;
clear:both;
float:left;
border:none;
}
#myForm fieldset label {
width:100%;
float:left;
overflow:hidden;
display:block;
clear:both;
line-height:24px;
}
#myForm fieldset input {
width: 100%;
float:left;
overflow:hidden
display:block;
clear:both;
line-height: 24px;
padding: 0 5px;
}
<input id="pac-input" class="controls" type="text" placeholder="Search Box">
<div id="map"></div>
<form id="myForm">
<fieldset>
<label>Name:</label>
<input type="text" name="name" id="name" />
</fieldset>
<fieldset>
<label>Formatted address:</label>
<input type="text" name="formatted_address" id="formatted_address" />
</fieldset>
<fieldset>
<label>URL to Google Maps:</label>
<input type="text" name="url" id="url" />
</fieldset>
<fieldset>
<label>Latitude:</label>
<input type="text" name="lat" id="lat" />
</fieldset>
<fieldset>
<label>Longitude:</label>
<input type="text" name="lng" id="lng" />
</fieldset>
<fieldset>
<label>Website:</label>
<input type="text" name="website" id="website" />
</fieldset>
</form>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCzjs-bUR6iIl8yGLr60p6-zbdFtRpuXTQ&libraries=places&callback=initAutocomplete"
async defer></script>
希望对您有所帮助,祝您编码愉快!
关于javascript - 在 Google map 上获取所选机构的详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46917483/
目录 进程 其他相关概念 创建线程的两种方式 为什么使用start()方法而不直接使用run()方法 start()方法底层
CURL状态码列表 状态码 状态原因 解释 0 正常访问
ODBC连接类函数 odbc_connect函数:打开一个ODBC连接 odbc_close函数:关闭一个已经打开的ODBC连接 odbc_close_all函数:关闭所有已经打开的ODBC连
作为标题,如何计算从纪元1900到现在使用boost的持续时间? 编辑:很抱歉以前的问题太短。我将再次描述我的问题。 我有关于将生日另存为整数的问题。我创建了四个函数,用法如下: ptime转换为整数
前言 在Java中,有一个常被忽略 但 非常重要的关键字Synchronized今天,我将详细讲解 Java关键字Synchronized的所有知识,希望你们会喜欢 目录 1. 定义 J
详细 JVM 垃圾收集日志的时间戳是收集的开始还是结束? 2016-08-09T21:04:19.756-0400: 224890.317: [GC Desired survivor size 167
我在“Master-Detail”概念上苦苦挣扎,除了一点点(但很重要)的细微差别外,几乎所有东西都按预期工作。我应该在 Storyboard上更改什么以在详细信息 View (屏幕截图底部的右上角)
我希望能够显示表格的详细 View ,但不推送新屏幕,而只显示表格所在的详细 View 。 设置它的最佳方式是什么......如果真的可行的话? ---------------------------
我在我的博客中为我的帖子使用了详细 View ,每篇帖子都有评论,所以我想对它们进行分页,但我不知道该怎么做,因为我请求了帖子模型。我知道如何在功能 View 中执行此操作,但不知道如何在详细 Vie
在下面的代码中,与 pm 对齐,该行是否会 move 整个内存并将其分配给 pm,或者它只会 move p 指向的内存而不是整个数组? int main() { int*
1·下载 https://dev.mysql.com/downloads/mysql/ 2·安装服务 1)管理员运行cmd 2)D: 3)cd D:\mysql
今天以前一直用的SQL Server 2005做开发,偶尔也用MySQL,现入手公司项目,用到SQL Server 2008,于是乎必须安装它,免得出现其他很纠结的小问题,现将自己安装图解分享如下:
1. crontab命令选项 复制代码 代码如下: #crontab -u <-l, -r, -e> -u指定一个用
我们有一个 WPF 应用程序,它有一个主窗口/详细信息窗口,两者都是 WPF 数据网格。当您在上部数据网格中选择一行时,详细信息将显示在下部数据网格中。我想知道从 UI 的角度来看是否有任何关于如何处
在可视化 Perforce 客户端 (p4v) 中有一个选项: 显示文件操作的 p4 命令输出 启用后,在日志 Pane 中,我可以看到这样的详细日志记录: p4 sync /Users/az/ftp
在其他服务器上设置测试环境后,在几个API调用中出现错误。 99%肯定这是MySQL的事情,但是返回的错误根本没有帮助: global name 'sys' is not defined" 我已经导入
我正在维护一个通用的 iOS 应用程序,其开发已开始于 iOS 6。我正在为 iOS 7 更新 UI。现在我遇到了应用程序的 iPad 部分的奇怪问题。这部分遵循使用 UISplitViewContr
我希望我能正确描述这种情况。当它发生时很容易在屏幕上看到,但很难用语言解释,但我会尽力而为。 我有一个带有固定主视图 (UITableView) 和两个详细 View 之一的 UISplitViewC
我尝试在 eclipse 和 intelliJ 参数中使用垃圾收集记录器来配置简单的测试程序。尝试了不同类型的配置,但尚未创建日志文件。 -XX:+PrintGCDetails -XX:+PrintG
正如您所知,.cap 文件中的 java 小程序的输出文件格式必须通过智能卡读卡器/写卡器(如 ACR122 或任何其他读卡器)部署到 java 卡,而且我相信 java 卡与 java 卡之间的部署
我是一名优秀的程序员,十分优秀!