我需要知道如何在google maps API v3中检索可见缩放级别的半径。
例如,如果我处于缩放级别3,并且根据用户的屏幕大小(简单地说400x400可视区域),我如何获得可视区域的“半径”圆。
或者我正在使用map.fitBounds()来表示我添加到地图中的所有点,所以我 NEED 的所有点都是所有边界的半径。我想要的是“20英里”,我可以将其输入我的数据库应用程序。
答案 0 :(得分:78)
半径等于从边界中心到边界角之一的距离。使用the calculations from this page中的Great Circle Distance公式,我想出了以下内容:
var bounds = map.getBounds();
var center = bounds.getCenter();
var ne = bounds.getNorthEast();
// r = radius of the earth in statute miles
var r = 3963.0;
// Convert lat or lng from decimal degrees into radians (divide by 57.2958)
var lat1 = center.lat() / 57.2958;
var lon1 = center.lng() / 57.2958;
var lat2 = ne.lat() / 57.2958;
var lon2 = ne.lng() / 57.2958;
// distance = circle radius from center to Northeast corner of bounds
var dis = r * Math.acos(Math.sin(lat1) * Math.sin(lat2) +
Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1));
在玩了这个之后,我注意到map.getBounds()
将包含完整的地图视口。但如果您的LatLngBounds
是通过扩展以包含LatLng
点而构建的,然后您发出map.fitBounds(bounds)
,则api会增加地图的视口,以便bounds
“框“有一些填充物。
如果使用地图的当前视口,则从视口的中心到角落的半径可能比您想要的半径更长。也许是从视口中心到最远视口边缘中间的距离。 (如果地图不是完美的正方形)
答案 1 :(得分:24)
使用Eric's answer命名空间重构了google.maps.geometry.spherical版本(请确保已加载Geometry library以使其正常工作)。
var bounds = map.getBounds();
var center = map.getCenter();
if (bounds && center) {
var ne = bounds.getNorthEast();
// Calculate radius (in meters).
var radius = google.maps.geometry.spherical.computeDistanceBetween(center, ne);
}
答案 2 :(得分:3)
我也重构了Eric的答案,我的答案是一个独立的函数,并以米为单位返回结果(根据Places API search的需要。
function getBoundsRadius(bounds){
// r = radius of the earth in km
var r = 6378.8
// degrees to radians (divide by 57.2958)
var ne_lat = bounds.getNorthEast().lat() / 57.2958
var ne_lng = bounds.getNorthEast().lng() / 57.2958
var c_lat = bounds.getCenter().lat() / 57.2958
var c_lng = bounds.getCenter().lng() / 57.2958
// distance = circle radius from center to Northeast corner of bounds
var r_km = r * Math.acos(
Math.sin(c_lat) * Math.sin(ne_lat) +
Math.cos(c_lat) * Math.cos(ne_lat) * Math.cos(ne_lng - c_lng)
)
return r_km *1000 // radius in meters
}
答案 3 :(得分:1)
我相信Bounds有getNorthEast()和getSouthWest()方法,但这会给你一个矩形(实际上是边界),你可以计算这两者之间的距离等。 计算那个rectandle的圆圈可能有点工作......
也许这会有所帮助:http://code.google.com/apis/maps/articles/mvcfun.html
和示例:http://code.google.com/apis/maps/articles/mvcfun/step6.html