Android 解析谷歌地图的折线编码

2022-07-04  本文已影响0人  itfitness

目录

折线编码算法格式

Google官网是这么说明的


实现代码

使用Java代码对其解析如下所示

/**
     * 解析成坐标点
     * @param encoded 折线编码
     * @return
     */
private List<LatLng> getPoints(String encoded){
        List<LatLng> points=new ArrayList<LatLng>();
        List<Barcode.GeoPoint> geoPoints = decodePoly(encoded);
        LatLng ll;
        for(Iterator<Barcode.GeoPoint> gpit=geoPoints.iterator();gpit.hasNext();){
            Barcode.GeoPoint gp=gpit.next();
            double latitude=gp.lat;
            latitude=latitude/1000000;
            double longitude=gp.lng;
            longitude=longitude/1000000;
            ll=new LatLng(latitude, longitude);
            points.add(ll);
        }
        return points;
    }

    private List<Barcode.GeoPoint> decodePoly(String encoded) {
        List<Barcode.GeoPoint> poly = new ArrayList<Barcode.GeoPoint>();
        int index = 0, len = encoded.length();
        int lat = 0, lng = 0;
        while (index < len) {
            int b, shift = 0, result = 0;
            do {
                b = encoded.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 = encoded.charAt(index++) - 63;
                result |= (b & 0x1f) << shift;
                shift += 5;
            } while (b >= 0x20);
            int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
            lng += dlng;

            Barcode.GeoPoint p = new Barcode.GeoPoint(1,((double) lat / 1E5) * 1E6,
                    ((double) lng / 1E5) * 1E6);
            poly.add(p);
        }
        return poly;
    }

这里我用的折线编码为:

"kay~E{w|iUAWAY?GCc@?GIw@Mi@GSEM"

解析后的结果为:


上一篇下一篇

猜你喜欢

热点阅读