我认为这是最近的Google Maps API v2的限制。他们最近添加了在地面上绘制圆圈的功能 - 但是如果你想将相机定位为显示整个圆圈,则无法这样做。
可以调用CameraUpdateFactory #newLatLngBounds(bounds,padding),其中" bounds"是一个LatLngBounds和"填充"是像素的距离。问题是无法在LatLngBounds中创建LatLng和半径。
LatLngBounds的构造函数只接受2个LatLng实例并生成一个矩形,其中这些是NW和SE角。
答案 0 :(得分:100)
就像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
。进一步解释下图中的值:
答案 1 :(得分:12)
使用javascript库,您可以绘制一个具有中心和半径的圆,然后获取其边界。
centerSfo = new google.maps.LatLng(37.7749295, -122.41941550000001);
circle = new google.maps.Circle({radius: 5000, center: centerSfo});
bounds = circle.getBounds();
你可以使用android api做同样的事。
答案 2 :(得分:11)
这是完全可行的。
LatLng是你圈子的中心吗?你想要做的是在LatLngBounds
(广场问题中的圆圈)中刻上你的圆圈,这样整个事物就会显示在地图上。
如果你在纸上画这个,你可以看到你拥有计算LatLngBounds
所需的一切。
还记得如何find the lengths of the sides of a right triangle吗?
a² + b² = c²
如果从圆的中心到NW(左上角)绘制一条直线,另一条直线连接到正方形的西墙(从中心到左边的直线),则会有一个三角形。现在您可以使用上面的等式来求解c
,因为您知道三角形另一边的长度(圆的半径)。
所以现在你的等式变为
r² + r² = c²
减少到
2r²=c²
进一步减少到
c = squareRoot(2)* r
现在你有了距离。这当然是过于简单化,因为地球并不平坦。如果距离不是很大,你可以使用上面相同的公式,但修改后将球形地球投射到一个平面上:
http://en.wikipedia.org/wiki/Geographical_distance#Flat-surface_formulae
请注意,这也使用Pythagorean theorem,与上面的相同。
接下来,您将需要从给定轴承的中心点计算您的终点(NW和SE角),以及您在上面找到的距离。
这篇文章可能有所帮助:Calculate endpoint given distance, bearing, starting point
使用上面链接的方程式时,不要忘记将度数转换为弧度! (乘以pi/180
)
答案 3 :(得分:4)
Google有一个实用程序库:
http://googlemaps.github.io/android-maps-utils/
Google推荐此任务和示例代码: http://code.google.com/p/gmaps-api-issues/issues/detail?id=5704
答案 4 :(得分:2)
如果你的LatLngBounds定义了一个正方形,Bartek Lipinski's的答案是正确的,那么大多数LatLngBounds都会定义矩形,因此,从中心开始的东北和西南点的方位并不总是45和255度。
因此,如果您希望从任何四边形的中心获取半径的LatLngBounds,请使用您的初始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))
从中心顺时针计算西南点的方位。