Google Maps Api v3 - 查找最近的标记

use*_*003 85 google-maps google-maps-api-3

当我点击地图时,这将是找到最近的标记或标记的最佳方法?api中是否有一些功能可以帮助我做到这一点?

这是谷歌地图api v3.

Gal*_*len 107

首先,您必须添加eventlistener

google.maps.event.addListener(map, 'click', find_closest_marker);
Run Code Online (Sandbox Code Playgroud)

然后创建一个循环标记数组的函数,并使用半正公式计算每个标记与点击的距离.

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);
}
Run Code Online (Sandbox Code Playgroud)

这将跟踪最接近的标记并提醒其标题.

我的标记作为地图对象上的数组

  • 不打开一个旧线程,但我试图实现这一点,它似乎向东搜索而不是找到最接近的.因此,如果我搜索一个位置,它将向东搜索并找到最接近的位置,即使西边有一个真实的关闭.那有意义吗? (2认同)
  • 是的,这对我来说根本不起作用 - 把我放在我们加利福尼亚州的位置,而我在纽约。我所在的位置有一个标记。但它确实找到了一个标记! (2认同)

Leo*_*eor 77

您可以在google.maps.geometry.spherical命名空间中使用computeDistanceBetween()方法.


Jon*_*han 25

我想对雷欧的扩大建议的人困惑于如何计算最近的位置,实际上提供了一个可行的解决方案:

我正在使用markers数组中的标记,例如var markers = [];.

那么让我们的立场就像 var location = new google.maps.LatLng(51.99, -0.74);

然后我们简单地将标记缩小到我们所希望的位置:

markers.reduce(function (prev, curr) {

    var cpos = google.maps.geometry.spherical.computeDistanceBetween(location.position, curr.position);
    var ppos = google.maps.geometry.spherical.computeDistanceBetween(location.position, prev.position);

    return cpos < ppos ? curr : prev;

}).position
Run Code Online (Sandbox Code Playgroud)

弹出的是你最近的标记LatLng对象.


mhe*_*ers 9

上面的公式对我不起作用,但我没有任何问题地使用它.将当前位置传递给函数,并遍历一系列标记以找到最接近的位置:

function find_closest_marker( lat1, lon1 ) {    
    var pi = Math.PI;
    var R = 6371; //equatorial radius
    var distances = [];
    var closest = -1;

    for( i=0;i<markers.length; i++ ) {  
        var lat2 = markers[i].position.lat();
        var lon2 = markers[i].position.lng();

        var chLat = lat2-lat1;
        var chLon = lon2-lon1;

        var dLat = chLat*(pi/180);
        var dLon = chLon*(pi/180);

        var rLat1 = lat1*(pi/180);
        var rLat2 = lat2*(pi/180);

        var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
                    Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(rLat1) * Math.cos(rLat2); 
        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;
        }
    }

    // (debug) The closest marker is:
    console.log(markers[closest]);
}
Run Code Online (Sandbox Code Playgroud)


Arg*_*ros 5

你知道Mysql Spatial扩展吗?

你可以使用像MBRContains(g1,g2)这样的东西.

  • 页面未找到配对,因此您需要重新编辑此答案 (4认同)

vik*_*esh 5

使用computeDistanceBetween() Google 地图 API方法来计算您的位置和Google 地图上的标记列表之间的邻近标记。

脚步:-

  1. 在谷歌地图上创建标记。
    function addMarker(location) { var marker = new google.maps.Marker({ title: 'User added marker', icon: { path: google.maps.SymbolPath.BACKWARD_CLOSED_ARROW, scale: 5 }, position: location, map: map }); }

  2. 在鼠标上单击创建事件以获取您所在位置的经纬度,并将其传递给 find_closest_marker()。

    function find_closest_marker(event) {
          var distances = [];
          var closest = -1;
          for (i = 0; i < markers.length; i++) {
            var d = google.maps.geometry.spherical.computeDistanceBetween(markers[i].position, event.latLng);
            distances[i] = d;
            if (closest == -1 || d < distances[closest]) {
              closest = i;
            }
          }
          alert('Closest marker is: ' + markers[closest].getTitle());
        }
    
    Run Code Online (Sandbox Code Playgroud)

访问此链接并按照步骤操作。您将能够使标记更接近您的位置。