Android实现在map上画出路线的方法
本文实例讲述了Android实现在map上画出路线的方法。分享给大家供大家参考。具体如下:
最近在搞在地图上画出路线图,经过一段时间的摸索,终于搞明白了,其实也挺简单的,写个类继承Overlay,并重写draw方法,在draw方法中画出path即可。对于Overaly,在地图上标记某个点或者画线之类的就要使用overlay,overlay相当于一个覆盖物,覆盖在地图上,这个覆盖物要自己实现所以要继承Overlay。
MapActivity.java如下:
packagenet.blogjava.mobile.map;
importjava.util.List;
importAndroid.app.AlertDialog;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Paint;
importandroid.graphics.Path;
importandroid.graphics.Point;
importandroid.location.Address;
importandroid.location.Geocoder;
importandroid.os.Bundle;
importandroid.view.Menu;
importcom.google.android.maps.GeoPoint;
importcom.google.android.maps.MapActivity;
importcom.google.android.maps.MapController;
importcom.google.android.maps.MapView;
importcom.google.android.maps.Overlay;
importcom.google.android.maps.Projection;
publicclassMainextendsMapActivity{
privateGeoPointgpoint1,gpoint2,gpoint3;//连线的点
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MapViewmapView=(MapView)findViewById(R.id.mapview);
mapView.setClickable(true);
mapView.setBuiltInZoomControls(true);
MapControllermapController=mapView.getController();
mapView.setTraffic(true);//交通图
//mapView.setSatellite(true);//卫星图
//mapView.setStreetView(true);//街景
MyOverlaymyOverlay=newMyOverlay();
mapView.getOverlays().add(myOverlay);
mapController.setZoom(15);//初始放大倍数
gpoint1=newGeoPoint((int)(24.477384*1000000),
(int)(118.158216*1000000));
gpoint2=newGeoPoint((int)(24.488967*1000000),
(int)(118.144277*1000000));
gpoint3=newGeoPoint((int)(24.491091*1000000),
(int)(118.136781*1000000));
mapController.animateTo(gpoint1);
}
@Override
protectedbooleanisRouteDisplayed(){
//TODOAuto-generatedmethodstub
returnfalse;
}
classMyOverlayextendsOverlay{
@Override
publicvoiddraw(Canvascanvas,MapViewmapView,booleanshadow){
//TODOAuto-generatedmethodstub
super.draw(canvas,mapView,shadow);
//画笔
Paintpaint=newPaint();
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);
Projectionprojection=mapView.getProjection();
Pointp1=newPoint();
Pointp2=newPoint();
Pointp3=newPoint();
projection.toPixels(gpoint1,p1);
projection.toPixels(gpoint2,p2);
projection.toPixels(gpoint3,p3);
Pathpath=newPath();
path.moveTo(p1.x,p1.y);
path.lineTo(p2.x,p2.y);
path.lineTo(p3.x,p3.y);
canvas.drawPath(path,paint);//画出路径
}
}
}
main.xml如下:
<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns: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-permissionAndroid:name="android.permission.INTERNET"/>
在<applacation></applacation>之间加<uses-libraryAndroid:name="com.google.android.maps"/>
绘制路线图:
/**
*通过解析googlemap返回的xml,在map中画路线图
*/
publicvoiddrawRoute(){
Stringurl="http://maps.google.com/maps/api/directions/xml?origin=23.055291,113.391802"+"&destination=23.046604,113.397510&sensor=false&mode=walking";
HttpGetget=newHttpGet(url);
StringstrResult="";
try{
HttpParamshttpParameters=newBasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters,3000);
HttpClienthttpClient=newDefaultHttpClient(httpParameters);
HttpResponsehttpResponse=null;
httpResponse=httpClient.execute(get);
if(httpResponse.getStatusLine().getStatusCode()==200){
strResult=EntityUtils.toString(httpResponse.getEntity());
}
}catch(Exceptione){
return;
}
if(-1==strResult.indexOf("<status>OK</status>")){
Toast.makeText(this,"获取导航路线失败!",Toast.LENGTH_SHORT).show();
this.finish();
return;
}
intpos=strResult.indexOf("<overview_polyline>");
pos=strResult.indexOf("<points>",pos+1);
intpos2=strResult.indexOf("</points>",pos);
strResult=strResult.substring(pos+8,pos2);
List<GeoPoint>points=decodePoly(strResult);
MyOverLaymOverlay=newMyOverLay(points);
List<Overlay>overlays=mMapView.getOverlays();
overlays.add(mOverlay);
if(points.size()>=2){
mMapController.animateTo(points.get(0));
}
mMapView.invalidate();
}
/**
*解析返回xml中overview_polyline的路线编码
*
*@paramencoded
*@return
*/
privateList<GeoPoint>decodePoly(Stringencoded){
List<GeoPoint>poly=newArrayList<GeoPoint>();
intindex=0,len=encoded.length();
intlat=0,lng=0;
while(index<len){
intb,shift=0,result=0;
do{
b=encoded.charAt(index++)-63;
result|=(b&0x1f)<<shift;
shift+=5;
}while(b>=0x20);
intdlat=((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);
intdlng=((result&1)!=0?~(result>>1):(result>>1));
lng+=dlng;
GeoPointp=newGeoPoint((int)(((double)lat/1E5)*1E6),(int)(((double)lng/1E5)*1E6));
poly.add(p);
}
returnpoly;
}
希望本文所述对大家的Android程序设计有所帮助。