51

我相信这是最近的 Google Maps API v2 的限制。他们最近增加了在地面上绘制圆圈的功能 - 但如果您想定位相机以使其显示整个圆圈,则没有办法这样做。

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

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

4

5 回答 5

120

就像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

从 javadoc 中,SphericalUtil您可以读到225and45heading值,而 thedistanceFromCenterToCornerdistance. 下图中数值的进一步解释:

视觉解释

于 2015-06-24T14:29:45.787 回答
21

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

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

您可以使用 android api 执行相同的操作。

于 2014-11-13T18:19:17.933 回答
12

这是完全可行的。

LatLng 是你的圆心吗?你想要做的就是在LatLngBounds(正方形内的圆圈问题)内写上你的圆圈,这样整个事物就会显示在地图上。

如果你把它画在纸上,你会发现你拥有计算LatLngBounds.

还记得如何求直角三角形的边长吗?

a² + b² = c²

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

所以现在你的方程变成了

r² + r² = c²

这减少到

2r² = c²

这进一步减少到

c = squareRoot(2) * r

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

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

请注意,这也使用了勾股定理,就像我们在上面所做的一样。

接下来,您需要根据给定方位的中心点和上面找到的距离计算端点(NW 和 SE 角)。

在此处输入图像描述

这篇文章可能会有所帮助:计算给定距离、方位角、起点的端点

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

于 2013-03-10T07:54:37.073 回答
4

谷歌为此提供了一个实用程序库:

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

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

于 2013-10-16T10:58:58.323 回答
2

如果您的 LatLngBounds 定义一个正方形, Bartek Lipinski 的答案是正确的,但大多数 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))从中心顺时针计算西南点的方位角。

于 2016-06-02T09:36:47.043 回答