如何在Android的Mapbox SDK中绘制弯曲的折线 [英] How to draw curved polyline in mapbox sdk for Android

查看:441
本文介绍了如何在Android的Mapbox SDK中绘制弯曲的折线的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用Mapbox SDK在地图上的两个点之间绘制一条弯曲的折线.

I want to draw a curved polyline between two points on a map with the Mapbox SDK.

我无法从Mapbox SDK中找到任何解决方案. Turf库尚未准备好在Android上使用.

I could not find any solution from the Mapbox SDK. The Turf library is not ready yet to use it on Android.

推荐答案

我找到了Google Maps SDK的解决方案,所以我将其转换为仅使用Mapbox SDK:

I found a solution with the google maps sdk so I converted it to use only the Mapbox sdk :

受到的启发Google Maps Android中的弧形虚线?

public static List<LatLng> computeCurvedPolyline(LatLng from, LatLng to, double k) {
    //Calculate distance and heading between two points
    double distance = from.distanceTo(to);
    double heading = computeHeading(from, to);
    //Midpoint position
    LatLng p = computeOffset(from, distance * 0.5, heading);

    //Apply some mathematics to calculate position of the circle center
    double x = (1 - k * k) * distance * 0.5 / (2 * k);
    double r = (1 + k * k) * distance * 0.5 / (2 * k);

    LatLng c = computeOffset(p, x, heading + 90.0);

    //Polyline options
    List<LatLng> mapboxLatlng = new ArrayList<>();

    //Calculate heading between circle center and two points
    double h1 = computeHeading(c, from);
    double h2 = computeHeading(c, to);

    //Calculate positions of points on circle border and add them to polyline options
    int numpoints = 100;
    double step = (h2 - h1) / numpoints;

    for (int i = 0; i < numpoints; i++) {
        LatLng pi = computeOffset(c, r, h1 + i * step);
        mapboxLatlng.add(pi);
    }
    return mapboxLatlng;
}

static double computeHeading(LatLng from, LatLng to) {
    double fromLat = Math.toRadians(from.getLatitude());
    double fromLng = Math.toRadians(from.getLongitude());
    double toLat = Math.toRadians(to.getLatitude());
    double toLng = Math.toRadians(to.getLongitude());
    double dLng = toLng - fromLng;
    double heading = Math.atan2(Math.sin(dLng) * Math.cos(toLat), Math.cos(fromLat) * Math.sin(toLat) - Math.sin(fromLat) * Math.cos(toLat) * Math.cos(dLng));
    return wrap(Math.toDegrees(heading), -180.0D, 180.0D);
}

static double wrap(double n, double min, double max) {
    return n >= min && n < max ? n : mod(n - min, max - min) + min;
}

static double mod(double x, double m) {
    return (x % m + m) % m;
}

static LatLng computeOffset(LatLng from, double distance, double heading) {
    distance /= 6371009.0D;
    heading = Math.toRadians(heading);
    double fromLat = Math.toRadians(from.getLatitude());
    double fromLng = Math.toRadians(from.getLongitude());
    double cosDistance = Math.cos(distance);
    double sinDistance = Math.sin(distance);
    double sinFromLat = Math.sin(fromLat);
    double cosFromLat = Math.cos(fromLat);
    double sinLat = cosDistance * sinFromLat + sinDistance * cosFromLat * Math.cos(heading);
    double dLng = Math.atan2(sinDistance * cosFromLat * Math.sin(heading), cosDistance - sinFromLat * sinLat);
    return new LatLng(Math.toDegrees(Math.asin(sinLat)), Math.toDegrees(fromLng + dLng));
}

此代码将返回一个LatLng点列表,您可以在地图上绘制这些点,尽情享受吧!

This code will return a list of LatLng points that you can draw on your map, enjoy !

此代码产生的结果(当然不是模糊的部分!):

The result produced by this code (not the blurred part of course!):

欢迎对此代码进行任何改进!

Any improvement to this code is welcomed !

这篇关于如何在Android的Mapbox SDK中绘制弯曲的折线的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆