在google地图上画出两个地点的行走路线
Google Direction API提供了更丰富的路线信息数据。由于访问量过大吧,谷歌现在不提供了查询路线的接口API,现在要想获得一个路线我们可以通过URL访问google然后解析得到的KML文件,得到路线的每个点的经纬度,然互在一个图层上画出这些点。代码来自于对一些网上资源的整理,一共提供了连个方法,一个通过两个地方的名字,一个是通过两个地点的经纬度,但是有时候会出现错误的别是对中国的城市,还有就是别用中文,要不会很惨,希望有人给出一个更好的方法
![](http://static.oschina.net/uploads/code/201202/22132229_kOju.jpg)
[图片] 未命名1.jpg
![](http://static.oschina.net/uploads/code/201202/22132229_Cz51.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 > |
一起学习GIS及其二次开发,一起进步!