Android Map 开发之高德地图
2013-05-06 14:45
375 查看
android Map 开发之google Map 可参考文档
链接
本文总结的是Android Map 开发之高德地图,以下是详细代码及注释:
如何把 API 添加到我的Android 工程中?
创建工程,将从网站下载的AMap_Android_Api_Lib 文件中的MapApi.jar 包拷贝到Libs 文件夹下,Libs 下的文件目录如下所示:
![](http://img.blog.csdn.net/20130506142727339)
MapApi.jar
下载链接
当MapApi.jar在Libs 文件夹中后,就表示将高德地图Android API库文件引入工程中了,您就可以在您的程序中使用高德地图API 了。
在manifest 中设置相应的权限
下面介绍在程序开发中需注意的问题:必须在AndroidManifest.xml 中设置相应的权限,添加代码如下:
栅格地图显示
MapActivity是一个抽象类,任何想要显示MapView 的activity 都需要派生自MapActivity。并且在其派生类的onCreate() 中,都要创建一个MapView 实例。
在布局文件夹 res/layout/mapview.xml 文件中添加地图控件代码如下:
结果见图3-1 栅格地图显示效果图:
![](http://img.blog.csdn.net/20130506143109712)
图3-1 栅格地图显示效果图
具体示例请查看参考示例 MapView 中的 GridMapView。
矢量地图显示
将libminimapv320.so 复制到工程目录下的libs\armeabi,目录结构见图3-2
![](http://img.blog.csdn.net/20130506143221471)
图3-2 工程目录结构图
代码如下:
结果见图3-3
![](http://img.blog.csdn.net/20130506143354686)
图3-3 矢量地图显示效果图
具体示例请查看参考示例MapView 中的VectorMapView。
所有叠加或覆盖到地图的内容,统称为地图覆盖物。如标注、矢量图形元素((包括:折线和多边形和圆))、定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动。
高德地图Android API 提供了如下几种覆盖物:
Overlay:覆盖物的抽象基类,所有的覆盖物均继承此类的方法,实现用户自定义图层显示。
MyLocationOverlay:一个负责显示用户当前位置的Overlay。
ItemizedOverlay:Overlay 的一个基类,包含了一个OverlayItem 列表,相当于一组分条的Overlay,通过继承此类,将一组兴趣点显示在地图上。
PoiOverlay:本地搜索图层,提供某一特定地区的位置搜索服务,比如在北京市搜索“天安门”,通过此图层将包含“天安门”关键字的标注显示在地图上。
RouteOverlay:公交,驾车导航线路图层,将公交、驾车出行方案的路线及关键点显示在地图上。
覆盖物的抽象基类(Overlay)
一般来说,在MapView 中添加一个Overlay 需要经过以下步骤:
自定义类继承Overlay,并Override 其draw()方法可以实现点,线,面等的显示,如果需要点击、按键、触摸等交互操作,还需OverrideonTap()等方法。
添加到MapView 的覆盖物中:
添加到MapView 的覆盖物中:
运行结果见图 6-1 覆盖物效果图:
![](http://img.blog.csdn.net/20130506143650890)
当前位置(MyLocationOverlay)
将MyLocationOverlay添加到覆盖物中,能够实现在地图上显示当前位置的图标以及指南针:
运行结果 见图 6-2 当前位置效果图 :
![](http://img.blog.csdn.net/20130506143903871)
图6-2 当前位置效果图
分条目覆盖物(ItemizedOverlay)
某个类型的覆盖物,包含多个类型相同、显示方式相同、处理方式相同的项时,使用此类:
自定义类继承ItemizedOverlay,并Override其draw() 方法,如果需要点击、按键、触摸等交互操作,还需OverrideonTap() 等方法。
添加到MapView 的覆盖物中:
点击其中一个图标,运行结果见图6-3 分条目覆盖效果图:
![](http://img.blog.csdn.net/20130506144233616)
图6-3 分条目覆盖效果图
本地搜索覆盖物(PoiOverlay)
请参见PoiSearch 及PoiOverlay 的类参考。
驾车、公交路线覆盖物(RouteOverlay)
请参见驾车路线搜索及RouteOverlay 和公交路线搜索及RouteOverlay 的类参考。
如转载此文请注明出处, 版权所有 违者必究 !
链接
本文总结的是Android Map 开发之高德地图,以下是详细代码及注释:
如何把 API 添加到我的Android 工程中?
创建工程,将从网站下载的AMap_Android_Api_Lib 文件中的MapApi.jar 包拷贝到Libs 文件夹下,Libs 下的文件目录如下所示:
MapApi.jar
下载链接
当MapApi.jar在Libs 文件夹中后,就表示将高德地图Android API库文件引入工程中了,您就可以在您的程序中使用高德地图API 了。
在manifest 中设置相应的权限
下面介绍在程序开发中需注意的问题:必须在AndroidManifest.xml 中设置相应的权限,添加代码如下:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <uses-permission android:name="android.permission.INTERNET"></uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>注意此添加权限代码与<application>同级。
栅格地图显示
MapActivity是一个抽象类,任何想要显示MapView 的activity 都需要派生自MapActivity。并且在其派生类的onCreate() 中,都要创建一个MapView 实例。
public class GridMapView extends MapActivity{ private MapView mMapView; private MapController mMapController; private GeoPoint point; @Override /** *显示栅格地图,启用内置缩放控件,并用MapController 控制地图的中心点及Zoom 级别 */ protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.mapview); //布局文件夹 res/layout/mapview.xml 文件。 mMapView = (MapView) findViewById(R.id.mapView); mMapView.setBuiltInZoomControls(true); //设置启用内置的缩放控件 mMapController = mMapView.getController(); // 得到mMapView 的控制权,可以用它控制和驱动平移和缩放 point = new GeoPoint((int) (39.982378 * 1E6), (int) (116.304923 * 1E6)); //用给定的经纬度构造一个GeoPoint,单位是微度(度* 1E6) mMapController.setCenter(point); //设置地图中心点 mMapController.setZoom(12); //设置地图zoom 级别 } }
在布局文件夹 res/layout/mapview.xml 文件中添加地图控件代码如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:autonavi="http://schemas.android.com/apk/res/com.AMap" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.amap.mapapi.map.MapView android:id="@+id/mapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> </LinearLayout>
结果见图3-1 栅格地图显示效果图:
图3-1 栅格地图显示效果图
具体示例请查看参考示例 MapView 中的 GridMapView。
矢量地图显示
将libminimapv320.so 复制到工程目录下的libs\armeabi,目录结构见图3-2
图3-2 工程目录结构图
代码如下:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.vmapview); mMapView = (MapView) findViewById(R.id.vmapView); mMapView.setVectorMap(true);//设置地图为矢量模式 mMapView.setBuiltInZoomControls(true); //设置启用内置的缩放控件 mMapController = mMapView.getController(); // 得到mMapView的控制权,可以用它控制和驱动平移和缩放 point = new GeoPoint((int) (39.90923 * 1E6), (int) (116.397428 * 1E6)); //用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6) mMapController.setCenter(point); //设置地图中心点 mMapController.setZoom(12); //设置地图zoom级别 }
结果见图3-3
图3-3 矢量地图显示效果图
具体示例请查看参考示例MapView 中的VectorMapView。
地图覆盖物
概述所有叠加或覆盖到地图的内容,统称为地图覆盖物。如标注、矢量图形元素((包括:折线和多边形和圆))、定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动。
高德地图Android API 提供了如下几种覆盖物:
Overlay:覆盖物的抽象基类,所有的覆盖物均继承此类的方法,实现用户自定义图层显示。
MyLocationOverlay:一个负责显示用户当前位置的Overlay。
ItemizedOverlay:Overlay 的一个基类,包含了一个OverlayItem 列表,相当于一组分条的Overlay,通过继承此类,将一组兴趣点显示在地图上。
PoiOverlay:本地搜索图层,提供某一特定地区的位置搜索服务,比如在北京市搜索“天安门”,通过此图层将包含“天安门”关键字的标注显示在地图上。
RouteOverlay:公交,驾车导航线路图层,将公交、驾车出行方案的路线及关键点显示在地图上。
覆盖物的抽象基类(Overlay)
一般来说,在MapView 中添加一个Overlay 需要经过以下步骤:
自定义类继承Overlay,并Override 其draw()方法可以实现点,线,面等的显示,如果需要点击、按键、触摸等交互操作,还需OverrideonTap()等方法。
添加到MapView 的覆盖物中:
publicclass MyOverlay extends Overlay{ @Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { // TODO Auto-generated method stub super.draw(canvas, mapView, shadow); Point screenPts = new Point(); mapView.getProjection().toPixels(point, screenPts); //---add the marker--- Bitmap bmp = BitmapFactory.decodeResource( getResources(), R.drawable.da_marker_red); canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null); Paint paintText = new Paint(); paintText.setTextSize(18); paintText.setColor(Color.BLACK); canvas.drawText("★AMap", screenPts.x, screenPts.y, paintText); // 绘制文本 Paint mCirclePaint = new Paint(); mCirclePaint.setAntiAlias(true); mCirclePaint.setColor(Color.BLUE); mCirclePaint.setAlpha(50); mCirclePaint.setStyle(Style.FILL); canvas.drawCircle(screenPts.x+150, screenPts.y, 50, mCirclePaint); Paint paintLine = new Paint(); paintLine.setColor(Color.RED); paintLine.setStrokeWidth(3.0f); paintLine.setStyle(Paint.Style.STROKE); canvas.drawLine(screenPts.x-100, screenPts.y, screenPts.x, screenPts.y-200, paintLine); } @Override public boolean onTap(GeoPoint arg0, MapView arg1) { // TODO Auto-generated method stub return super.onTap(arg0, arg1); } }
添加到MapView 的覆盖物中:
mMapView.getOverlays().add(new MyOverlay());
运行结果见图 6-1 覆盖物效果图:
当前位置(MyLocationOverlay)
将MyLocationOverlay添加到覆盖物中,能够实现在地图上显示当前位置的图标以及指南针:
MyLocationOverlay mylocTest = new MyLocationOverlay(MylocationDemo.this, map); mylocTest.enableMyLocation(); mylocTest.enableCompass(); // 打开指南针 map.getOverlays().add(mylocTest);
运行结果 见图 6-2 当前位置效果图 :
图6-2 当前位置效果图
分条目覆盖物(ItemizedOverlay)
某个类型的覆盖物,包含多个类型相同、显示方式相同、处理方式相同的项时,使用此类:
自定义类继承ItemizedOverlay,并Override其draw() 方法,如果需要点击、按键、触摸等交互操作,还需OverrideonTap() 等方法。
class OverItemT extends ItemizedOverlay<overlayitem> { private List<overlayitem> GeoList = new ArrayList<overlayitem>(); private Drawable marker; private Context mContext; private double mLat1 = 39.9022; // point1 纬度 private double mLon1 = 116.3922; // point1 经度 private double mLat2 = 39.607723; private double mLon2 = 116.397741; private double mLat3 = 39.917723; private double mLon3 = 116.6552; public OverItemT(Drawable marker, Context context) { super(boundCenterBottom(marker)); this.marker = marker; this.mContext = context; // 用给定的经纬度构造GeoPoint,单位是微度(度* 1E6) GeoPoint p1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6)); GeoPoint p2 = new GeoPoint((int) (mLat2 * 1E6), (int) (mLon2 * 1E6)); GeoPoint p3 = new GeoPoint((int) (mLat3 * 1E6), (int) (mLon3 * 1E6)); // 构造OverlayItem 的三个参数依次为:item 的位置,标题文本,文字片段 GeoList.add(new OverlayItem(p1, "P1", "point1")); GeoList.add(new OverlayItem(p2, "P2", "point2")); GeoList.add(new OverlayItem(p3, "P3", "point3")); populate(); //createItem(int)方法构造item。一旦有了数据,在调用其它方法前,首先调用这个方法 } @Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { // Projection 接口用于屏幕像素点坐标系统和地球表面经纬度点坐标系统之间的变换 Projection projection = mapView.getProjection(); for (int index = size() -1; index >= 0; index--) { // 遍历GeoList OverlayItem overLayItem = getItem(index); // 得到给定索引的item String title= overLayItem.getTitle(); // 把经纬度变换到相对于MapView 左上角的屏幕像素坐标 Point point = projection.toPixels(overLayItem.getPoint(), null); // 可在此处添加您的绘制代码 Paint paintText = new Paint(); paintText.setColor(Color.BLACK); paintText.setTextSize(15); canvas.drawText(title, point.x-30, point.y -25, paintText); // 绘制文本 } super.draw(canvas, mapView, shadow); //调整一个drawable 边界,使得(0,0)是这个drawable 底部最后一行中心的一个像素 boundCenterBottom(marker); } @Override protected OverlayItem createItem(int i) { // TODO Auto-generated method stub return GeoList.get(i); } @Override public int size() { // TODO Auto-generated method stub return GeoList.size(); } @Override // 处理当点击事件 protected boolean onTap(int i) { setFocus(GeoList.get(i)); Toast.makeText(this.mContext, GeoList.get(i).getSnippet(), Toast.LENGTH_SHORT).show(); return true; } @Override public boolean onTap(GeoPoint point, MapView mapView) { // TODO Auto-generated method stub return super.onTap(point, mapView); } }
添加到MapView 的覆盖物中:
Drawable marker = getResources().getDrawable(R.drawable.da_marker_red); //得到需要标在地图上的资源 marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker .getIntrinsicHeight()); //为maker 定义位置和边界 mMapView.getOverlays().add(new OverItemT(marker, this)); //添加ItemizedOverlay 实例到mMapView
点击其中一个图标,运行结果见图6-3 分条目覆盖效果图:
图6-3 分条目覆盖效果图
本地搜索覆盖物(PoiOverlay)
请参见PoiSearch 及PoiOverlay 的类参考。
驾车、公交路线覆盖物(RouteOverlay)
请参见驾车路线搜索及RouteOverlay 和公交路线搜索及RouteOverlay 的类参考。
如转载此文请注明出处, 版权所有 违者必究 !
相关文章推荐
- 【原】Android高德地图开发——路况+定位
- 使用Google Map Api在Android平台上开发地图应用1
- Android开发:高德地图通过经纬度反编译其位置名称
- 安卓智能地图开发与实施四:二维地图的MapView与Layers - ArcGIS Runtime SDK for Android(Version 100.0.0)
- android MapBox地图基于openstreetmap开发
- android map高德地图显示多个点,并且每个marker点可以响应鼠标点击事件,处理跳转页面
- Android开发之高德地图实现定位
- Android开发 PopupWindow弹窗调用第三方地图(百度,高德)实现导航功能
- Android之高德接口开发地图(-)
- Android开发_地图应用_百度Map-1
- 【原】Android高德地图开发——准备阶段
- 使用Google Map Api在Android平台上开发地图应用4
- Android 高德地图开发 如何去掉路线规划上起始点图标!
- Android地图开发之OpenStreetMap基础教程
- Anroid 开发so文件找不到问题-例高德地图SDK提示com.autonavi.amap.mapcore.MapCore.nativeNewInstance问题
- android开发游记:APP内部调启百度、高德、web地图导航
- 【原】Android高德地图开发——地图显示+自定义控件
- Android地图开发-BingMap基础教程
- Android 高德地图开发 之 解决地图不显示
- Android 百度地图开发-setOnTouchListener方法给mapView设置了OnTouchListener后地图无法拖动的问题