半径/最近的结果-谷歌地图API

Radius/nearest results - Google Maps API

本文关键字:谷歌地图 API 结果 最近 半径      更新时间:2023-09-26

首先,我使用谷歌地图API v3。我有一张显示从数据库中提取的所有结果的大地图,现在我想实现一个功能,显示距离当前位置X公里内最近结果的半径(由HTML5地理定位提供)。

由于地图包含所有结果,我希望能够添加X公里,然后它将被提交,结果将返回根据用户当前位置最近的结果。然后,整个地图应删除所有超出半径的标记,留下X公里半径内的标记。

我需要一个有效的代码,教程或一篇关于如何做到这一点的文章。

这里是JSFiddle演示:

我想这是一种方法。您可以使用Google Map V3 API的圆圈从您的中心点或当前位置创建边界。可以用setRadius(radius:number)指定圆的半径,以米为单位。有了创建的圆圈,你可以遍历你的标记,看看它们是否在圆圈的边界内,使用圆圈的getBounds对象,它是一个latlnbounds,并检查标记是否在边界内。

我继续创建了一个小演示,在地图上有五个点,当你点击创建圆圈按钮时,它会将第一个标记作为中心点,并绘制一个半径为5000的圆圈,并使用上面描述的方法过滤掉没有在边界内的标记:

function createRadius(dist) {
    var myCircle = new google.maps.Circle({
        center: markerArray[markerArray.length - 1].getPosition(),
        map: map,
        radius: dist,
        strokeColor: "#FF0000",
        strokeOpacity: 0.8,
        strokeWeight: 2,
        fillColor: "#FF0000",
        fillOpacity: 0.35
    });
    var myBounds = myCircle.getBounds();
    //filters markers
    for(var i=markerArray.length;i--;){
         if(!myBounds.contains(markerArray[i].getPosition()))
             markerArray[i].setMap(null);
    }
    map.setCenter(markerArray[markerArray.length - 1].getPosition());
    map.setZoom(map.getZoom()+1);
}

这个解决方案只有一个主要缺陷——它获取矩形中的数据,而不是圆形中的数据。

如果您不想查询任何超出所需的数据-使用SQL中的haversine公式:

SELECT
    id,
    (3959 *
        acos(
            cos(radians(37)) *
            cos(radians(lat)) *
            cos(radians(lng) - radians(-122)) +
            sin(radians(37)) *
            sin(radians(lat))
        )
    ) AS distance
FROM markers
HAVING distance < 25
ORDER BY distance
LIMIT 0 , 20;

也可以查看使用PHP, MySQL &谷歌地图