Android Map 开发之高德地图
android Map 开发之google Map 可参考文档 链接
本文总结的是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 stubsuper.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 Map 开发之高德地图相关推荐
- android导航地图,地图导航-Android平台-开发指南-高德地图车机版 | 高德地图API
直接导航 传入终点,以用户当前车位为起点直接发起导航. 参数说明 参数说明是否必填类型 ActionAUTONAVI_STANDARD_BROADCAST_RECV是String KEY_TYPE协议 ...
- android高德地图搜索地址,地点/周边搜索-Android平台-开发指南-高德地图车机版 | 高德地图API...
关键字搜索 第三方通过该接口可传入关键字信息给auto,调起auto执行关键字搜索并跳转到搜索结果展现界面,官网版本都可支持 参数说明 参数说明是否必填类型 ActionAUTONAVI_STANDA ...
- android 高德地图周边,地点/周边搜索-Android平台-开发指南-高德地图车机版 | 高德地图API...
关键字搜索 第三方通过该接口可传入关键字信息给auto,调起auto执行关键字搜索并跳转到搜索结果展现界面,官网版本都可支持 参数说明 参数说明是否必填类型 ActionAUTONAVI_STANDA ...
- 项目 - Web地图开发【高德地图API】(一)
导航兔: Web地图开发 [高德地图API] 导航地址 Web地图开发[高德地图API](一) https://qianmoer.blog.csdn.net/article/details/12842 ...
- 使用plugman开发cordova 高德地图定位插件
在开发的过程中我们更多的是使用别人开发的cordova插件,但是在使用的过程中经常会遇到一些不合自己心意的问题,那么我们就来使用plugman开发一个属于自己的cordova插件吧. 源码地址 : h ...
- 项目 - Web地图开发【高德地图API】(二)
导航兔: Web地图开发 [高德地图API] 导航地址 Web地图开发[高德地图API](一) https://qianmoer.blog.csdn.net/article/details/12842 ...
- Android开发实现高德地图定位详解
一. 要实现高德地图定位呢,首先需要做好以下几步准备: 1. 在高德开放平台注册帐号 注册地址:http://lbs.amap.com 2. 在开发中下载Android平台下的地图SDK和定位S ...
- android开发之高德地图API篇:1、高德地图API之实时定位+轨迹可视化
TIME:2020年7月6日 高德地图API之实时定位+轨迹可视化 前言: step1.工程的配置 step2.显示地图 step2.实现静态定位: step3.实时定位 step4.实现轨迹可视化: ...
- Android开发-使用高德地图SDK实现仿钉钉打卡的功能
前 言 LBS(基于地理位置服务)是当前移动互联网大部分应用不可或缺的功能,基于地理位置服务的Android平台的开发是主要用于Android系统作为载体,我们可以利用定位出的位置进行许多丰富多彩的操 ...
最新文章
- flannel源码分析--InClusterConfig
- c语言中的void指针,C程序中void指针的概念
- Python函数——.strip()
- 自动装配有哪些局限性?
- 在Java Web应用程序中阻止CSRF
- 你还认识变量吗?Java基础学习不可略过的基本语法,简而不漏,变量的定义赋值和分类,系统认识Java中的变量有哪些?
- 判断日期是否为当月最后一天_对比Excel,怎么用Python获取指定月最后一天的日期...
- 五大服务顺序_百度大脑5.0技术干货:详解飞桨五大优势,鸿鹄芯片架构细节
- Java 动态绑定/多态
- 【UE4 特效】粒子火焰
- 计算机视觉教程3-1:全面详解图像边缘检测算法(附Python实战)
- VB语言和C语言有什么区别
- 案例分析:数据驱动增长的数据虚荣与彷徨
- python的if __name__ == “__main__“语法错误SyntaxError: invalid syntax
- 几道经典逻辑推理题,提高你的逻辑思考能力
- LearnOpenGL->立方体贴图
- 我的-Android-面试故事---13家面试记录,附面试答案,android星座查询源码
- 自媒体推广该怎么做?学懂这10招,走路横着走
- CC00389.CloudKubernetes——|KuberNetesCI/CD.V27|——|Jenkins.v07|自动构建NodeJs应用.v01|
- 其实,中本聪并没有提过哈耶克...
热门文章
- 鸟哥的linux私房菜运维,《鸟哥的Linux私房菜》(基础篇)笔记整理
- 04-Docker-Centos 7.2 之 虚拟机peer orderer 部署并测试e2e_cli
- winen中文_Windows Server 2016 中英文版下载!
- php-备忘录模式实现
- 江西省软考报名时间成绩查询江西省教育考试院江西人事考试网报名入口
- linux svn 提交 慢,关于通过linux Samba共享开发模式,svn提交慢等问题
- 5天破10亿的哪吒,为啥这么火,Python来分析 !
- 真的看不见我? 潜入类游戏敌兵AI的界定
- 阿里云学生服务器、续费价格、购买条件、等相关问题汇总和解答
- 弹幕单词-电脑懒人背单词的新方式