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

如何在Android Google Maps API v2中将LatLng和radius转换为LatLngBounds?,android,google-maps-android-api-2,Android,Google Maps Android Api 2,我相信这是最近谷歌地图API v2的一个局限性。他们最近增加了在地面上画一个圆的功能,但是如果你想定位相机,使其显示整个圆,没有办法做到这一点 可以将CameraUpdateFactory称为#newLatLngBounds(边界,填充),其中“边界”是LatLngBounds,“填充”是以像素为单位的距离。问题在于,无法在LatLngBounds中创建LatLng和半径 LatLngBounds的构造函数只接受2个LatLng实例,并生成一个矩形,其中这些是NW和SE角。这是完全可行的 板条是

我相信这是最近谷歌地图API v2的一个局限性。他们最近增加了在地面上画一个圆的功能,但是如果你想定位相机,使其显示整个圆,没有办法做到这一点

可以将CameraUpdateFactory称为#newLatLngBounds(边界,填充),其中“边界”是LatLngBounds,“填充”是以像素为单位的距离。问题在于,无法在LatLngBounds中创建LatLng和半径


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

这是完全可行的

板条是你的圆心,对吗?你要做的是在
LatLngBounds
(正方形问题中的圆圈)内刻上你的圆圈,这样整个事情就会显示在地图上

如果你把它画在纸上,你会发现你拥有了计算你的
LatLngBounds
所需的一切

记得怎么做吗

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

现在你的方程变成了

r² + r² = c²
减少到

2r²=c²

这进一步减少到

c=平方根(2)*r

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

请注意,这也使用了,与上面所做的相同

接下来,您需要计算从给定方向角的中心点开始的端点(NW和SE角)以及上面找到的距离

这篇文章可能有助于:


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

谷歌有一个实用程序库:

Google推荐用于此任务和示例代码:

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

centerSfo = new google.maps.LatLng(37.7749295, -122.41941550000001);
circle = new google.maps.Circle({radius: 5000, center: centerSfo});
bounds = circle.getBounds();
您可以使用android api实现同样的功能。

正如前面提到的,您可以使用
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
):

  • 西南角

  • 东北角
从的javadoc中,您可以看到
225
45
标题
值,
distance fromcenter to corner
距离
。下图中数值的进一步说明:

如果你的纬度边界定义了一个正方形,答案是正确的,但大多数纬度边界定义了矩形,因此,东北和西南点与中心的方位角并不总是45度和255度

因此,如果您希望从任何四边形的中心获取半径的LatLngBounds,请使用初始
边界.Northwest
边界.southwest
的坐标,如下所示(使用球体解):


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

@EmilAdz目前有点不正确,因为距离方程在计算平面值,而它应该计算测地值。除非读者是a,否则可能没问题。谢谢@Christopherry,但我有点希望通过现有的Android API实现这一点。虽然您的解决方案是正确的(对于足够小的圆圈),但重写更大数量的易于出错的逻辑。好吧,对于X framework没有提供的东西,我不得不大量使用自己的代码。为什么不做一些TDD并编写一些测试来输出代码,然后您就知道它是如何工作的了?它不应该是一个大的函数,它可以分成几部分,每一部分都可以单独测试,因此如果有错误,您将确切地知道在哪里查找,或者改进您的算法。您好@Christopherry,我可以从这个答案中获得一些信息,以满足我的需要。我想计算设备上“X”缩放级别半径的像素数。基本上,我有我自己的圆圈覆盖在地图上,以创建区域。现在我想根据缩放级别调整圆的宽度。你们能帮我一个线索吗?嗨,克里斯托弗贝利,我刚刚在这里发布了一个问题,225和45是什么?以及为什么需要sqrt?仅供参考,如果其他人想知道(就像我一样),距离和半径都是以米为单位的。为什么要乘以sqrt(2)。第二个参数不是以米为单位的距离吗?@RobertDolca它是相乘的,因为您要计算从中心到右上角(或左下角)的距离。如果你不把它乘以
sqrt(2)
你会得到从中心到顶部(或底部)边缘的距离。最新的是:compile'com.google.maps.android:android-maps-utils:0.4.4'是的,这可能是我在这里得到的最好答案。只是一个小更新:var circle=new window.google.maps.circle({center:,map:,radius:,//fillColor:'#FF0000'实际上,你不能,因为没有getBounds方法。是的,它工作得很好!APIv2没有它,需要一个变通方法。因此,由于OP非常旧,它应该解决更晚的API v3。你链接了Javascript API,Android API没有它
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);
}
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))));