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

War*_*lax 45 android google-maps-android-api-2

我相信这是最近的Google Maps API v2的限制.他们最近添加了在地面上绘制圆圈的功能 - 但是如果你想要将摄像机定位为显示整个圆圈,则无法这样做.

可以调用CameraUpdateFactory#newLatLngBounds(bounds,padding),其中"bounds"是LatLngBounds,"padding"是以像素为单位的距离.问题是无法在LatLngBounds中创建LatLng和半径.

LatLngBounds的构造函数只接受2个LatLng实例并生成一个矩形,其中这些是NW和SE角.

Bar*_*ski 105

就像Risadinha提到的那样,你可以轻松实现这一目标android-maps-utils.只需添加:

compile 'com.google.maps.android:android-maps-utils:0.4.4'
Run Code Online (Sandbox Code Playgroud)

对于您的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);
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我们的目标是计算两个点(LatLngs):southwestCornernortheastCorner.从javadoc中SphericalUtil你可以读到225并且45heading值,而且distanceFromCenterToCornerdistance.进一步说明下图中的值:

视觉解释

  • 仅供参考,万一其他人想知道(就像我一样),`distance`,因此`radius`,以米为单位. (8认同)
  • @RobertDolca 它是相乘的,因为您要计算从中心到右上角(或左下角)**角** 的距离。如果您没有将它乘以 `sqrt(2)`,您将得到从中心到顶部(或底部)**边缘**的距离。 (2认同)
  • 最新的是:编译'com.google.maps.android:android-maps-utils:0.4.4' (2认同)

小智 13

使用javascript库,您可以绘制一个具有中心和半径的圆,然后获取其边界.

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

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

  • 实际上,你不能,因为没有getBounds方法. (6认同)

Chr*_*rry 11

这是完全可行的.

LatLng是你圈子的中心吗?你想要做的是将你的圆圈刻在LatLngBounds(Square of a Square问题)里面,这样整个东西就会显示在地图上.

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

还记得如何找到直角三角形边长吗?

a² + b² = c²
Run Code Online (Sandbox Code Playgroud)

如果从圆的中心到NW(左上角)绘制一条直线,另一条直线连接到正方形的西墙(从中心到左边的直线),则会有一个三角形.现在您可以使用上面的等式求解,c因为您知道三角形另一边的长度(圆的半径).

所以现在你的等式变成了

r² + r² = c²
Run Code Online (Sandbox Code Playgroud)

减少到

2r²=c²

这进一步减少到

c = squareRoot(2)*r

现在你有距离.这当然是过于简单化,因为地球并不平坦.如果距离不是很大,您可以使用上面相同的等式,但修改为将球形地球投射到平面上:

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

请注意,这也使用了毕达哥拉斯定理,与上面的相同.

接下来,您将需要从给定轴承的中心点计算您的终点(NW和SE角),以及您在上面找到的距离.

在此输入图像描述

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

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