javascript - 查找与添加的客户服务应用程序中的新标记最接近的标记

标签 javascript google-maps google-maps-api-3

我正在开发一个快餐客户服务应用程序调用中心应该能够通过单击已有旧标记(分支机构)的 map 来添加调用者的地址( map 上的标记)并自动添加应该计算距离添加的标记最近的分支。

我可以将标记添加到数组中,我使用 this计算函数,不过我需要知道如何在单击事件后调用此函数并将其连接到添加的新标记。 代码如下

识别分支

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]];

初始化函数

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) 中。请注意代码中的注释,所有错误均已修复。

关于javascript - 查找与添加的客户服务应用程序中的新标记最接近的标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22294729/

相关文章:

javascript - Typescript 私有(private) setter 公共(public) getter 约定

javascript - 不清楚这段 JavaScript 代码是如何工作的。

android - 如何将谷歌地图添加到我的工作 android 应用程序 [带 fragment 的空白 Activity ]?

javascript - Google Map API V3 检测容器宽度/高度变化

javascript - Google map API v3 显示行程时间

javascript - 仅当有 2 个或更多段落时才在 1 段后插入按钮

javascript - 我怎样才能创建一个多重嵌套列表

google-maps - 如何从谷歌反向地理编码可靠地找到邮政编码

javascript - 带有谷歌地图的 Backbone.js - 这个问题和听众

javascript - Google Maps API - 外部 JSON 中未显示标记