首先,我使用的是Google Maps API v3。我有一张大地图显示从数据库中提取的所有结果,现在我想实现一个功能,显示距当前位置X公里内最近的结果半径(由HTML5地理位置提供)。
由于地图包含所有结果,我希望能够添加X公里,然后提交结果将根据用户的当前位置返回最近的结果。然后整个地图应删除所有半径外标记,留下半径为X公里的标记。
我正在请求有效的代码,教程或有关如何执行此操作的文章。
答案 0 :(得分:5)
我认为这是一种方法。您可以使用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;