【问题标题】:How to show direction on map based on calculated angle in degrees如何根据计算的角度在地图上显示方向(以度为单位)
【发布时间】:2013-04-01 14:08:10
【问题描述】:

我已经计算出两个纬度和经度坐标之间的角度,如下代码所示。它返回角度为 3 的弧度和 193 的度数。我想根据这个角度在地图上显示箭头标记。如何根据这个角度显示移动的对象方向?

public static double getAngle(double lat1, double lon1, double lat2, double lon2)
    {
        //Formulas

    //θ =   atan2(  sin(Δlong).cos(lat2),cos(lat1).sin(lat2) − sin(lat1).cos(lat2).cos(Δlong) )
    // Δlong = long2 - long1
    Log.i("angle", "Inside getAngle");
    double latitude1 = Math.toRadians(lat1);
    double longitude1 = Math.toRadians(lon1);
    double latitude2 = Math.toRadians(lat2);
    double longitude2 = Math.toRadians(lon2);


    double dlong = Math.toRadians(longitude2-longitude1);

    double y = Math.sin(dlong) * Math.cos(latitude2);
    double x = Math.cos(latitude1)*Math.sin(latitude2) - Math.sin(latitude1)*Math.cos(latitude2)*Math.cos(dlong);
    double angle= Math.atan2(y, x);


    if (angle < 0)
        angle = Math.abs(angle);
    else
        angle = 2*Math.PI - angle;

    Log.i("angle", String.valueOf(angle)+" in radians");

    angle=Math.toDegrees(angle);
    Log.i("angle", String.valueOf(angle)+" in degrees");

    return angle;
}

【问题讨论】:

  • 所以尝试这样 Uri.parse("maps.google.com/maps?f=d&daddr=51.448,-0.972")); 得到两点之间的方向..
  • 不,我不想使用 Google Directions API 和路线。我已经有了路线位置。只是我想用带箭头的折线连接。

标签: android google-maps geometry compass-geolocation


【解决方案1】:

我在地图上以相同角度获得了角度和旋转箭头图像。这使得路线的方向相似。

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;

/* inside for loop of all Latitude Longitude values */
float angle=(float)finalBearing(previousLocationLatitude, previousLocationLongitude, currentLocationLatitude, currentLocationLongitude);

Bitmap sprite = BitmapFactory.decodeResource(this.getResources(),R.drawable.dir_green_image);

Matrix mat = new Matrix();
mat.preRotate(angle);///in degree
Bitmap mBitmap = Bitmap.createBitmap(sprite, 0, 0, sprite.getWidth(), sprite.getHeight(), mat, true);

mMap.addMarker(new MarkerOptions().position(new LatLng(currentLocationLatitude, currentLocationLongitude)).icon(BitmapDescriptorFactory.fromBitmap(mBitmap)).anchor((float)0.5, (float)0.5));
/* inside for loop of all Latitude Longitude values */


static public double initialBearing (double lat1, double long1, double lat2, double long2)
{
    return (_bearing(lat1, long1, lat2, long2) + 360.0) % 360;
}

static public double finalBearing(double lat1, double long1, double lat2, double long2)
{
    return (_bearing(lat2, long2, lat1, long1) + 180.0) % 360;
}

static private double _bearing(double lat1, double long1, double lat2, double long2)
{
    double degToRad = Math.PI / 180.0;
    double phi1 = lat1 * degToRad;
    double phi2 = lat2 * degToRad;
    double lam1 = long1 * degToRad;
    double lam2 = long2 * degToRad;

    return Math.atan2(Math.sin(lam2-lam1)*Math.cos(phi2),
        Math.cos(phi1)*Math.sin(phi2) - Math.sin(phi1)*Math.cos(phi2)*Math.cos(lam2-lam1)
    ) * 180/Math.PI;
}

【讨论】:

  • 您能否详细说明您是如何做到这一点的?我也需要实现相同的。
猜你喜欢
  • 2020-04-01
  • 2017-01-13
  • 2011-11-18
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
  • 2020-05-25
  • 2012-04-15
  • 2020-01-01
相关资源
最近更新 更多