2016-10-04 53 views
2

我想在Android和iOS上解碼多線字符串(reference)。Android/iOs:解碼折線字符串

例子:

_p~iF~ps|U_ulLnnqC_mqNvxq`@ 

我知道有使用google-maps-utils的可能性,但自從我使用Mapbox我不希望在我的項目(此外,我不允許任何谷歌的依賴)。

Map-box是否爲移動SDK提供相同的功能?我看到他們有一些JavaScript,但我想本地做,以減少來自服務器的響應的大小JSON

或者是我唯一的選擇來實現我自己的解碼算法?

回答

3

列表Mapbox提供相同的功能的Mapbox Android Services一部分。例如,你可以做,沒有谷歌的依賴關係如下:

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

同時,由於精度是可配置的,你也可以運用同樣的方法給其他編碼折線,像那些從OpenStreetMap的到來。

更多示例,您可以check the tests

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; 
} 

您可以使用此功能來解碼折線和創造的經緯度

+0

謝謝,那麼自己的算法是唯一的方法嗎? – StackoverflowForResult