本文适合【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
代码:
-
/
**
-
*通过起点终点,组合成网址
-
*
-
*
@参数来源
-
*
@param dest
-
*
@返回
-
*
/
-
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” ;
-
-
//waypoints,116.32885,40.036675
-
String waypointLatLng = “waypoints
=” + “40.036675” + “,” + “116.32885” ;
-
-
//将参数构建到Web服务
-
字符串参数= 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形式为结果结果,请步:
源码:
-
/
**从url下载json数据的方法* /
-
private String
downloadUrl(String strUrl) throws IOException
{
-
String data = “” ;
-
InputStream iStream = null ;
-
HttpURLConnection urlConnection = null ;
-
尝试 {
-
URL url = 新的 URL(strUrl);
-
-
//创建一个http连接与url进行通信
-
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
-
//从传递的url获取数据
-
私人类 DownloadTask 扩展 AsyncTask
<String,Void,String> {
-
-
//在非ui线程中下载数据
-
@覆盖
-
protected String
doInBackground(String ... url){
-
-
//用于存储来自Web服务的数据
-
String data = “” ;
-
-
尝试 {
-
//从Web服务获取数据
-
data = downloadUrl(url [ 0 ]);
-
} 捕获 (例外五){
-
Log.d(“后台任务” ,e.toString());
-
}
-
返回 数据;
-
}
-
-
//执行后在UI线程中执行
-
//
doInBackground()
-
@覆盖
-
保护无效 onPostExecute(字符串结果){
-
super .onPostExecute(result);
-
-
ParserTask parserTask = new ParserTask();
-
-
//调用解析JSON数据的线程
-
parserTask.execute(结果);
-
}
-
}
使用异步操作AsynTask实现downurl json数据
1.2.4ParserTask
-
/
**以JSON格式解析Google地方信息的类* /
-
私有类 ParserTask 扩展
-
AsyncTask <String,Integer,List <List <HashMap <String,String >>>> {
-
-
//解析非ui线程中的数据
-
@覆盖
-
protected List
<List <HashMap <String,String >>> doInBackground(
-
字符串... jsonData){
-
-
JSONObject jObject;
-
List <List <HashMap <String,String >>> routes = null ;
-
-
尝试 {
-
jObject = new JSONObject(jsonData
[ 0 ]);
-
DirectionsJSONParser parser = new DirectionsJSONParser();
-
-
//开始解析数据
-
routes = parser.parse(jObject);
-
System.out.println(“do
in background:” + routes);
-
} 捕获 (例外五){
-
e.printStackTrace();
-
}
-
返回 路线;
-
}
-
-
//在解析过程之后,在UI线程中执行
-
@覆盖
-
protected void onPostExecute(List
<List <HashMap <String,String >>> result){
-
ArrayList <LatLng> points = null ;
-
PolylineOptions lineOptions = null ;
-
MarkerOptions markerOptions = new MarkerOptions();
-
-
//遍历所有路线
-
for (int i
= 0 ;
i <result.size(); i ++){
-
points = new ArrayList
<LatLng>();
-
lineOptions = new PolylineOptions();
-
-
//获取第i条路线
-
List <HashMap <String,String >> path = result.get(i);
-
-
//获取第i个路径中的所有点
-
for (int j
= 0 ;
j <path.size(); j ++){
-
HashMap <String,String> 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
-
lineOptions.addAll(分);
-
lineOptions.width(3 );
-
-
//根据模式更改彩色多段线
-
lineOptions.color(Color.BLUE);
-
}
-
-
//在Google
Map中为第i条路线绘制折线
-
mGoogleMap.addPolyline(lineOptions);
-
}
-
}
异步操作,转换得到的Google Place json数据,然后显示在谷歌地图上。
1.2.5 DirectionsJSONParser
-
公共类 DirectionsJSONParser
{
-
/
**
-
*接收一个JSONObject,并返回一个列表,包含纬度和
-
*经度
-
*
/
-
public List
<List <HashMap <String,String >>> parse(JSONObject jObject){
-
-
List <List <HashMap <String,String >>> routes = new ArrayList
<List <HashMap <String,String >>>();
-
JSONArray jRoutes = null ;
-
JSONArray jLegs = null ;
-
JSONArray jSteps = null ;
-
-
尝试 {
-
-
jRoutes = jObject.getJSONArray(“routes” );
-
-
/
**遍历所有路由* /
-
for (int i
= 0 ;
i <jRoutes.length(); i ++){
-
jLegs =((JSONObject)jRoutes.get(i))。getJSONArray(“legs” );
-
List path = new ArrayList
<HashMap <String,String >>();
-
-
/
**遍历所有腿* /
-
for (int j
= 0 ;
j <jLegs.length(); j ++){
-
jSteps =((JSONObject)jLegs.get(j))。getJSONArray(“steps” );
-
-
/
**遍历所有步骤* /
-
for (int k
= 0 ;
k <jSteps.length(); k ++){
-
String polyline = “” ;
-
polyline =(String)((JSONObject)((JSONObject)jSteps
-
.get(k))。get(“polyline” ))。get(“points” );
-
List <LatLng> list = decodePoly(polyline);
-
-
/
**遍历所有点* /
-
for (int l
= 0 ;
l <list.size(); l ++){
-
HashMap <String,String> hm = new HashMap
<String,String>();
-
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();
-
} 捕获 (例外五){
-
}
-
返回 路线;
-
}
-
-
/
**
-
*解码折线点的方法Courtesy:
-
*
jeffreysambells.com/2010/05/27
-
*
/解码多义线从谷歌地图方向api与java
-
*
* /
-
private List
<LatLng> decodePoly(String encoded){
-
-
List <LatLng> poly = new ArrayList
<LatLng>();
-
int index
= 0 ,len
= encoded.length();
-
int lat
= 0 ,lng
= 0 ;
-
-
while (index
<len){
-
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有些慢,偶尔超时还得不到结果。