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

时间:2013-03-10 06:02:34

标签: android google-maps-android-api-2

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

可以调用CameraUpdateFactory #newLatLngBounds(bounds,padding),其中" bounds"是一个LatLngBounds和"填充"是像素的距离。问题是无法在LatLngBounds中创建LatLng和半径。

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

5 个答案:

答案 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):southwestCornernortheastCorner。在SphericalUtil的javadoc中,您可以看到22545heading值,distanceFromCenterToCornerdistance。进一步解释下图中的值:

visual explanation

答案 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角),以及您在上面找到的距离。

enter image description here

这篇文章可能有所帮助: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.northeastbounds.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))从中心顺时针计算西南点的方位。