Google Maps v2居中并转动相机位置以适合两个标记

时间:2014-02-07 18:15:00

标签: android google-maps camera google-maps-markers

我正在努力如何使用相机移动以适应我的两个标记并将它们保持在同一水平。因此,这意味着修改缩放以适应它们并转动相机以适合同一行上的标记。

接下来的两张照片将澄清我的问题:

Current state Desired state

所以,到目前为止我做的是:

public void centerIncidentRouteOnMap(List<LatLng> copiedPoints) {
        double minLat = Integer.MAX_VALUE;
        double maxLat = Integer.MIN_VALUE;
        double minLon = Integer.MAX_VALUE;
        double maxLon = Integer.MIN_VALUE;
        for (LatLng point : copiedPoints) {
            maxLat = Math.max(point.latitude, maxLat);
            minLat = Math.min(point.latitude, minLat);
            maxLon = Math.max(point.longitude, maxLon);
            minLon = Math.min(point.longitude, minLon);
        }
        final LatLngBounds bounds = new LatLngBounds.Builder().include(new LatLng(maxLat, maxLon)).include(new LatLng(minLat, minLon)).build();
        mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 120));
}

但这只会使两个标记适合屏幕,所以我需要知道如何用正确的角度旋转相机以获得最后一张照片。

有人可以帮我吗?

谢谢!

4 个答案:

答案 0 :(得分:9)

我不确定我有多正确,但我只是在分享我的想法。

  1. 找到两个标记的中间点(纬度经度)

    private LatLng midPoint(double lat1, double long1, double lat2,double long2)
    {
    
    return new LatLng((lat1+lat2)/2, (long1+long2)/2);
    
    }
    
  2. 计算中间点与任何其他标记位置之间的角度。

    private double angleBteweenCoordinate(double lat1, double long1, double lat2,
        double long2) {
    
    double dLon = (long2 - long1);
    
    double y = Math.sin(dLon) * Math.cos(lat2);
    double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1)
            * Math.cos(lat2) * Math.cos(dLon);
    
    double brng = Math.atan2(y, x);
    
    brng = Math.toDegrees(brng);
    brng = (brng + 360) % 360;
    brng = 360 - brng;
    
    return brng;
    }
    
  3. 将地图旋转到该角度。

      

    CameraPosition cameraPosition = new   CameraPosition.Builder()。target(midPoint(lat1,lng1,lat2,   lng2))。zoom(14).bearing(angleBteweenCoordinate(lat1,lng1,lat2,   lng2))建立();

         

    mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

答案 1 :(得分:4)

在 - 几乎 - 伪代码中,尝试类似的东西:

CameraPosition cameraPosition = new CameraPosition.Builder()
.target(Your_target)      // Sets the center of the map
.zoom(YourZoom)                   // Sets the zoom
.bearing(Your_Angle)                // -90 = west, 90 = east
.tilt(Some_Tilt)      

map.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

检索角度:

float xDiff = x2 - x1;
float yDiff = y2 - y1;
return Math.Atan2(yDiff, xDiff) * 180.0 / Math.PI;

答案 2 :(得分:1)

您还可以使用Location.distanceBetween找到两点的方位。此方法返回初始轴承和最终轴承。您可以找到它们之间的区别here

答案 3 :(得分:0)

相机运动部件CameraPosition

CameraPosition cPosition = CameraPosition(
          zoom: 8,
          // tilt: 90,
          // bearing: -30,
          target: midPoint(_point1.latitude, _point1.longitude, _point2.latitude,
              _point2.longitude),
        );

目标CameraPosition

LatLng midPoint(double lat1, double long1, double lat2, double long2) {
    return new LatLng((lat1 + lat2) / 2, (long1 + long2) / 2);
  }

之后,将其添加到地图控制器

controller.animateCamera(CameraUpdate.newCameraPosition(cPosition));