在google地图上画出两个地点的行走路线

Google Direction API提供了更丰富的路线信息数据。由于访问量过大吧,谷歌现在不提供了查询路线的接口API,现在要想获得一个路线我们可以通过URL访问google然后解析得到的KML文件,得到路线的每个点的经纬度,然互在一个图层上画出这些点。代码来自于对一些网上资源的整理,一共提供了连个方法,一个通过两个地方的名字,一个是通过两个地点的经纬度,但是有时候会出现错误的别是对中国的城市,还有就是别用中文,要不会很惨,希望有人给出一个更好的方法

[图片] 未命名1.jpg

[代码] 新建一个图层

01 package com.android.antkingwei.google.direction;
02
03 import android.graphics.Canvas;
04 import android.graphics.Color;
05 import android.graphics.Paint;
06 import android.graphics.Point;
07
08 import com.google.android.maps.GeoPoint;
09 import com.google.android.maps.MapView;
10 import com.google.android.maps.Overlay;
11 import com.google.android.maps.Projection;
12
13 public class DirectionPathOverlay extends Overlay {
14 private GeoPoint gp1;
15 private GeoPoint gp2;
16
17 public DirectionPathOverlay(GeoPoint gp1, GeoPoint gp2) {
18 this.gp1 = gp1;
19 this.gp2 = gp2;
20 }
21
22 @Override
23 public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {
24 Projection projection = mapView.getProjection();
25 if(shadow == false) {
26 Paint paint = new Paint();
27 paint.setAntiAlias(true);
28 Point point = new Point();
29 projection.toPixels(gp1, point);
30 paint.setColor(Color.BLUE);
31 Point point2 = new Point();
32 projection.toPixels(gp2, point2);
33 paint.setStrokeWidth(2);
34 canvas.drawLine((float) point.x, (float) point.y, (float) point2.x, (float) point2.y, paint);
35 }
36 return super.draw(canvas, mapView, shadow, when);
37 }
38
39 @Override
40 public void draw(Canvas canvas, MapView mapView, boolean shadow) {
41 super.draw(canvas, mapView, shadow);
42 }
43 }

[代码] 主类

001 package com.android.antkingwei.google.direction;
002
003 import java.net.HttpURLConnection;
004 import java.net.URL;
005
006 import javax.xml.parsers.DocumentBuilder;
007 import javax.xml.parsers.DocumentBuilderFactory;
008
009 import org.w3c.dom.Document;
010 import org.w3c.dom.Node;
011 import org.w3c.dom.NodeList;
012
013 import com.google.android.maps.GeoPoint;
014 import com.google.android.maps.MapActivity;
015 import com.google.android.maps.MapController;
016 import com.google.android.maps.MapView;
017
018 import android.app.Activity;
019 import android.os.Bundle;
020 import android.util.Log;
021
022 public class MainActivity extends MapActivity {
023 private MapView myMapView;
024 private GeoPoint geoPoint;
025 private MapController myMC;
026 private String[] pairs;
027 /** Called when the activity is first created. */
028 @Override
029 public void onCreate(Bundle savedInstanceState) {
030 super.onCreate(savedInstanceState);
031 setContentView(R.layout.main);
032
033 myMapView = (MapView) findViewById(R.id.mapview);
034 geoPoint = null;
035 myMapView.setSatellite(false);
036 //通过地名
037 //pairs = getDirectionData("ahmedabad", "vadodara");
038 //通过四个坐标
039 pairs = getUrl(22.5348,113.97246,35.422006,119.524095);
040 String[] lngLat = pairs[0].split(",");
041 // STARTING POINT
042 GeoPoint startGP = new GeoPoint((int)(Double.parseDouble(lngLat[1]) * 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6));
043 myMC = myMapView.getController();
044 geoPoint = startGP;
045 myMC.setCenter(geoPoint);
046 myMC.setZoom(8);
047 myMapView.getOverlays().add(new DirectionPathOverlay(startGP, startGP));
048 // NAVIGATE THE PATH
049 GeoPoint gp1;
050 GeoPoint gp2 = startGP;
051 for (int i = 1; i < pairs.length; i++) {
052 lngLat = pairs[i].split(",");
053 gp1 = gp2;
054 // watch out! For GeoPoint, first:latitude, second:longitude
055 gp2 = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6),(int) (Double.parseDouble(lngLat[0]) * 1E6));
056 myMapView.getOverlays().add(new DirectionPathOverlay(gp1, gp2));
057 Log.d("xxx", "pair:" + pairs[i]);
058 }
059 // END POINT
060 myMapView.getOverlays().add(new DirectionPathOverlay(gp2, gp2));
061 myMapView.getController().animateTo(startGP);
062 myMapView.setBuiltInZoomControls(true);
063 myMapView.displayZoomControls(true);
064
065 }
066 @Override
067 protected boolean isRouteDisplayed() {
068 // TODO Auto-generated method stub
069 return false;
070 }
071 /**
072 * 通过四个坐标点,获得KML然后通过DOM解析
073 * @param fromLat
074 * @param fromLon
075 * @param toLat
076 * @param toLon
077 * @return
078 */
079 public String[] getUrl(double fromLat,double fromLon,double toLat,double toLon){
080 String urlString = "http://maps.google.com/maps?f=d&hl=en&saddr="+fromLat+","+fromLon+"&daddr="+toLat+","+toLon+"&ie=UTF8&0&om=0&output=kml";
081 Log.d("URL", urlString);
082 Document doc = null;
083 HttpURLConnection urlConnection = null;
084 URL url = null;
085 String pathConent = "";
086
087 try{
088 url = new URL(urlString.toString());
089 urlConnection = (HttpURLConnection) url.openConnection();
090 urlConnection.setRequestMethod("GET");
091 urlConnection.setDoOutput(true);
092 urlConnection.setDoInput(true);
093 urlConnection.connect();
094 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
095 DocumentBuilder db = dbf.newDocumentBuilder();
096 doc = db.parse(urlConnection.getInputStream());
097 } catch (Exception e){}
098 NodeList nl = doc.getElementsByTagName("LineString");
099 for(int s=0; s< nl.getLength(); s++){
100 Node rootNode = nl.item(s);
101 NodeList configItems = rootNode.getChildNodes();
102 for(int x=0; x < configItems.getLength(); x++) {
103 Node lineStringNode = configItems.item(x);
104 NodeList path = lineStringNode.getChildNodes();
105 pathConent = path.item(0).getNodeValue();
106 }
107 }
108 String[] tempContent = pathConent.split(" ");
109 return tempContent;
110 }
111 /**
112 * 通过连个地名获得KML然后进行DOM解析
113 * @param srcPlace
114 * @param destPlace
115 * @return
116 */
117 private String[] getDirectionData(String srcPlace, String destPlace) {
118 String urlString = "http://maps.google.com/maps?f=d&hl=en&saddr="+srcPlace+"&daddr="+destPlace+"&ie=UTF&om=0&output=kml";
119 Log.d("URL", urlString);
120 Document doc = null;
121 HttpURLConnection urlConnection = null;
122 URL url = null;
123 String pathConent = "";
124 try{
125 url = new URL(urlString.toString());
126 urlConnection = (HttpURLConnection) url.openConnection();
127 urlConnection.setRequestMethod("GET");
128 urlConnection.setDoOutput(true);
129 urlConnection.setDoInput(true);
130 urlConnection.connect();
131 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
132 DocumentBuilder db = dbf.newDocumentBuilder();
133 doc = db.parse(urlConnection.getInputStream());
134 } catch (Exception e){}
135 NodeList nl = doc.getElementsByTagName("LineString");
136 for(int s=0; s< nl.getLength(); s++){
137 Node rootNode = nl.item(s);
138 NodeList configItems = rootNode.getChildNodes();
139 for(int x=0; x < configItems.getLength(); x++) {
140 Node lineStringNode = configItems.item(x);
141 NodeList path = lineStringNode.getChildNodes();
142 pathConent = path.item(0).getNodeValue();
143 }
144 }
145 String[] tempContent = pathConent.split(" ");
146 return tempContent;
147 }
148 }

[代码] main.xml

01 <?xml version="1.0" encoding="utf-8"?>
02 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
03 android:orientation="vertical"
04 android:layout_width="fill_parent"
05 android:layout_height="fill_parent"
06 >
07 <TextView
08 android:layout_width="fill_parent"
09 android:layout_height="wrap_content"
10 android:text="@string/hello"
11 />
12 <com.google.android.maps.MapView
13 xmlns:android="http://schemas.android.com/apk/res/android"
14 android:id="@+id/mapview"
15 android:layout_width="fill_parent"
16 android:layout_height="fill_parent"
17 android:enabled="true"
18 android:clickable="true"
19 android:apiKey="0FZLYf-YM4SRrJrJum55MeeaO4Gd_IitVFmtUeA"/>
20 </LinearLayout>

[代码] AndroidManifest.xml

01 <?xml version="1.0" encoding="utf-8"?>
02 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
03 package="com.android.antkingwei.google.direction"
04 android:versionCode="1"
05 android:versionName="1.0">
06 <uses-sdk android:minSdkVersion="7" />
07
08 <application android:icon="@drawable/icon" android:label="@string/app_name">
09 <activity android:name=".MainActivity"
10 android:label="@string/app_name">
11 <intent-filter>
12 <action android:name="android.intent.action.MAIN" />
13 <category android:name="android.intent.category.LAUNCHER" />
14 </intent-filter>
15
16 </activity>
17 <uses-library android:name="com.google.android.maps" />
18 </application>
19 <uses-permission android:name="android.permission.INTERNET"></uses-permission>
20 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
21 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
22 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
23 </manifest>
原文地址:https://www.cnblogs.com/tuncaysanli/p/2469020.html