本文实例讲述了Android实现在map上画出路线的方法。分享给大家供大家参考。具体如下:
最近在搞在地图上画出路线图,经过一段时间的摸索,终于搞明白了,其实也挺简单的,写个类继承Overlay,并重写draw方法,在draw方法中画出 path即可。对于Overaly,在地图上标记某个点或者画线之类的就要使用overlay,overlay相当于一个覆盖物,覆盖在地图上,这个覆盖物要自己实现所以要继承Overlay。
MapActivity.java如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
package net.blogjava.mobile.map; import java.util.List; import Android.app.AlertDialog; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Point; import android.location.Address; import android.location.Geocoder; import android.os.Bundle; import android.view.Menu; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapActivity; import com.google.android.maps.MapController; import com.google.android.maps.MapView; import com.google.android.maps.Overlay; import com.google.android.maps.Projection; public class Main extends MapActivity { private GeoPoint gpoint1, gpoint2, gpoint3; // 连线的点 @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); MapView mapView = (MapView) findViewById(R.id.mapview); mapView.setClickable( true ); mapView.setBuiltInZoomControls( true ); MapController mapController = mapView.getController(); mapView.setTraffic( true ); // 交通图 // mapView.setSatellite(true);//卫星图 // mapView.setStreetView(true);//街景 MyOverlay myOverlay = new MyOverlay(); mapView.getOverlays().add(myOverlay); mapController.setZoom( 15 ); // 初始放大倍数 gpoint1 = new GeoPoint(( int ) ( 24.477384 * 1000000 ), ( int ) ( 118.158216 * 1000000 )); gpoint2 = new GeoPoint(( int ) ( 24.488967 * 1000000 ), ( int ) ( 118.144277 * 1000000 )); gpoint3 = new GeoPoint(( int ) ( 24.491091 * 1000000 ), ( int ) ( 118.136781 * 1000000 )); mapController.animateTo(gpoint1); } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false ; } class MyOverlay extends Overlay { @Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { // TODO Auto-generated method stub super .draw(canvas, mapView, shadow); // 画笔 Paint paint = new Paint(); paint.setColor(Color.RED); paint.setDither( true ); paint.setStyle(Paint.Style.STROKE); paint.setStrokeJoin(Paint.Join.ROUND); paint.setStrokeCap(Paint.Cap.ROUND); paint.setStrokeWidth( 2 ); Projection projection = mapView.getProjection(); Point p1 = new Point(); Point p2 = new Point(); Point p3 = new Point(); projection.toPixels(gpoint1, p1); projection.toPixels(gpoint2, p2); projection.toPixels(gpoint3, p3); Path path = new Path(); path.moveTo(p1.x, p1.y); path.lineTo(p2.x, p2.y); path.lineTo(p3.x, p3.y); canvas.drawPath(path, paint); // 画出路径 } } } |
main.xml如下:
1
2
3
4
5
6
7
8
9
|
<? xml version = "1.0" encoding = "utf-8" ?> < LinearLayout xmlns:Android = "http://schemas.android.com/apk/res/android" android:orientation = "vertical" android:layout_width = "fill_parent" android:layout_height = "fill_parent" > < com.google.android.maps.MapView android:id = "@+id/mapview" android:layout_width = "fill_parent" android:layout_height = "fill_parent" android:apiKey = "0IB7Kn70qp1LT216Hhb-jmHJ8GLTie4p63O77KQ" /> </ LinearLayout > |
最后别忘了加权限 :
<uses-permission Android:name="android.permission.INTERNET"/>
在<applacation></applacation>之间加<uses-library Android:name="com.google.android.maps" />
绘制路线图:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
/** * 通过解析google map返回的xml,在map中画路线图 */ public void drawRoute(){ String url = "http://maps.google.com/maps/api/directions/xml?origin=23.055291,113.391802" + "&destination=23.046604,113.397510&sensor=false&mode=walking" ; HttpGet get = new HttpGet(url); String strResult = "" ; try { HttpParams httpParameters = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(httpParameters, 3000 ); HttpClient httpClient = new DefaultHttpClient(httpParameters); HttpResponse httpResponse = null ; httpResponse = httpClient.execute(get); if (httpResponse.getStatusLine().getStatusCode() == 200 ){ strResult = EntityUtils.toString(httpResponse.getEntity()); } } catch (Exception e) { return ; } if (- 1 == strResult.indexOf( "<status>OK</status>" )){ Toast.makeText( this , "获取导航路线失败!" , Toast.LENGTH_SHORT).show(); this .finish(); return ; } int pos = strResult.indexOf( "<overview_polyline>" ); pos = strResult.indexOf( "<points>" , pos + 1 ); int pos2 = strResult.indexOf( "</points>" , pos); strResult = strResult.substring(pos + 8 , pos2); List<GeoPoint> points = decodePoly(strResult); MyOverLay mOverlay = new MyOverLay(points); List<Overlay> overlays = mMapView.getOverlays(); overlays.add(mOverlay); if (points.size() >= 2 ){ mMapController.animateTo(points.get( 0 )); } mMapView.invalidate(); } /** * 解析返回xml中overview_polyline的路线编码 * * @param encoded * @return */ private List<GeoPoint> decodePoly(String encoded) { List<GeoPoint> poly = new ArrayList<GeoPoint>(); int index = 0 , len = encoded.length(); int lat = 0 , lng = 0 ; while (index < len) { int b, shift = 0 , result = 0 ; do { b = encoded.charAt(index++) - 63 ; result |= (b & 0x1f ) << shift; shift += 5 ; } while (b >= 0x20 ); int dlat = ((result & 1 ) != 0 ? ~(result >> 1 ) : (result >> 1 )); lat += dlat; shift = 0 ; result = 0 ; do { b = encoded.charAt(index++) - 63 ; result |= (b & 0x1f ) << shift; shift += 5 ; } while (b >= 0x20 ); int dlng = ((result & 1 ) != 0 ? ~(result >> 1 ) : (result >> 1 )); lng += dlng; GeoPoint p = new GeoPoint(( int ) ((( double ) lat / 1E5) * 1E6),( int ) ((( double ) lng / 1E5) * 1E6)); poly.add(p); } return poly; } |
希望本文所述对大家的Android程序设计有所帮助。