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程序设计有所帮助。