最近在搞在地图上画出路线图,经过一段时间的摸索,终于搞明白了,其实也挺简单的,写个类继承 Overlay,
并重写draw方法,在draw方法中画出path即可。对于Overaly,在地图上标记某个点或者画线之类的就要使用 overlay,overlay相当于一个覆盖物,覆盖在地图上,这个覆盖物要自己实现所以要继承Overlay。本例自定义了要画的点,如何得到两地之 间的众多点的坐标(经纬度),可以参考Android在google
map上画出导航路线图
http://www.linuxidc.com/Linux/2011-05/36375p2.htm
具体代码:
-
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" />
Android在google map上画线比较容易实现的,但是现在问题在于如何获取起点和终点之间的路线图。这里我们使用Google Directions API来实现, Google Directions API是一种使用 HTTP 请求计算多个位置间路线的服务。路线可以以文本字符串或纬度/经度坐标的形式指定起点、目的地和路标。Google Directions API 可以使用一系列路标传回多段路线。
Google Directions API 请求是以下形式的 HTTP 网址:http://maps.google.com/maps/api/directions/output?parameters
其中,output 可能是以下任何一个值:
l json(建议)表示以 JavaScript 对象表示法 (JSON) 的形式输出
l xml 表示以 XML 的形式输出
具体参数参见http://code.google.com/intl/zh-CN/apis/maps/documentation/directions/
通过http请求获取线路,接下来我们需要对返回结果进行解析,提取出导航线路的一系列路标。
如果我们只是简单的画图路线路,返回结果中的字段overview_path包含可我们所需要的数据。它包含一个对象,该对象包含一组表示生成路线 的近似(平滑)路径的已编码 points 和 levels。编码算法参见http://code.google.com/intl/zh-CN/apis/maps/documentation /utilities/polylinealgorithm.html说明。
我们只需要提取points字段中的字符串进行解码就可以得到我们所需的一系列点了,将这些点按顺序连接起来就是我们所要的路线图了。
-
/**
-
*通过解析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;
- }
分享到:
相关推荐
为了在地图上画出导航路线,我们需要使用Google Maps Directions API。通过发送包含起点和终点的请求,API会返回包含多个路点的路径数据。这些数据通常是以JSON格式返回,包含每一步的经纬度坐标。 ```java String ...
本文实例讲述了Android实现在map上画出路线的方法。分享给大家供大家参考。具体如下: 最近在搞在地图上画出路线图,经过一段时间的摸索,终于搞明白了,其实也挺简单的,写个类继承Overlay,并重写draw方法,在draw...
本文将详细介绍如何在Android设备上实现这一功能,主要涉及Google Directions API的使用和解析返回的路线数据。 首先,Google Directions API是一个HTTP服务,它允许开发者通过发送请求来获取多个地理位置之间的...
在Android开发中,集成地图服务是一项常见的需求,而高德地图API则提供了强大的地图功能,包括定位、路径规划、路线导航等。本教程主要讲解如何使用高德地图API在Android应用中实现两点路线和多个点路线的绘制,并...
Android的Map API主要由Google Maps Android API v2提供,它基于Google Maps服务,能够实现在移动设备上展示交互式地图,包括缩放、平移、旋转和倾斜等操作。 一、集成Google Maps Android API v2 1. 在项目级...
在Android平台上,集成百度地图并实现动态画线是一项常见的需求,尤其在开发导航或路径规划应用时。本文将详细介绍如何利用百度地图API实现这一功能,包括基础的API配置、地图显示、定位服务以及动态画线的步骤。 ...
在Android平台上进行Baidu_map(百度地图)的开发是一项常见的任务,这涉及到集成地图功能、定位服务、路线规划以及各种地图交互操作。本指南将详细阐述如何在Android应用中有效地利用百度地图API来实现这些功能。 ...
7. **文件BaiduMapsApiDemo**:可能包含了一个完整的示例项目,包括HTML、CSS和JavaScript代码,展示了如何结合百度地图API实现在网页上根据经纬度画出路线。通过查看和分析这个文件,你可以更好地理解上述知识点的...
在Android开发中,使用地图API来绘制起点与终点的路线是一项常见的需求,特别是在导航或位置服务相关的应用中。本文将详细讲解如何利用高德地图SDK实现这一功能,并结合定位服务来跟踪用户当前位置。 首先,我们...
在Android开发中,集成百度地图并实现画线功能是一项常用且重要的任务,它可以帮助用户在地图上直观地展示路径或轨迹。本实例将探讨如何在Android应用中利用百度地图API来实现在地图上画线的功能。 首先,我们需要...
### Android游戏与应用开发最佳学习路线图 #### 一、路线图概览 本学习路线图旨在为初学者提供一个全面且系统的学习路径,帮助其掌握Android应用与游戏开发的核心技能。通过本路线图的学习,学员将能够从零开始...
综上所述,"siwi.map.android"可能是一个包含了Android地图应用核心组件的压缩包,涵盖了从地图显示到交互、定位、数据管理等多个方面。具体的内容还需要解压并检查文件才能确定。开发和维护这样的功能需要对Android...
5. Android数据存储:学习如何在Android平台上进行数据存储,包括使用Sqlite数据库实现增删改查(CRUD)操作,以及Android文件系统的基本操作。 6. Android多媒体与网络:掌握Android平台上的多媒体操作,如播放音频...
在Android平台上,集成百度地图(Baidu Map)是一项常见的任务,尤其对于开发地理位置相关的应用来说。这个名为"android baidu_map百度地图"的资源可能是关于如何在Android应用中使用百度地图SDK的教程或示例代码。...
- **Android数据存储**:学习如何在Android平台上使用SQLite进行数据的增删改查操作。 - **多媒体设计开发**:学会如何在Android应用中处理和播放音视频内容,操作图片等多媒体资源。 - **GPS定位应用开发**:使用...
2. 路径动画:规划出的路径可以通过Polyline对象在地图上显示,并通过动画效果模拟行驶过程,增加用户体验。 六、地理编码与反地理编码 1. 地理编码:将地址转换为经纬度坐标,通过GeocodeSearch类发起请求,返回...
在Android开发中,集成百度地图并实现自定义公交路线是一项常见的需求。这个源码资源提供了实现这一功能的具体示例,适合开发者进行参考学习。本文将详细介绍如何利用Android和Java技术来实现这一功能。 首先,我们...
它利用曲线拟合算法,使得地图上的路线呈现出更加平滑、自然的效果,从而提升用户的视觉体验。 ### 1. 曲线拟合算法 曲线拟合是数学和工程领域的一个重要概念,它通过数学模型将离散数据点连成一条连续曲线。...