半径/最接近的结果 - Google Maps API

时间:2011-04-22 13:29:26

标签: php javascript mysql google-maps google-maps-api-3

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

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

我正在请求有效的代码,教程或有关如何执行此操作的文章。

2 个答案:

答案 0 :(得分:5)

这里是JSFiddle Demo:

我认为这是一种方法。您可以使用Google Map V3 API's circle从中心点或当前位置创建边界。您可以使用setRadius(radius:number)指定以米为单位的圆的半径。使用创建的圆圈,您可以循环标记并使用Circle's getBounds object which is a LatLngBounds查看它们是否在圆圈范围内,并检查标记是否在边界内。

我继续创建了一个在地图上有五个点的小型演示,当你点击创建圆形按钮时,它会使第一个标记成为中心点并绘制一个半径为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);
}

答案 1 :(得分:1)

这个解决方案只有一个主要缺陷 - 它以矩形而不是圆形方式获取数据。

如果您不想查询超出要求的数据,请使用SQL中的haversine formula

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;

同时结帐Creating a Store Locator with PHP, MySQL & Google Maps