谷歌地图v3中“可视”区域的半径

时间:2010-08-19 19:53:07

标签: google-maps google-maps-api-3

我需要知道如何在google maps API v3中检索可见缩放级别的半径。

例如,如果我处于缩放级别3,并且根据用户的屏幕大小(简单地说400x400可视区域),我如何获得可视区域的“半径”圆。

或者我正在使用map.fitBounds()来表示我添加到地图中的所有点,所以我 NEED 的所有点都是所有边界的半径。我想要的是“20英里”,我可以将其输入我的数据库应用程序。

4 个答案:

答案 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