如何将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
): southwestCorner
和northeastCorner
。 从SphericalUtil
的javadoc中,您可以看到225
和45
是heading
值, distanceFromCenterToCorner
是distance
。 下图中的值的进一步说明:
这是完全可行的。
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.northeast
和bounds.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)
从中心顺时针计算出西南点的方位。