android和ios GoogleMap画导航线路图路径规划(Directions)

本文适合【Android iOS】下的google地图开发

转自:HTTP://blog.csdn .NET / mad1989 /条/信息/ 9734667

1.0 GoogleMap路径规划

Google Mapandroid版和IOS版的SDK都没有集成路径规划的相关API,若要实现,只能通过http链接请求URL,携带起点终点经纬度,得到返回集合,在地图中展示。

 Google路线API:https//developers.google.com/maps/documentation/directions/#Waypoints

 路线服务:https//developers.google.com/maps/documentation/javascript/directions#DirectionsRequests


1.1请求链接

举个例子: 

https://maps.googleapis.com/maps/api/directions/json?origin=39.99709957757345,116.31184045225382&destination=39.949158391497214,116.4154639095068&sensor=false&mode=driving

起点=起点经纬度destination =终点经纬度 


返回的JSON数据(网页打开):


1.2 android实例

1.2.1 getDestinationURL

代码:
[java]  查看纯 文本 
  1. / ** 
  2.  *通过起点终点,组合成网址 
  3.  *  
  4.  * @参数来源 
  5.  * @param dest 
  6.  * @返回 
  7.  * /  
  8. private  String getDirectionsUrl(LatLng origin,LatLng dest){  
  9.   
  10.     //路由的起源  
  11.     String str_origin =  “origin =”  + origin.latitude +  “,”  
  12.             + origin.longitude;  
  13.   
  14.     //路线的目的地  
  15.     String str_dest =  “destination =”  + dest.latitude +  “,”  + dest.longitude;  
  16.   
  17.     //启用传感器  
  18.     String sensor =  “sensor = false” ;  
  19.   
  20.     //旅行模式  
  21.     String mode =  “mode = driving” ;  
  22.       
  23.     //waypoints,116.32885,40.036675  
  24.     String waypointLatLng =  “waypoints =” “40.036675” “,” “116.32885” ;  
  25.   
  26.     //将参数构建到Web服务  
  27.     字符串参数= str_origin +  “&”  + str_dest +  “&”  + sensor +  “&”  
  28.             + mode + “&” + waypointLatLng;  
  29.   
  30.     // 输出格式  
  31.     String output =  “json” ;  
  32.   
  33.     //建立网址到网络服务  
  34.     String url =  “https://maps.googleapis.com/maps/api/directions/”  
  35.             +输出+  “?”  +参数;  
  36.     System.out.println(“getDerectionsURL --->:”  + url);  
  37.     返回 网址;  
  38. }  
该方法传递了起点,终点的经纬度,然后组合成了网页请求时用到的URL

1.2.2downloadUrl

【本文是以JSON格式作为结果结果,如果想要以XML形式为结果结果,请步:
http://blog.csdn.net/mad1989/article/details/10008009

源码:
[java]  查看纯 文本 
  1. / **从url下载json数据的方法* /  
  2. private  String downloadUrl(String strUrl)  throws  IOException {  
  3.     String data =  “” ;  
  4.     InputStream iStream =  null ;  
  5.     HttpURLConnection urlConnection =  null ;  
  6.     尝试 {  
  7.         URL url =  新的 URL(strUrl);  
  8.   
  9.         //创建一个http连接与url进行通信  
  10.         urlConnection =(HttpURLConnection)url.openConnection();  
  11.   
  12.         //连接到网址  
  13.         urlConnection.connect();  
  14.   
  15.         //从网址读取数据  
  16.         iStream = urlConnection.getInputStream();  
  17.   
  18.         BufferedReader br =  new  BufferedReader(new  InputStreamReader(  
  19.                 的IStream));  
  20.   
  21.         StringBuffer sb =  new  StringBuffer();  
  22.   
  23.         String line =  “” ;  
  24.         while  ((line = br.readLine())!=  null ){  
  25.             sb.append(线);  
  26.         }  
  27.   
  28.         data = sb.toString();  
  29.   
  30.         br.close();  
  31.   
  32.     }  捕获 (例外五){  
  33.         Log.d(“下载网址时出现异常” ,e.toString());  
  34.     }  最后 {  
  35.         iStream.close();  
  36.         urlConnection.disconnect();  
  37.     }  
  38.     System.out.println(“url:”  + strUrl +  “----> downloadurl:”  + data);  
  39.     返回 数据;  
  40. }  

该方法通过携带经纬度的URL请求得到JSON数据

1.2.3downloadTask

[java]  查看纯 文本 
  1. //从传递的url获取数据  
  2. 私人 DownloadTask  扩展 AsyncTask {   
  3.   
  4.     //在非ui线程中下载数据  
  5.     @覆盖  
  6.     protected  String doInBackground(String ... url){  
  7.   
  8.         //用于存储来自Web服务的数据  
  9.         String data =  “” ;  
  10.   
  11.         尝试 {  
  12.             //从Web服务获取数据  
  13.             data = downloadUrl(url [ ]);  
  14.         }  捕获 (例外五){  
  15.             Log.d(“后台任务” ,e.toString());  
  16.         }  
  17.         返回 数据;  
  18.     }  
  19.   
  20.     //执行后在UI线程中执行  
  21.     // doInBackground()  
  22.     @覆盖  
  23.     保护无效 onPostExecute(字符串结果){   
  24.         super .onPostExecute(result);  
  25.   
  26.         ParserTask parserTask =  new  ParserTask();  
  27.   
  28.         //调用解析JSON数据的线程  
  29.         parserTask.execute(结果);  
  30.     }  
  31. }  

使用异步操作AsynTask实现downurl json数据

1.2.4ParserTask

[java]  查看纯 文本 
  1. / **以JSON格式解析Google地方信息的类* /  
  2. 私有 ParserTask  扩展   
  3.         AsyncTask >>> {  
  4.   
  5.     //解析非ui线程中的数据  
  6.     @覆盖  
  7.     protected  List >> doInBackground(  
  8.             字符串... jsonData){  
  9.   
  10.         JSONObject jObject;  
  11.         List >> routes =  null ;  
  12.   
  13.         尝试 {  
  14.             jObject =  new  JSONObject(jsonData [ ]);  
  15.             DirectionsJSONParser parser =  new  DirectionsJSONParser();  
  16.   
  17.             //开始解析数据  
  18.             routes = parser.parse(jObject);  
  19.             System.out.println(“do in background:”  + routes);  
  20.         }  捕获 (例外五){  
  21.             e.printStackTrace();  
  22.         }  
  23.         返回 路线;  
  24.     }  
  25.   
  26.     //在解析过程之后,在UI线程中执行  
  27.     @覆盖  
  28.     protected void  onPostExecute(List >> result){   
  29.         ArrayList points =  null ;  
  30.         PolylineOptions lineOptions =  null ;  
  31.         MarkerOptions markerOptions =  new  MarkerOptions();  
  32.   
  33.         //遍历所有路线  
  34.         for  (int  i =  ; i
  35.             points =  new  ArrayList ();  
  36.             lineOptions =  new  PolylineOptions();  
  37.   
  38.             //获取第i条路线  
  39.             List > path = result.get(i);  
  40.   
  41.             //获取第i个路径中的所有点  
  42.             for  (int  j =  ; j
  43.                 HashMap point = path.get(j);  
  44.   
  45.                 double  lat = Double.parseDouble(point.get(“lat” ));  
  46.                 double  lng = Double.parseDouble(point.get(“lng” ));  
  47.                 LatLng position =  new  LatLng(lat,lng);  
  48.   
  49.                 points.add(位置);  
  50.             }  
  51.   
  52.             //将路线中的所有点添加到LineOptions  
  53.             lineOptions.addAll(分);  
  54.             lineOptions.width();  
  55.   
  56.             //根据模式更改彩色多段线  
  57.             lineOptions.color(Color.BLUE);  
  58.         }  
  59.   
  60.         //在Google Map中为第i条路线绘制折线  
  61.         mGoogleMap.addPolyline(lineOptions);  
  62.     }  
  63. }  
异步操作,转换得到的Google Place json数据,然后显示在谷歌地图上。

1.2.5 DirectionsJSONParser

[java]  查看纯 文本 
  1. 公共 DirectionsJSONParser {   
  2.     / ** 
  3.      *接收一个JSONObject,并返回一个列表,包含纬度和 
  4.      *经度 
  5.      * /  
  6.     public  List >> parse(JSONObject jObject){  
  7.   
  8.         List >> routes =  new  ArrayList >>();  
  9.         JSONArray jRoutes =  null ;  
  10.         JSONArray jLegs =  null ;  
  11.         JSONArray jSteps =  null ;  
  12.   
  13.         尝试 {  
  14.   
  15.             jRoutes = jObject.getJSONArray(“routes” );  
  16.   
  17.             / **遍历所有路由* /  
  18.             for  (int  i =  ; i
  19.                 jLegs =((JSONObject)jRoutes.get(i))。getJSONArray(“legs” );  
  20.                 List path =  new  ArrayList >();  
  21.   
  22.                 / **遍历所有腿* /  
  23.                 for  (int  j =  ; j
  24.                     jSteps =((JSONObject)jLegs.get(j))。getJSONArray(“steps” );  
  25.   
  26.                     / **遍历所有步骤* /  
  27.                     for  (int  k =  ; k
  28.                         String polyline =  “” ;  
  29.                         polyline =(String)((JSONObject)((JSONObject)jSteps  
  30.                                 .get(k))。get(“polyline” ))。get(“points” );  
  31.                         List list = decodePoly(polyline);  
  32.   
  33.                         / **遍历所有点* /  
  34.                         for  (int  l =  ; l
  35.                             HashMap hm =  new  HashMap ();  
  36.                             hm.put(“lat” ,  
  37.                                     Double.toString(((LatLng)list.get(l))。latitude));  
  38.                             hm.put(“lng” ,  
  39.                                     Double.toString(((LatLng)list.get(l))。longitude));  
  40.                             path.add(HM);  
  41.                         }  
  42.                     }  
  43.                     routes.add(路径);  
  44.                 }  
  45.             }  
  46.         }  捕获 (JSONException E){  
  47.             e.printStackTrace();  
  48.         }  捕获 (例外五){  
  49.         }  
  50.         返回 路线;  
  51.     }  
  52.   
  53.     / ** 
  54.      *解码折线点的方法Courtesy: 
  55.      * jeffreysambells.com/2010/05/27 
  56.      * /解码多义线从谷歌地图方向api与java 
  57.      * * /  
  58.     private  List decodePoly(String encoded){  
  59.   
  60.         List poly =  new  ArrayList ();  
  61.         int  index =  ,len = encoded.length();  
  62.         int  lat =  ,lng =  ;  
  63.   
  64.         while  (index
  65.             int  b,shift =  ,result =  ;  
  66.              {  
  67.                 b = encoded.charAt(index ++) -  63 ;  
  68.                 结果| =(b&  0x1f )<< shift;  
  69.                 shift + =  ;  
  70.             }   (B> =  0×20 );  
  71.             int  dlat =((result&  )!=   ?〜(result >>  ):(result >>  ));  
  72.             lat + = dlat;  
  73.   
  74.             shift =  ;  
  75.             结果=  ;  
  76.              {  
  77.                 b = encoded.charAt(index ++) -  63 ;  
  78.                 结果| =(b&  0x1f )<< shift;  
  79.                 shift + =  ;  
  80.             }   (B> =  0×20 );  
  81.             int  dlng =((result&  )!=   ?〜(result >>  ):(result >>  ));  
  82.             lng + = dlng;  
  83.   
  84.             LatLng p =  new  LatLng((((double )lat / 1E5)),  
  85.                     (((double )lng / 1E5)));  
  86.             poly.add(P);  
  87.         }  
  88.         返回 聚;  
  89.     }  
  90. }  

效果图

的红色线为驾车线路

的蓝色线为步行线路




1.3 URL解析

导航的路径信息可以通过的Http获取也可以通过的Https获取;两者的URL是相同的,不同的是HTTPS比HTTP安全而已。


下面是获取的UIL的格式:HTTP://maps.googleapis.com/maps ?/ API /方向/ [JSON | XML] [PARAMS]; 


有两种输出格式分别是JSON和XML;

PARAMS如下:
原点(必要)您要计算导航路径的起始位置,可以是地址或经纬度。

(必要)您要计算导航路径的终止位置,可以是地址或经纬度。

模式(选用,默认值:驾驶)指定计算导航时使用的交通模式。

驾驶表示使用标准行车导航。

步行要求使用人行道及行人步行导航。

骑自行车要求使用自行车导航。(只适用于美国)

(选用)指定导航路径要经过的地点。地点可以指定为经纬度坐标或可进行地理编码的地址。

(选用)true时,表示请求导航的回应中提供一个以上的路线。这个可能延长服务器的请求耗时。

避免(选用)表示导航路径要避开的地点。这个参数可以是下面的2个数值

通行费表示路径避开收费站。

高速公路表示路径避开高速公路。

(选用)指定显示的单位。

公制使用标准单位,公里和公尺。

英国使用英式单位,英里和英尺。

区域(选用)将区域代码指定为ccTLD([顶层网域])的两位字元值。

语言(选用)路径传回时使用的语言。如果系统不支持设置的语言,那么系统会使用浏览器设置的语言进行返回。
zh-CN简体汉语
en-US英语

sensor(必要)指出导航的请求设备是否附有位置感应器。这个值必须是true或false。

以下是Google Directions API提供的2个URL的示例供参考:

http ://maps.googleapis.com/maps/api/directions/json?origin=Boston,MA&destination=Concord,MA&waypoints=Charlestown,MA|Lexington,MA&sensor = false 
http://maps.googleapis.com/maps/api/directions/json?origin=Adelaide,SA&destination=Adelaide,SA&waypoints=optimize:true|Barossa+Valley,SA|Clare,SA|Connawarra,SA|McLaren+谷,SA&传感器=假
 
以上的例子是根据地点名称来获取导航路径的方式,下面说明如何使用经纬度的方式来获取导航路径

示例:HTTP://maps.googleapis.com/maps/api/directions/json原点= 37.458060333333336% 2c118.49971400000001&目的地= 37.458260333333336%2c118.50971400000001&传感器=假

1.4携带航点的轨迹对比图

如果我们的导航路线希望通过地图中的某几个地方,则在url中添加一个parmas名称为waypoints,waypoints只能携带8个。该属性我已经在上边的java代码中添加,可以自己查看。
https://maps.googleapis.com/maps/api/directions/json?origin=39.99709957757345,116.31184045225382&destination=39.949158391497214,116.4154639095068&sensor=false&mode=driving&waypoints=40.036675,116.32885

效果图:


1.5综述

目前来看,循环添加2(或多个)个点的方法,可以减小误差的情况,不过得设置定时器,当上一此循环返回结果后再进行下一次循环(异步回调),这样轨迹查询可能就会耗时一些。谷歌地图在国内的环境下,路径规划请求的URL有些慢,偶尔超时还得不到结果。

你可能感兴趣的:(Android,地图)