本文适合【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
代码:
-
-
-
-
-
-
-
- private String getDirectionsUrl(LatLng origin,LatLng dest){
-
-
- String str_origin = “origin =” + origin.latitude + “,”
- + origin.longitude;
-
-
- String str_dest = “destination =” + dest.latitude + “,” + dest.longitude;
-
-
- String sensor = “sensor = false” ;
-
-
- String mode = “mode = driving” ;
-
-
- String waypointLatLng = “waypoints =” + “40.036675” + “,” + “116.32885” ;
-
-
- 字符串参数= str_origin + “&” + str_dest + “&” + sensor + “&”
- + mode + “&” + waypointLatLng;
-
-
- String output = “json” ;
-
-
- String url = “https://maps.googleapis.com/maps/api/directions/”
- +输出+ “?” +参数;
- System.out.println(“getDerectionsURL --->:” + url);
- 返回 网址;
- }
该方法传递了起点,终点的经纬度,然后组合成了网页请求时用到的URL
1.2.2downloadUrl
【本文是以JSON格式作为结果结果,如果想要以XML形式为结果结果,请步:
http://blog.csdn.net/mad1989/article/details/10008009】
源码:
-
- private String downloadUrl(String strUrl) throws IOException {
- String data = “” ;
- InputStream iStream = null ;
- HttpURLConnection urlConnection = null ;
- 尝试 {
- URL url = 新的 URL(strUrl);
-
-
- urlConnection =(HttpURLConnection)url.openConnection();
-
-
- urlConnection.connect();
-
-
- iStream = urlConnection.getInputStream();
-
- BufferedReader br = new BufferedReader(new InputStreamReader(
- 的IStream));
-
- StringBuffer sb = new StringBuffer();
-
- String line = “” ;
- while ((line = br.readLine())!= null ){
- sb.append(线);
- }
-
- data = sb.toString();
-
- br.close();
-
- } 捕获 (例外五){
- Log.d(“下载网址时出现异常” ,e.toString());
- } 最后 {
- iStream.close();
- urlConnection.disconnect();
- }
- System.out.println(“url:” + strUrl + “----> downloadurl:” + data);
- 返回 数据;
- }
该方法通过携带经纬度的URL请求得到JSON数据
1.2.3downloadTask
-
- 私人类 DownloadTask 扩展 AsyncTask {
-
-
- @覆盖
- protected String doInBackground(String ... url){
-
-
- String data = “” ;
-
- 尝试 {
-
- data = downloadUrl(url [ 0 ]);
- } 捕获 (例外五){
- Log.d(“后台任务” ,e.toString());
- }
- 返回 数据;
- }
-
-
-
- @覆盖
- 保护无效 onPostExecute(字符串结果){
- super .onPostExecute(result);
-
- ParserTask parserTask = new ParserTask();
-
-
- parserTask.execute(结果);
- }
- }
使用异步操作AsynTask实现downurl json数据
1.2.4ParserTask
-
- 私有类 ParserTask 扩展
- AsyncTask >>> {
-
-
- @覆盖
- protected List
>> doInBackground(
- 字符串... jsonData){
-
- JSONObject jObject;
- List
>> routes =
null ;
-
- 尝试 {
- jObject = new JSONObject(jsonData [ 0 ]);
- DirectionsJSONParser parser = new DirectionsJSONParser();
-
-
- routes = parser.parse(jObject);
- System.out.println(“do in background:” + routes);
- } 捕获 (例外五){
- e.printStackTrace();
- }
- 返回 路线;
- }
-
-
- @覆盖
- protected void onPostExecute(List
>> result){
- ArrayList points = null ;
- PolylineOptions lineOptions = null ;
- MarkerOptions markerOptions = new MarkerOptions();
-
-
- for (int i = 0 ; i
- points = new ArrayList ();
- lineOptions = new PolylineOptions();
-
-
- List > path = result.get(i);
-
-
- for (int j = 0 ; j
- HashMap point = path.get(j);
-
- double lat = Double.parseDouble(point.get(“lat” ));
- double lng = Double.parseDouble(point.get(“lng” ));
- LatLng position = new LatLng(lat,lng);
-
- points.add(位置);
- }
-
-
- lineOptions.addAll(分);
- lineOptions.width(3 );
-
-
- lineOptions.color(Color.BLUE);
- }
-
-
- mGoogleMap.addPolyline(lineOptions);
- }
- }
异步操作,转换得到的Google Place json数据,然后显示在谷歌地图上。
1.2.5 DirectionsJSONParser
- 公共类 DirectionsJSONParser {
-
-
-
-
- public List
>> parse(JSONObject jObject){
-
- List
>> routes =
new ArrayList >>();
- JSONArray jRoutes = null ;
- JSONArray jLegs = null ;
- JSONArray jSteps = null ;
-
- 尝试 {
-
- jRoutes = jObject.getJSONArray(“routes” );
-
-
- for (int i = 0 ; i
- jLegs =((JSONObject)jRoutes.get(i))。getJSONArray(“legs” );
- List path = new ArrayList >();
-
-
- for (int j = 0 ; j
- jSteps =((JSONObject)jLegs.get(j))。getJSONArray(“steps” );
-
-
- for (int k = 0 ; k
- String polyline = “” ;
- polyline =(String)((JSONObject)((JSONObject)jSteps
- .get(k))。get(“polyline” ))。get(“points” );
- List list = decodePoly(polyline);
-
-
- for (int l = 0 ; l
- HashMap hm = new HashMap ();
- hm.put(“lat” ,
- Double.toString(((LatLng)list.get(l))。latitude));
- hm.put(“lng” ,
- Double.toString(((LatLng)list.get(l))。longitude));
- path.add(HM);
- }
- }
- routes.add(路径);
- }
- }
- } 捕获 (JSONException E){
- e.printStackTrace();
- } 捕获 (例外五){
- }
- 返回 路线;
- }
-
-
-
-
-
-
- private List decodePoly(String encoded){
-
- List poly = new ArrayList ();
- int index = 0 ,len = encoded.length();
- int lat = 0 ,lng = 0 ;
-
- while (index
- int b,shift = 0 ,result = 0 ;
- 做 {
- b = encoded.charAt(index ++) - 63 ;
- 结果| =(b& 0x1f )<< shift;
- shift + = 5 ;
- } 而 (B> = 0×20 );
- int dlat =((result& 1 )!= 0 ?〜(result >> 1 ):(result >> 1 ));
- lat + = dlat;
-
- shift = 0 ;
- 结果= 0 ;
- 做 {
- b = encoded.charAt(index ++) - 63 ;
- 结果| =(b& 0x1f )<< shift;
- shift + = 5 ;
- } 而 (B> = 0×20 );
- int dlng =((result& 1 )!= 0 ?〜(result >> 1 ):(result >> 1 ));
- lng + = dlng;
-
- LatLng p = new LatLng((((double )lat / 1E5)),
- (((double )lng / 1E5)));
- poly.add(P);
- }
- 返回 聚;
- }
- }
效果图
的红色线为驾车线路
的蓝色线为步行线路
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有些慢,偶尔超时还得不到结果。