找到最近的标记到一个新的标记添加客户服务应用程序
Find the closest marker to a new marker added Customer Service app
我正在研究一个快餐客户服务应用程序呼叫中心应该能够通过点击已经有旧标记(分支机构)的地图来添加呼叫者的地址(地图上的标记),并且它应该自动计算从添加的标记最近的分支机构。
我可以将标记添加到数组中,并使用此计算函数,但是我需要知道如何在单击事件后调用此函数并将其连接到添加的新标记。代码如下
标识分支
var map;
var markers = [];
var marker, i;
var locations = [
['Title A', 3.180967,101.715546, 1],
['Title B', 3.200848,101.616669, 2],
['Title C', 3.147372,101.597443, 3],
['Title D', 3.19125,101.710052, 4]];
Initialization function
function initialize() {
var haightAshbury = new google.maps.LatLng(3.171368, 101.653404);
var mapOptions = {
zoom: 12,
center: haightAshbury,
mapTypeId: google.maps.MapTypeId.TERRAIN
};
map = new google.maps.Map(document.getElementById('map-canvas'),
mapOptions);
google.maps.event.addListener(map, 'click', function(event) {
addMarker(event.latLng);
});
for (i = 0; i < locations.length; i++) {
marker = new google.maps.Marker({
position: new google.maps.LatLng(locations[i][1], locations[i][2]),
map: map
});
google.maps.event.addListener(marker, 'click', (function(marker, i) {
return function() {
infowindow.setContent(locations[i][0]);
infowindow.open(map, marker);
}
})(marker, i));
google.maps.event.addListener(map, 'click', find_closest_marker);
}
}
添加新标记
function addMarker(location) {
var marker1 = new google.maps.Marker({
position: location,
map: map
});
markers.push(marker);
}
为数组添加新的标记
setAllMap(map)
{
for (var i = 0; i < markers.length; i++)
{
markers[i].setMap(map);
}
}
计算函数function rad(x) {return x*Math.PI/180;}
function find_closest_marker( event ) {
var lat = event.latLng.lat();
var lng = event.latLng.lng();
var R = 6371; // radius of earth in km
var distances = [];
var closest = -1;
for( i=0;i<map.markers.length; i++ ) {
var mlat = map.markers[i].position.lat();
var mlng = map.markers[i].position.lng();
var dLat = rad(mlat - lat);
var dLong = rad(mlng - lng);
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(rad(lat)) * Math.cos(rad(lat)) * Math.sin(dLong/2) * Math.sin(dLong/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
distances[i] = d;
if ( closest == -1 || d < distances[closest] ) {
closest = i;
}
}
alert(map.markers[closest].title);
}
谢谢。
使用Google Maps Geometry Library计算距离。
参数必须为LatLng对象。google.maps.geometry.spherical.computeDistanceBetween(markerPosition, mainPosition);
当然你需要加载几何库
&libraries=geometry
jsfiddle中代码的工作示例。最近的标记将在控制台(F12)中打印。注意代码中的注释,所有错误都已修复。
在添加新的标记到映射并压入数组之前,您需要将该点的纬度和经度值传递给函数find_closest_marker()
。
google.maps.event.addListener(map, 'click', function(event) {
find_closest_marker( event );
addMarker(event.latLng);
});
将提示最近的标记的标题。
然而,你的代码有几个错误:- 您的标记数组只是
markers
,但在find_closest_marker
中,它是map.markers[]
,所以您必须将它们更改为markers[]
。 - 在
addMarker()
中,您定义了名称为marker1
的标记,但将其推送到数组为marker
。 - 不是一个错误,但忘记了一个,当你从你的
locations[]
数组创建标记在for循环,你还需要把它们推到你的markers[]
数组:markers.push(marker);
在for
循环的底部。
相关文章:
- 使用javascript在客户端上使用Web服务
- 如何在服务、技能、投资组合等方面添加滑动效果
- 如何将新用户自动添加到AddThis服务以设置分析服务
- Angular js-尚未添加PUT请求到服务的URL
- 客户端的服务呼叫
- 从javascript客户端验证REST服务
- 无法使用javascript客户端访问远程web服务
- 将 Stripe.com 和 Parse.com 与 iOS 集成 - 无法向客户添加订阅
- 将项添加到 AngularJS 中的值服务
- RSS Feeds - 添加服务器端(PHP)或客户端(JavaScript / jQuery)
- 如何在打字稿的控制器中添加 angularjs 服务
- 添加客户端jQuery支持
- 添加客户端单击 ASP.NET 按钮
- 当添加一个服务和一个过滤器或多个服务时,我在做什么导致未知提供者
- 如何用AngularJS和Restangular添加客户头文件
- 如何使用AngularJs从弹出窗口向表中添加客户
- 如何在Angular中添加一个服务,让控制器可以使用它?
- 使用ASP为office插件添加web服务.. NET web api
- 如何在asp上添加客户端事件:单击菜单项
- 找到最近的标记到一个新的标记添加客户服务应用程序