欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

Android 在map上画出路线,androidmap路线

来源: 开发者 投稿于  被查看 4501 次 评论:62

Android 在map上画出路线,androidmap路线


最近在搞在地图上画出路线图,经过一段时间的摸索,终于搞明白了,其实也挺简单的,写个类继承Overlay,并重写draw方法,在draw方法中画出 path即可。对于Overaly,在地图上标记某个点或者画线之类的就要使用overlay,overlay相当于一个覆盖物,覆盖在地图上,这个覆盖物要自己实现所以要继承Overlay。

1.[文件] MapActivity.java~3KB 下载(629)

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);// 画出路径   
    }   
}   
}  

2.main.xml

<?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>  

3.[其他]代码

最后别忘了加权限 :

<uses-permission Android:name="android.permission.INTERNET"/>

在<applacation></applacation>之间加<uses-library Android:name="com.google.android.maps" />

4.绘制路线图

    /**  
	 * 通过解析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;   
	}  

用户评论