将纬度和经度的折线编码为ascii值

时间:2011-08-29 09:32:30

标签: java google-maps polyline google-polyline

任何人都可以使用代码将折线(数组)纬度和经度值编码为java中的ascii字符串

例如。

我的数组是在java

latlng{
  {22296401,70797251},
  {22296401,70797451},
  {22296401,70797851}
}

以上值存储为List对象,如GeoPoint类型

List<GeoPoint> polyline

并希望像这样转换为ascii字符串

a~l~Fjk~uOwHJy@P

我需要接受latlng值数组并返回ascii字符串的方法 任何帮助将提前感谢

1 个答案:

答案 0 :(得分:2)

我从this post

得到答案

需要这两个函数来将折线数组编码为ascii字符串

private static String encodeSignedNumber(int num) {
    int sgn_num = num << 1;
    if (num < 0) {
        sgn_num = ~(sgn_num);
    }
    return(encodeNumber(sgn_num));
}

private static String encodeNumber(int num) {

    StringBuffer encodeString = new StringBuffer();

    while (num >= 0x20) {
        encodeString.append((char)((0x20 | (num & 0x1f)) + 63));
        num >>= 5;
    }

    encodeString.append((char)(num + 63));

    return encodeString.toString();

} 

进行测试尝试来自this站点的坐标并比较输出

这是片段

StringBuffer encodeString = new StringBuffer();

String encode = Geo_Class.encodeSignedNumber(3850000)+""+Geo_Class.encodeSignedNumber(-12020000);                       
encodeString.append(encode);
encode = Geo_Class.encodeSignedNumber(220000)+""+Geo_Class.encodeSignedNumber(-75000);                      
encodeString.append(encode);
encode = Geo_Class.encodeSignedNumber(255200)+""+Geo_Class.encodeSignedNumber(-550300);                     
encodeString.append(encode);

Log.v("encode string", encodeString.toString());

来自你得到这一点的坐标链接

Points: (38.5, -120.2), (40.7, -120.95), (43.252, -126.453)

好的,所以现在你认为坐标是为什么不同看你何时得到新的坐标然后你从前一个减去例如

1. 3850000,-12020000 => 3850000,-12020000
2. 4070000,-12095000 => (4070000 - 3850000),(-12095000 - -12020000) => +220000, -75000

您必须传递给encodeSignedNumber()方法的值,并获得该坐标的ascii值

依旧......