Google Map 经纬度解码算法

转自:http://blog.csdn.net/ccgang/archive/2011/04/17/6328671.aspx

android在 google map 上画线比较容易实现的,但是现在问题在于如何获取起点和终点之间的路线图。这里我们使用 Google Directions API 来实现, Google Directions API 是一种使用 HTTP 请求计算多个位置间路线的服务。路线可以以文本字符串或纬度 / 经度坐标的形式指定起点、目的地和路标。 Google Directions API 可以使用一系列路标传回多段路线。

 

Google Directions API 请求是以下形式的 HTTP 网址: http://maps.google.com/maps/api/directions/output?parameters

其中, output 可能是以下任何一个值:

l   json (建议)表示以 JavaScript 对象表示法 (JSON) 的形式输出

l   xml 表示以 XML 的形式输出

具体参数参见 http://code.google.com/intl/zh-CN/apis/maps/documentation/directions/

       通过 http 请求获取线路,接下来我们需要对返回结果进行解析,提取出导航线路的一系列路标。

如果我们只是简单的画图路线路,返回结果中的字段 overview_path 包含可我们所需要的数据。它包含一个对象,该对象包含一组表示生成路线的近似(平滑)路径的已编码 points levels 。编码算法参见 http://code.google.com/intl/zh-CN/apis/maps/documentation/utilities/polylinealgorithm.html 说明。

我们只需要提取 points 字段中的字符串进行解码就可以得到我们所需的一系列点了,将这些点按顺序连接起来就是我们所要的路线图了。

 

  1. /**  
  2.      * 通过解析google map返回的xml,在map中画路线图  
  3.      */   
  4.     public   void  drawRoute(){  
  5.           
  6.         String url = "http://maps.google.com/maps/api/directions/xml?origin=23.055291,113.391802"  +  
  7.                 "&destination=23.046604,113.397510&sensor=false&mode=walking" ;  
  8.           
  9.         HttpGet get = new  HttpGet(url);  
  10.         String strResult = "" ;  
  11.         try  {  
  12.             HttpParams httpParameters = new  BasicHttpParams();  
  13.             HttpConnectionParams.setConnectionTimeout(httpParameters, 3000 );  
  14.             HttpClient httpClient = new  DefaultHttpClient(httpParameters);   
  15.               
  16.             HttpResponse httpResponse = null ;  
  17.             httpResponse = httpClient.execute(get);  
  18.               
  19.             if  (httpResponse.getStatusLine().getStatusCode() ==  200 ){  
  20.                 strResult = EntityUtils.toString(httpResponse.getEntity());  
  21.             }  
  22.         } catch  (Exception e) {  
  23.             return ;  
  24.         }  
  25.           
  26.         if  (- 1  == strResult.indexOf( "<status>OK</status>" )){  
  27.             Toast.makeText(this"获取导航路线失败!" , Toast.LENGTH_SHORT).show();  
  28.             this .finish();  
  29.             return ;  
  30.         }  
  31.           
  32.         int  pos = strResult.indexOf( "<overview_polyline>" );  
  33.         pos = strResult.indexOf("<points>" , pos +  1 );  
  34.         int  pos2 = strResult.indexOf( "</points>" , pos);  
  35.         strResult = strResult.substring(pos + 8 , pos2);  
  36.           
  37.         List<GeoPoint> points = decodePoly(strResult);  
  38.           
  39.         MyOverLay mOverlay = new  MyOverLay(points);  
  40.         List<Overlay> overlays = mMapView.getOverlays();  
  41.         overlays.add(mOverlay);  
  42.           
  43.         if  (points.size() >=  2 ){  
  44.             mMapController.animateTo(points.get(0 ));  
  45.         }  
  46.            
  47.         mMapView.invalidate();  
  48.     }  
  49.   
  50.   
  51.  /**  
  52.      * 解析返回xml中overview_polyline的路线编码  
  53.      *   
  54.      * @param encoded  
  55.      * @return  
  56.      */   
  57.     private  List<GeoPoint> decodePoly(String encoded) {  
  58.   
  59.         List<GeoPoint> poly = new  ArrayList<GeoPoint>();  
  60.         int  index =  0 , len = encoded.length();  
  61.         int  lat =  0 , lng =  0 ;  
  62.   
  63.         while  (index < len) {  
  64.             int  b, shift =  0 , result =  0 ;  
  65.             do  {  
  66.                 b = encoded.charAt(index++) - 63 ;  
  67.                 result |= (b & 0x1f ) << shift;  
  68.                 shift += 5 ;  
  69.             } while  (b >=  0x20 );  
  70.             int  dlat = ((result &  1 ) !=  0  ? ~(result >>  1 ) : (result >>  1 ));  
  71.             lat += dlat;  
  72.   
  73.             shift = 0 ;  
  74.             result = 0 ;  
  75.             do  {  
  76.                 b = encoded.charAt(index++) - 63 ;  
  77.                 result |= (b & 0x1f ) << shift;  
  78.                 shift += 5 ;  
  79.             } while  (b >=  0x20 );  
  80.             int  dlng = ((result &  1 ) !=  0  ? ~(result >>  1 ) : (result >>  1 ));  
  81.             lng += dlng;  
  82.   
  83.             GeoPoint p = new  GeoPoint(( int ) ((( double ) lat / 1E5) * 1E6),  
  84.                  (int ) ((( double ) lng / 1E5) * 1E6));  
  85.             poly.add(p);  
  86.         }  
  87.   
  88.         return  poly;  
  89.     }  

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值