如何将LatLng和半径转换为Android Google Maps API v2中的LatLngBounds?

我相信这是最近Google Maps API v2的限制。 他们最近添加了在地面上绘制圆的能力 – 但是如果您想要定位相机以显示整个圆,则无法这样做。

可以调用CameraUpdateFactory#newLatLngBounds(bounds,padding),其中“bounds”是LatLngBounds,“padding”是以像素为单位的距离。 问题是没有办法创build一个LatLng和一个半径LatLngBounds。

LatLngBounds的构造函数只需要2个LatLng实例,并生成一个矩形,这些矩形是NW和SE的angular点。

就像Risadinha提到的,你可以很容易地实现与android-maps-utils 。 只需添加:

 compile 'com.google.maps.android:android-maps-utils:0.4.4' 

到你的gradle依赖,使用下面的代码:

 public LatLngBounds toBounds(LatLng center, double radiusInMeters) { double distanceFromCenterToCorner = radiusInMeters * Math.sqrt(2.0); LatLng southwestCorner = SphericalUtil.computeOffset(center, distanceFromCenterToCorner, 225.0); LatLng northeastCorner = SphericalUtil.computeOffset(center, distanceFromCenterToCorner, 45.0); return new LatLngBounds(southwestCorner, northeastCorner); } 

编辑:

我们的目标是计算两点( LatLngs ): southwestCornernortheastCorner 。 从SphericalUtil的javadoc中,您可以看到22545heading值, distanceFromCenterToCornerdistance 。 下图中的值的进一步说明:

视觉解释

这是完全可行的。

LatLng是你的圈子的中心是正确的? 你想要做的就是在LatLngBounds (圆形问题内的圆圈)内LatLngBounds你的圆圈,这样整个事物就会出现在地图上。

如果你在纸上画这个,你可以看到你有一切你需要计算你的LatLngBounds

记住如何find直angular三angular形的边长 ?

 a² + b² = c² 

如果从圆的中心画一条线到NW(左上angular),而另一条直线到正方形的西墙(从中心到左边的直线),则有一个三angular形。 现在你可以使用上面的公式来求解c因为你知道三angular形其他边的长度(圆的半径)。

所以现在你的等式变成了

 r² + r² = c² 

这就减less到了

2r²=c²

这进一步减less到

c = squareRoot(2)* r

现在你有距离。 这当然是过分简单化了,因为地球是不平坦的。 如果距离不是很大,可以使用上面的公式,但修改后将球面投影到一个平面上:

http://en.wikipedia.org/wiki/Geographical_distance#Flat-surface_formulae

注意这也使用毕达哥拉斯定理 ,就像我们上面所做的一样。

接下来,您将需要从给定方位的中心点以及上面find的距离计算您的端点(NW和SEangular)。

在这里输入图像说明

这篇文章可能有助于: 计算给定的距离,方位,起点

当使用上面链接的post中的等式时,不要忘记将度数转换为弧度! (乘以pi/180乘以度数)

用JavaScript库,你可以绘制一个中心和半径的圆,然后得到它的界限。

 centerSfo = new google.maps.LatLng(37.7749295, -122.41941550000001); circle = new google.maps.Circle({radius: 5000, center: centerSfo}); bounds = circle.getBounds(); 

你可以使用android api来做同样的事情。

Google提供了一个实用程序库:

http://googlemaps.github.io/android-maps-utils/

Google针对此任务和示例代码推荐: http : //code.google.com/p/gmaps-api-issues/issues/detail?id=5704

虽然如果您的LatLngBounds定义了正方形, Bartek Lipinski的回答是正确的,但是大多数LatLngBounds定义了矩形,因此东北和西南方向中心的方位并不总是45度和255度。

因此,如果您正在寻找从任何四边形的中心获得半径LatLngBounds,请使用您的初始bounds.northeast坐标bounds.northeastbounds.southwest (使用SphericalUtils):

 LatLng northEast = SphericalUtil.computeOffset(center, radius * Math.sqrt(2.0), SphericalUtil.computeHeading(center, bounds.northeast)); LatLng southWest = SphericalUtil.computeOffset(center, radius * Math.sqrt(2.0), (180 + (180 + SphericalUtil.computeHeading(center, bounds.southwest)))); 

(180 + (180 + x)从中心顺时针计算出西南点的方位。