Android 计算增加高度的经纬度

Android 计算增加高度的经纬度,android,gps,latitude-longitude,Android,Gps,Latitude Longitude,我想在Android谷歌地图上画一个折线图。 我有路径的gps坐标,我想在地图上用线的高度显示汽车的速度 看这张像这样的图片 对于每个gps(纬度,液化天然气)点,我想添加一些高度,并计算相应的gps(纬度,液化天然气)点。我想在3D视图中显示这一点,所以当相机位置改变时,我必须改变这些点,但第一步是用增加的高度计算gps点 比如说 ArrayList<LatLng> basePoints = new ArrayList<LatLng>(); basePoints.ad

我想在Android谷歌地图上画一个折线图。 我有路径的gps坐标,我想在地图上用线的高度显示汽车的速度

看这张像这样的图片

对于每个gps(纬度,液化天然气)点,我想添加一些高度,并计算相应的gps(纬度,液化天然气)点。我想在3D视图中显示这一点,所以当相机位置改变时,我必须改变这些点,但第一步是用增加的高度计算gps点

比如说

ArrayList<LatLng> basePoints = new ArrayList<LatLng>();
basePoints.add(new LatLng(53.262688, -2.500792));
basePoints.add(new LatLng(53.262758, -2.500897));
basePoints.add(new LatLng(53.262789, -2.501087));
basePoints.add(new LatLng(53.262798, -2.501229));
basePoints.add(new LatLng(53.262785, -2.501414));
basePoints.add(new LatLng(53.262760, -2.501594));
basePoints.add(new LatLng(53.262707, -2.501811));
basePoints.add(new LatLng(53.262655, -2.501943));

ArrayList<LatLng> topPoints = new ArrayList<LatLng>();
topPoints.add(new LatLng(53.262939, -2.500779));
topPoints.add(new LatLng(53.262975, -2.500916));
topPoints.add(new LatLng(53.262914, -2.501098));
topPoints.add(new LatLng(53.263055, -2.501248));
topPoints.add(new LatLng(53.262925, -2.501439));
topPoints.add(new LatLng(53.263045, -2.501581));
topPoints.add(new LatLng(53.262907, -2.501844));
topPoints.add(new LatLng(53.263002, -2.502015));
ArrayList基点=新建ArrayList();
增加(新的LatLng(53.262688,-2.500792));
增加(新的LatLng(53.262758,-2.500897));
增加(新的LatLng(53.262789,-2.501087));
增加(新车床(53.262798,-2.501229));
增加(新的LatLng(53.262785,-2.501414));
增加(新的LatLng(53.262760,-2.501594));
增加(新的LatLng(53.262707,-2.501811));
增加(新的LatLng(53.262655,-2.501943));
ArrayList topPoints=新的ArrayList();
添加(新板条(53.262939,-2.500779));
添加(新板条(53.262975,-2.500916));
添加(新板条(53.262914,-2.501098));
添加(新板条(53.263055,-2.501248));
添加(新板条(53.262925,-2.501439));
添加(新板条(53.263045,-2.501581));
添加(新板条(53.262907,-2.501844));
添加(新板条(53.263002,-2.502015));
知道我该怎么做吗?
谢谢计算一米的度数:

在赤道:

360度, 有400000米的圆周

那么一米大约是

double static final METERS_PER_DEGREE = 360.0 / 40 000 000;
现在将纬度偏移3米:

lat = lat + 3 * METERS_PER_DEGREE.
当偏移经度时,必须乘以cos(数学上的toRadians(纬度);

根据您提供的信息,我已经为您实现了这一点

final ArrayList<LatLng> basePoints = new ArrayList<LatLng>();
basePoints.add(new LatLng(53.262688, -2.500792));
basePoints.add(new LatLng(53.262758, -2.500897));
basePoints.add(new LatLng(53.262789, -2.501087));
basePoints.add(new LatLng(53.262798, -2.501229));
basePoints.add(new LatLng(53.262785, -2.501414));
basePoints.add(new LatLng(53.262760, -2.501594));
basePoints.add(new LatLng(53.262707, -2.501811));
basePoints.add(new LatLng(53.262655, -2.501943));

final ArrayList<Double> speedPoints = new ArrayList<Double>();
speedPoints.add(7.955734692);
speedPoints.add(8.761378798);
speedPoints.add(11.07760474);
speedPoints.add(13.69594751);
speedPoints.add(15.50864695);
speedPoints.add(16.01217576);
speedPoints.add(15.60935179);
speedPoints.add(15.71005663);

LatLngBounds.Builder bounds = new LatLngBounds.Builder();
for(int i=0;i<basePoints.size();i++)
{
    bounds.include(basePoints.get(i));
}
map.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds.build(), 300,300,0));
map.setOnCameraChangeListener(new OnCameraChangeListener() {
    @Override
    public void onCameraChange(CameraPosition arg0)
    {
        map.clear();
        ArrayList<LatLng> topPoints = new ArrayList<LatLng>();
        for(int i=0;i<basePoints.size();i++)
        {
            topPoints.add(moveByDistance(basePoints.get(i), speedPoints.get(i)*3,map.getCameraPosition().bearing));
        }
        PolylineOptions topPO = new PolylineOptions();
        topPO.addAll(topPoints).width(5).color(Color.BLUE).geodesic(true);
        map.addPolyline(topPO);
        for(int i=0;i<basePoints.size()-1;i++)
        {
            map.addPolygon(new PolygonOptions().add(basePoints.get(i),topPoints.get(i),topPoints.get(i+1),basePoints.get(i+1),basePoints.get(i)).fillColor(Color.YELLOW).strokeColor(Color.YELLOW));
        }
    }

});

/**
 * Move a LatLng-Point into a given distance and a given angle (0-360,
 * 0=North).
 */
public static LatLng moveByDistance(LatLng startGp, double distance,double angle) {
    /*
     * Calculate the part going to north and the part going to east.
     */
    double arc = Math.toRadians(angle);
    double toNorth = distance * Math.cos(arc);
    double toEast = distance * Math.sin(arc);
    double lonDiff = meterToLongitude(toEast, startGp.latitude);
    double latDiff = meterToLatitude(toNorth);
    return new LatLng(startGp.latitude + latDiff, startGp.longitude + lonDiff);
}

private static double meterToLongitude(double meterToEast, double latitude) {
    double latArc = Math.toRadians(latitude);
    double radius = Math.cos(latArc) * EARTHRADIUS;
    double rad = meterToEast / radius;
    double degrees = Math.toDegrees(rad);
    return degrees;
}

private static double meterToLatitude(double meterToNorth) {
    double rad = meterToNorth / EARTHRADIUS;
    double degrees = Math.toDegrees(rad);
    return degrees;
}
final ArrayList basePoints=new ArrayList();
增加(新的LatLng(53.262688,-2.500792));
增加(新的LatLng(53.262758,-2.500897));
增加(新的LatLng(53.262789,-2.501087));
增加(新车床(53.262798,-2.501229));
增加(新的LatLng(53.262785,-2.501414));
增加(新的LatLng(53.262760,-2.501594));
增加(新的LatLng(53.262707,-2.501811));
增加(新的LatLng(53.262655,-2.501943));
最终ArrayList速度点=新建ArrayList();
特快积分。加上(7.955734692);
特快积分。增加(8.761378798);
特快专递积分。增加(11.07760474);
特快积分。加上(13.69594751);
特快积分。加上(15.50864695);
特快积分。增加(16.01217576);
特快积分。加上(15.60935179);
特快积分。加上(15.71005663);
LatLngBounds.Builder bounds=新的LatLngBounds.Builder();

对于(int i=0;iThanks,我正在寻找一个似乎运行良好的答案这正是我想要做的,我不认为这会那么容易。CameraChangeListener很容易实现。谢谢:)
final ArrayList<LatLng> basePoints = new ArrayList<LatLng>();
basePoints.add(new LatLng(53.262688, -2.500792));
basePoints.add(new LatLng(53.262758, -2.500897));
basePoints.add(new LatLng(53.262789, -2.501087));
basePoints.add(new LatLng(53.262798, -2.501229));
basePoints.add(new LatLng(53.262785, -2.501414));
basePoints.add(new LatLng(53.262760, -2.501594));
basePoints.add(new LatLng(53.262707, -2.501811));
basePoints.add(new LatLng(53.262655, -2.501943));

final ArrayList<Double> speedPoints = new ArrayList<Double>();
speedPoints.add(7.955734692);
speedPoints.add(8.761378798);
speedPoints.add(11.07760474);
speedPoints.add(13.69594751);
speedPoints.add(15.50864695);
speedPoints.add(16.01217576);
speedPoints.add(15.60935179);
speedPoints.add(15.71005663);

LatLngBounds.Builder bounds = new LatLngBounds.Builder();
for(int i=0;i<basePoints.size();i++)
{
    bounds.include(basePoints.get(i));
}
map.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds.build(), 300,300,0));
map.setOnCameraChangeListener(new OnCameraChangeListener() {
    @Override
    public void onCameraChange(CameraPosition arg0)
    {
        map.clear();
        ArrayList<LatLng> topPoints = new ArrayList<LatLng>();
        for(int i=0;i<basePoints.size();i++)
        {
            topPoints.add(moveByDistance(basePoints.get(i), speedPoints.get(i)*3,map.getCameraPosition().bearing));
        }
        PolylineOptions topPO = new PolylineOptions();
        topPO.addAll(topPoints).width(5).color(Color.BLUE).geodesic(true);
        map.addPolyline(topPO);
        for(int i=0;i<basePoints.size()-1;i++)
        {
            map.addPolygon(new PolygonOptions().add(basePoints.get(i),topPoints.get(i),topPoints.get(i+1),basePoints.get(i+1),basePoints.get(i)).fillColor(Color.YELLOW).strokeColor(Color.YELLOW));
        }
    }

});

/**
 * Move a LatLng-Point into a given distance and a given angle (0-360,
 * 0=North).
 */
public static LatLng moveByDistance(LatLng startGp, double distance,double angle) {
    /*
     * Calculate the part going to north and the part going to east.
     */
    double arc = Math.toRadians(angle);
    double toNorth = distance * Math.cos(arc);
    double toEast = distance * Math.sin(arc);
    double lonDiff = meterToLongitude(toEast, startGp.latitude);
    double latDiff = meterToLatitude(toNorth);
    return new LatLng(startGp.latitude + latDiff, startGp.longitude + lonDiff);
}

private static double meterToLongitude(double meterToEast, double latitude) {
    double latArc = Math.toRadians(latitude);
    double radius = Math.cos(latArc) * EARTHRADIUS;
    double rad = meterToEast / radius;
    double degrees = Math.toDegrees(rad);
    return degrees;
}

private static double meterToLatitude(double meterToNorth) {
    double rad = meterToNorth / EARTHRADIUS;
    double degrees = Math.toDegrees(rad);
    return degrees;
}