Android / iOs:解码折线字符串

时间:2016-10-04 11:35:18

标签: android ios mapbox polyline

我想在Android和iOS上解码多线字符串(reference)。

示例:

    _p~iF~ps|U_ulLnnqC_mqNvxq`@

我知道有可能使用google-maps-utils,但由于我使用的是Mapbox,我不想在我的项目中使用任何Google依赖项(此外,我不允许使用)。

Map-box是否为移动SDK提供相同的功能?我看到他们为JavaScript提供了一些内容,但我希望本机化,以减少来自服务器的JSON响应的大小。

或者我唯一的选择是实现我自己的解码算法?

2 个答案:

答案 0 :(得分:3)

Mapbox提供的功能与Mapbox Android Services的一部分相同。例如,您可以在没有Google依赖项的情况下执行以下操作:

List<Position> path = PolylineUtils.decode(
  "_p~iF~ps|U_ulLnnqC_mqNvxq`@", Constants.GOOGLE_PRECISION);

此外,由于精度是可配置的,您也可以将相同的方法应用于其他编码折线,例如来自OpenStreetMap的折线。

有关更多示例,您可以check the tests

答案 1 :(得分:0)

public static List<LatLng> decodePolyLines(String poly){
    int len = poly.length();
    int index = 0;
    List<LatLng> decoded = new ArrayList<LatLng>();
    int lat = 0;
    int lng = 0;

    while (index < len){
        int b;
        int shift = 0;
        int result = 0;
        do{
            b = poly.charAt(index++) - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
        lat += dlat;

        shift = 0;
        result = 0;
        do {
            b = poly.charAt(index++) - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        }while (b >= 0x20);
        int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >>1));
        lng += dlng;

        decoded.add(new LatLng(
                lat / 100000d,
                lng / 100000d
        ));
    }
    return decoded;
}

您可以使用此功能解码折线并创建LatLng列表