`

Android 在map上画出路线

 
阅读更多


最近在搞在地图上画出路线图,经过一段时间的摸索,终于搞明白了,其实也挺简单的,写个类继承 Overlay,并重写draw方法,在draw方法中画出path即可。对于Overaly,在地图上标记某个点或者画线之类的就要使用 overlay,overlay相当于一个覆盖物,覆盖在地图上,这个覆盖物要自己实现所以要继承Overlay。本例自定义了要画的点,如何得到两地之 间的众多点的坐标(经纬度),可以参考Android在google map上画出导航路线图http://www.linuxidc.com/Linux/2011-05/36375p2.htm

具体代码:

  1. packagenet.blogjava.mobile.map;
  2. importjava.util.List;
  3. importAndroid.app.AlertDialog;
  4. importandroid.graphics.Bitmap;
  5. importandroid.graphics.BitmapFactory;
  6. importandroid.graphics.Canvas;
  7. importandroid.graphics.Color;
  8. importandroid.graphics.Paint;
  9. importandroid.graphics.Path;
  10. importandroid.graphics.Point;
  11. importandroid.location.Address;
  12. importandroid.location.Geocoder;
  13. importandroid.os.Bundle;
  14. importandroid.view.Menu;
  15. importcom.google.android.maps.GeoPoint;
  16. importcom.google.android.maps.MapActivity;
  17. importcom.google.android.maps.MapController;
  18. importcom.google.android.maps.MapView;
  19. importcom.google.android.maps.Overlay;
  20. importcom.google.android.maps.Projection;
  21. publicclassMainextendsMapActivity{
  22. privateGeoPointgpoint1,gpoint2,gpoint3;//连线的点
  23. @Override
  24. publicvoidonCreate(BundlesavedInstanceState){
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.main);
  27. MapViewmapView=(MapView)findViewById(R.id.mapview);
  28. mapView.setClickable(true);
  29. mapView.setBuiltInZoomControls(true);
  30. MapControllermapController=mapView.getController();
  31. mapView.setTraffic(true);//交通图
  32. //mapView.setSatellite(true);//卫星图
  33. //mapView.setStreetView(true);//街景
  34. MyOverlaymyOverlay=newMyOverlay();
  35. mapView.getOverlays().add(myOverlay);
  36. mapController.setZoom(15);//初始放大倍数
  37. gpoint1=newGeoPoint((int)(24.477384*1000000),
  38. (int)(118.158216*1000000));
  39. gpoint2=newGeoPoint((int)(24.488967*1000000),
  40. (int)(118.144277*1000000));
  41. gpoint3=newGeoPoint((int)(24.491091*1000000),
  42. (int)(118.136781*1000000));
  43. mapController.animateTo(gpoint1);
  44. }
  45. @Override
  46. protectedbooleanisRouteDisplayed(){
  47. //TODOAuto-generatedmethodstub
  48. returnfalse;
  49. }
  50. classMyOverlayextendsOverlay{
  51. @Override
  52. publicvoiddraw(Canvascanvas,MapViewmapView,booleanshadow){
  53. //TODOAuto-generatedmethodstub
  54. super.draw(canvas,mapView,shadow);
  55. //画笔
  56. Paintpaint=newPaint();
  57. paint.setColor(Color.RED);
  58. paint.setDither(true);
  59. paint.setStyle(Paint.Style.STROKE);
  60. paint.setStrokeJoin(Paint.Join.ROUND);
  61. paint.setStrokeCap(Paint.Cap.ROUND);
  62. paint.setStrokeWidth(2);
  63. Projectionprojection=mapView.getProjection();
  64. Pointp1=newPoint();
  65. Pointp2=newPoint();
  66. Pointp3=newPoint();
  67. projection.toPixels(gpoint1,p1);
  68. projection.toPixels(gpoint2,p2);
  69. projection.toPixels(gpoint3,p3);
  70. Pathpath=newPath();
  71. path.moveTo(p1.x,p1.y);
  72. path.lineTo(p2.x,p2.y);
  73. path.lineTo(p3.x,p3.y);
  74. canvas.drawPath(path,paint);//画出路径
  75. }
  76. }
  77. }

main.xml:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:Android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"android:layout_width="fill_parent"
  4. android:layout_height="fill_parent">
  5. <com.google.android.maps.MapView
  6. android:id="@+id/mapview"android:layout_width="fill_parent"
  7. android:layout_height="fill_parent"
  8. android:apiKey="0IB7Kn70qp1LT216Hhb-jmHJ8GLTie4p63O77KQ"/>
  9. </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字段中的字符串进行解码就可以得到我们所需的一系列点了,将这些点按顺序连接起来就是我们所要的路线图了。

  1. /**
  2. *通过解析googlemap返回的xml,在map中画路线图
  3. */
  4. publicvoiddrawRoute(){
  5. Stringurl="http://maps.google.com/maps/api/directions/xml?origin=23.055291,113.391802"+
  6. "&destination=23.046604,113.397510&sensor=false&mode=walking";
  7. HttpGetget=newHttpGet(url);
  8. StringstrResult="";
  9. try{
  10. HttpParamshttpParameters=newBasicHttpParams();
  11. HttpConnectionParams.setConnectionTimeout(httpParameters,3000);
  12. HttpClienthttpClient=newDefaultHttpClient(httpParameters);
  13. HttpResponsehttpResponse=null;
  14. httpResponse=httpClient.execute(get);
  15. if(httpResponse.getStatusLine().getStatusCode()==200){
  16. strResult=EntityUtils.toString(httpResponse.getEntity());
  17. }
  18. }catch(Exceptione){
  19. return;
  20. }
  21. if(-1==strResult.indexOf("<status>OK</status>")){
  22. Toast.makeText(this,"获取导航路线失败!",Toast.LENGTH_SHORT).show();
  23. this.finish();
  24. return;
  25. }
  26. intpos=strResult.indexOf("<overview_polyline>");
  27. pos=strResult.indexOf("<points>",pos+1);
  28. intpos2=strResult.indexOf("</points>",pos);
  29. strResult=strResult.substring(pos+8,pos2);
  30. List<GeoPoint>points=decodePoly(strResult);
  31. MyOverLaymOverlay=newMyOverLay(points);
  32. List<Overlay>overlays=mMapView.getOverlays();
  33. overlays.add(mOverlay);
  34. if(points.size()>=2){
  35. mMapController.animateTo(points.get(0));
  36. }
  37. mMapView.invalidate();
  38. }
  39. /**
  40. *解析返回xml中overview_polyline的路线编码
  41. *
  42. *@paramencoded
  43. *@return
  44. */
  45. privateList<GeoPoint>decodePoly(Stringencoded){
  46. List<GeoPoint>poly=newArrayList<GeoPoint>();
  47. intindex=0,len=encoded.length();
  48. intlat=0,lng=0;
  49. while(index<len){
  50. intb,shift=0,result=0;
  51. do{
  52. b=encoded.charAt(index++)-63;
  53. result|=(b&0x1f)<<shift;
  54. shift+=5;
  55. }while(b>=0x20);
  56. intdlat=((result&1)!=0?~(result>>1):(result>>1));
  57. lat+=dlat;
  58. shift=0;
  59. result=0;
  60. do{
  61. b=encoded.charAt(index++)-63;
  62. result|=(b&0x1f)<<shift;
  63. shift+=5;
  64. }while(b>=0x20);
  65. intdlng=((result&1)!=0?~(result>>1):(result>>1));
  66. lng+=dlng;
  67. GeoPointp=newGeoPoint((int)(((double)lat/1E5)*1E6),
  68. (int)(((double)lng/1E5)*1E6));
  69. poly.add(p);
  70. }
  71. returnpoly;
  72. }

分享到:
评论

相关推荐

    android在google map上画导航路线图

    为了在地图上画出导航路线,我们需要使用Google Maps Directions API。通过发送包含起点和终点的请求,API会返回包含多个路点的路径数据。这些数据通常是以JSON格式返回,包含每一步的经纬度坐标。 ```java String ...

    Android实现在map上画出路线的方法

    本文实例讲述了Android实现在map上画出路线的方法。分享给大家供大家参考。具体如下: 最近在搞在地图上画出路线图,经过一段时间的摸索,终于搞明白了,其实也挺简单的,写个类继承Overlay,并重写draw方法,在draw...

    Android结合googlemap应用开发

    本文将详细介绍如何在Android设备上实现这一功能,主要涉及Google Directions API的使用和解析返回的路线数据。 首先,Google Directions API是一个HTTP服务,它允许开发者通过发送请求来获取多个地理位置之间的...

    android高德地图两点路线和多个点路线绘制

    在Android开发中,集成地图服务是一项常见的需求,而高德地图API则提供了强大的地图功能,包括定位、路径规划、路线导航等。本教程主要讲解如何使用高德地图API在Android应用中实现两点路线和多个点路线的绘制,并...

    Android的mapApi

    Android的Map API主要由Google Maps Android API v2提供,它基于Google Maps服务,能够实现在移动设备上展示交互式地图,包括缩放、平移、旋转和倾斜等操作。 一、集成Google Maps Android API v2 1. 在项目级...

    android百度地图实现画线

    在Android平台上,集成百度地图并实现动态画线是一项常见的需求,尤其在开发导航或路径规划应用时。本文将详细介绍如何利用百度地图API实现这一功能,包括基础的API配置、地图显示、定位服务以及动态画线的步骤。 ...

    Baidu_map(百度地图)Android平台开发指南

    在Android平台上进行Baidu_map(百度地图)的开发是一项常见的任务,这涉及到集成地图功能、定位服务、路线规划以及各种地图交互操作。本指南将详细阐述如何在Android应用中有效地利用百度地图API来实现这些功能。 ...

    根据经纬度画路线百度地图

    7. **文件BaiduMapsApiDemo**:可能包含了一个完整的示例项目,包括HTML、CSS和JavaScript代码,展示了如何结合百度地图API实现在网页上根据经纬度画出路线。通过查看和分析这个文件,你可以更好地理解上述知识点的...

    android 高德绘制起点与终点路线

    在Android开发中,使用地图API来绘制起点与终点的路线是一项常见的需求,特别是在导航或位置服务相关的应用中。本文将详细讲解如何利用高德地图SDK实现这一功能,并结合定位服务来跟踪用户当前位置。 首先,我们...

    android开发百度地图画线功能

    在Android开发中,集成百度地图并实现画线功能是一项常用且重要的任务,它可以帮助用户在地图上直观地展示路径或轨迹。本实例将探讨如何在Android应用中利用百度地图API来实现在地图上画线的功能。 首先,我们需要...

    Android游戏与应用开发最佳学习路线图

    ### Android游戏与应用开发最佳学习路线图 #### 一、路线图概览 本学习路线图旨在为初学者提供一个全面且系统的学习路径,帮助其掌握Android应用与游戏开发的核心技能。通过本路线图的学习,学员将能够从零开始...

    siwi.map.android

    综上所述,"siwi.map.android"可能是一个包含了Android地图应用核心组件的压缩包,涵盖了从地图显示到交互、定位、数据管理等多个方面。具体的内容还需要解压并检查文件才能确定。开发和维护这样的功能需要对Android...

    Android最佳学习路线图

    5. Android数据存储:学习如何在Android平台上进行数据存储,包括使用Sqlite数据库实现增删改查(CRUD)操作,以及Android文件系统的基本操作。 6. Android多媒体与网络:掌握Android平台上的多媒体操作,如播放音频...

    android baidu_map百度地图

    在Android平台上,集成百度地图(Baidu Map)是一项常见的任务,尤其对于开发地理位置相关的应用来说。这个名为"android baidu_map百度地图"的资源可能是关于如何在Android应用中使用百度地图SDK的教程或示例代码。...

    android最佳学习路线

    - **Android数据存储**:学习如何在Android平台上使用SQLite进行数据的增删改查操作。 - **多媒体设计开发**:学会如何在Android应用中处理和播放音视频内容,操作图片等多媒体资源。 - **GPS定位应用开发**:使用...

    AMap_Android_API-Android源码.zip

    2. 路径动画:规划出的路径可以通过Polyline对象在地图上显示,并通过动画效果模拟行驶过程,增加用户体验。 六、地理编码与反地理编码 1. 地理编码:将地址转换为经纬度坐标,通过GeocodeSearch类发起请求,返回...

    Android 百度地图之自定义公交路线源码.rar

    在Android开发中,集成百度地图并实现自定义公交路线是一项常见的需求。这个源码资源提供了实现这一功能的具体示例,适合开发者进行参考学习。本文将详细介绍如何利用Android和Java技术来实现这一功能。 首先,我们...

    Android-Curve-Fit是一个用于在GoogleMapsAndroidAPIv2上绘制轨迹的Android库

    它利用曲线拟合算法,使得地图上的路线呈现出更加平滑、自然的效果,从而提升用户的视觉体验。 ### 1. 曲线拟合算法 曲线拟合是数学和工程领域的一个重要概念,它通过数学模型将离散数据点连成一条连续曲线。...

Global site tag (gtag.js) - Google Analytics