一、简介百度地图API:
1、简介:
百度地图移动版API(Android)是一套基于Android设备的应用程序接口,通过该接口,可以轻松访问百度服务和数据,构建功能丰富、交互性强的地图应用程序
2、功能:
百度地图移动版API不仅包含构建地图的基本接口,还提供了本地搜索、路线规划、地图定位等数据服务。
辅助内容:如何把地图展示出来,构建构建功能丰富、交互性强的地图应用程序
3、三大核心类:
BmapManager;MapView ;MapController
1)BmapManager:
百度地图的管理工具,可以看成是地图的引擎管理工具
验证申请的KEY
2)MapView
从布局文件中找到指定的控件mapView
控制onPause;onResume,onDestroy方法,伴随Activity生命周期执行的
3)MapController
地图的控制器
通过此进行缩放等等一些列的控制方法
移动地图、设置指南针位置、地图旋转等
二、百度地图入门:
准备工作:
1、获取APIKey:作为自己应用的唯一标示
①、申请KEY:
申请地址:http://developer.baidu.com/map/android-mobile-apply-key.htm
2、创建工程:
①、在工程中创建常量,存放申请的key:
3、添加地图引擎到安卓工程中:
实际上就是导入一些jar包和.os文件:
添加jar包:baidumapapi_v2_1_2.jar和locSDK_3.1.jar
添加.so文件:拷贝libapp_BaiduMapApplib_v2_1_2.so、liblocSDK3.so、libvi_voslib.so到libs\armeabi目录下
4、添加权限:
<!-- gps -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- wifi -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 网络的权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 离线包 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 获取手机信息 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
5、实现地图显示:
1)、初始化地图引擎:
在activity中的onCreate方法中初始化地图引擎
①、到百度的服务器端检验KEY:一定要在加载布局文件之前调用
创建初始化校验的方法initManager()
@、创建BmapManager对象:
manager = new BMapManager(getApplicationContext());
@、调用初始化的方法:
传入申请到的KEY,并实现指定的接口:
manager.init(ConstantValue.KEY, new MKGeneralListener() {
实现其中的两个方法:
①、授权验证的状态:失败的失败码iError为300
②、网络判断:失败了返回的iError是2
2)、加载布局文件:
①、创建布局文件:
@common.xml:添加MapView控件用于展示地图
<com.baidu.mapapi.map.MapView
android:id="@+id/mapview"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
@activity_main.xml:
<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
@item.xml:
用于ListView显示的条目,即百度地图显示的控件
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="50dip"
android:textColor="@android:color/black"
android:textSize="20sp"
android:gravity="center_vertical"
/>
②、加载布局文件:调用setContentView方法进行解析加载:
TIPS:
使用AMD模拟器
在MainActivity中:
在activity_main.xml中添加ListView;创建item.xml,显示每个条目
3)控制MapView的onResume、onPause、destroy:
实现Activity的onResume和onPause还有onDestroy方法:直接调用mapView相同的方法:
4)初始化地图控件,并注册监听:
从布局文件中加载地图控件mapView: mapView = (MapView) findViewById(R.id.mapview);
添加缩放的按钮:mapView.setBuiltInZoomControls(true);// 显示放大和缩小的控件
注册监听:mapView.regMapViewListener(manager, new MKMapViewListener() {
在点击地图上兴趣点的方法中,打印吐司,显示点击的位置名称
Tips:
在查看系统API:BaseMapDemo
5)管理地图:
创建管理地图的方法initController():
①、创建地图控制器对象:controller = mapView.getController();
②、设置缩放级别:
缩放级别:V2.0之前支持(3-18),V2.0之后多一级(19)
设置默认缩放级别:controller.setZoom(12);
③、控制poi兴趣点是否可以被点击:controller.enableClick(true);
注意:这个方法必须设置,否则点击兴趣点是没有效果的
控制移动旋转缩放的方法:
重写onKeyDown方法,通过按不同的键,实现相应的功能:
1、移动:
移动到指定的点位(地图的中心点:默认为天安门)
controller.animateTo(arg0):
传入的arg0的参数为存放经纬度信息的对象:GEOPoint【接收两个参数:经纬度】
2、放大:
controller.zoomIn(arg0):放大一个级别;传入的是旋转的角度
3、缩小:
controller.zoomOut(arg0)
4、水平方向旋转:
设置旋转的角度:
定义初始化角度
设置旋转的角度
获取转动之后的角度(测试用)
int mapRotation = mapView.getMapRotation();// 开始旋转之前的角度
controller.setRotation(mapRotation + 30);// 设置旋转的角度
mapRotation = mapView.getMapRotation();// 转动之后的角度
controller.zoomOut(arg0):传入的是旋转的角度
5、垂直方向旋转:
定义开始的角度
设置旋转的角度
int mapOverlooking = mapView.getMapOverlooking();// 前后旋转(开始角度)
controller.setOverlooking(mapOverlooking - 5);
mapOverlooking = mapView.getMapOverlooking();
三、百度地图加强
一)地图图层:
1、地图图层:——相当于纸张
地图可以包含一个或多个图层,每个图层在每个级别都是由若干张图块组成的,它们覆盖了地图的整个表面。例如您所看到包括街道、兴趣点、学校、公园等内容的地图展现就是一个图层,另外交通流量的展现也是通过图层来实现的
2、图层分类
底图:基本的地图图层,包括若干个缩放级别,显示基本的地图信息,包括道路、街道、学校、公园等内容
实时交通信息图:MapView.setTraffic(true)
卫星图:MapView.setSatellite(true)
二)覆盖物:
1、覆盖物:
所有叠加或覆盖到地图的内容,我们统称为地图覆盖物。
如标注、矢量图形元素(包括:折线和多边形和圆)、定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的处理。
2、 覆盖物包括:
①、覆盖物的抽象基类:Overlay(核心类)
②、几何图形绘制覆盖物:GraphicsOverlay
③、文字绘制覆盖物:TextOverlay
④、分条目覆盖物:ItemizedOverlay
⑤、本地搜索覆盖物:PoiOverlay
⑥、驾车路线覆盖物:RouteOverlay
⑦、换乘路线覆盖物:TransitOverlay
⑧、我的位置覆盖物:MyLocationOverlay
3、Overlay:
1)、Overlay:覆盖物的抽象基类;表示可以显示在地图上方的
2)、Overlay显示的步骤:
需要获取到MapView中保存Overlay的集合
在其中添加需要显示的内容
然后刷新界面
三)、绘制各种覆盖物:
1、初始化:
在onCreate方法中,进行初始化工作:
准备工作在BaseActivity中完成
2、初始化覆盖物:
在onCreate方法中,创建overlay方法,对覆盖物进行初始化:
===》绘制几何图形:
在overlay方法中初始化几何覆盖物:
①、获取覆盖物集合:
List<Overlay> overlays = mapView.getOverlays();
②、自定义覆盖物:
GraphicsOverlay overlay = new GraphicsOverlay(mapView);
③、覆盖物的数据设置:
setData(overlay);//见下
④、将几何覆盖物添加到覆盖物集合中
overlays.add(overlay);
⑤、刷新界面:
mapView.refresh();
覆盖物的数据设置:setData(overlay);
创建setData方法:
①、创建几何元素,并设置圆的圆点和半径
Geometry geometry = new Geometry();
geometry.setCircle(hmPos, 1000);// 圆
②、设置圆的样式:
创建样式对象并设置样式的颜色
Symbol symbol = new Symbol();
Color color = symbol.new Color();
color.red = 255;
color.green = 0;
color.blue = 0;
color.alpha = 100;
symbol.setSurface(color, 1, 0);
③、创建图形对象,传入几何元素和样式对象
Graphic graphic = new Graphic(geometry, symbol);
④、设置图形对象到覆盖物中
overlay.setData(graphic);
===》画文字覆盖物信息
在overlay方法中初始化文字覆盖物
①、创建文字覆盖物对象:
TextOverlay overlay=new TextOverlay(mapView);
②、设置数据
创建setData方法(见下):setData(overlay);
③、将覆盖物添加到覆盖物集合中:
通过mapView获取到地图上的覆盖物集合,将文字覆盖物添加进去:
mapView.getOverlays().add(overlay);
④、刷新界面:
mapView.refresh();
覆盖物的数据设置:setData(overlay);
①、创建TextItem对象
@设置文字的颜色:创建getColor方法,对文字的颜色进行设置:
创建getColor方法:
&创建样式对象Symbol symbol=new Symbol();
&创建样式中的颜色对象:Color color=symbol.new Color();
&设置color的RGB及透明度,并将color对象返回
color.red = 255;
color.green = 0;
color.blue = 0;
color.alpha = 100;
return color;
@设置文字大小
@设置文字在mapView 上的位置
@设置文字
②、将item加入到覆盖物overlay中
===》绘制分条目覆盖物并显示pop
效果如图:
1、初始化条目覆盖物
在overlay方法中初始化条目覆盖物:
①、创建OverItem【各个条目覆盖物】
ItemizedOverlay(Drawable defaultMarker, MapView mapView)
参数:
defaultMarker:图片资源
mapView:指定的地图控件
处理点击事件:
实现ItemizedOverlay中的onTap方法:
@、获取到当前点击的条目:OverlayItem item = getItem(index);
@、设置条目的名称到TextView中,【TextView是添加到mapView上的控件】
@、在点击条目时,需要将旧的pop隐藏掉:pop.setVisibility(View.INVISIBLE);// 第二次点击
@、需要重新设置pop的位置为点击的条目的位置【经纬度】,并对mapView进行更新
@、显示出pop:pop.setVisibility(View.VISIBLE);
②、将需要添加的条目加入到条目覆盖物中:
OverlayItem item = new OverlayItem(hmPos, "黑马训练营", "4K就业");
overlay.addItem(item);
item = new OverlayItem(new GeoPoint(latitude + 1000, longitude), "向北", "增加纬度");
overlay.addItem(item);
item = new OverlayItem(new GeoPoint(latitude, longitude + 1000), "向东", "增加经度");
overlay.addItem(item);
item = new OverlayItem(new GeoPoint(latitude - 1000, longitude - 1000), "向西南", "减少经纬度");
overlay.addItem(item);
③、将条目覆盖物添加到地图控件中:
mapView.getOverlays().add(overlay);
mapView.refresh();
2、初始化条目资源:
①、定义资源对象:View pop
②、创建对象,指定显示的资源图片,并设置显示的文本控件
pop = View.inflate(getApplicationContext(), R.layout.pop, null);
title = (TextView) pop.findViewById(R.id.title);
③、在第一次加载地图的时候,默认不显示出条目覆盖物的pop:需要设置pop隐藏:pop.setVisibility(View.INVISIBLE);
④、设置pop控件的位置参数
隐藏的pop,初始化的时候,可以不指定显示的具体位置,任意显示哪里都行:
LayoutParams params = new MapView.LayoutParams(
MapView.LayoutParams.WRAP_CONTENT,
MapView.LayoutParams.WRAP_CONTENT,
null,
MapView.LayoutParams.BOTTOM_CENTER);
⑤、加入到地图mapView控件中:
mapView.addView(pop, params);
/**
* 百度地图入门
* @author YUY
*/
public class HelloWorld extends Activity {
private static final String TAG = "HelloWorld";
private MapView mapView;
private BMapManager manager;
private MapController controller;
int latitude = (int) (40.051 * 1E6);// 纬度
int longitude = (int) (116.303 * 1E6);// 经度
protected void onCreate(android.os.Bundle savedInstanceState) {
// 到百度的服务器端检验KEY
initManager();
super.onCreate(savedInstanceState);
setContentView(R.layout.common);
init();
initController();// 管理地图
}
private void initController() {
controller = mapView.getController();
controller.setZoom(12);// 3-19
controller.enableClick(true);//控制poi是否可以被点击
}
private void initManager() {
manager = new BMapManager(getApplicationContext());
manager.init(ConstantValue.KEY, new MKGeneralListener() {
@Override
public void onGetPermissionState(int iError) {
// TODO 授权验证的状态
if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
Toast.makeText(getApplicationContext(), "验证失败", 1).show();
}
}
@Override
public void onGetNetworkState(int iError) {
// TODO 网络判断
if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
Toast.makeText(getApplicationContext(), "无网络", 1).show();
}
}
});
}
private void init() {
mapView = (MapView) findViewById(R.id.mapview);
// 添加放大和缩小的按钮
mapView.setBuiltInZoomControls(true);// 显示放大和缩小的控件
// 注册监听
mapView.regMapViewListener(manager, new MKMapViewListener() {
@Override
public void onMapMoveFinish() {}
@Override
public void onMapAnimationFinish() {}
@Override
public void onGetCurrentMap(Bitmap arg0) {}
@Override
public void onClickMapPoi(MapPoi poi) {
if (poi != null) {
Toast.makeText(getApplicationContext(), poi.strText, 0).show();
}
}
});
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_1:
// 移动
controller.animateTo(new GeoPoint(latitude, longitude));// 移动到指定的点位(地图的中心点:默认天安门)
break;
case KeyEvent.KEYCODE_2:
// 放大
controller.zoomIn();// 放大一个级别
break;
case KeyEvent.KEYCODE_3:
// 缩小
controller.zoomOut();
break;
case KeyEvent.KEYCODE_4:
// 水平方向旋转
int mapRotation = mapView.getMapRotation();// 开始旋转之前的角度
controller.setRotation(mapRotation + 30);// 设置旋转的角度
mapRotation = mapView.getMapRotation();// 转动之后的角度
Log.i(TAG, "rotation:" + mapRotation);
break;
case KeyEvent.KEYCODE_5:
// 垂直旋转
int mapOverlooking = mapView.getMapOverlooking();// 前后旋转(开始角度)
controller.setOverlooking(mapOverlooking - 5);
mapOverlooking = mapView.getMapOverlooking();
Log.i(TAG, "rotation:" + mapOverlooking);
break;
}
return super.onKeyDown(keyCode, event);
}
@Override
protected void onResume() {
mapView.onResume();
super.onResume();
}
@Override
protected void onPause() {
mapView.onPause();
super.onPause();
}
@Override
protected void onDestroy() {
mapView.destroy();
super.onDestroy();
}
}
/**
* 绘制几何图形覆盖物
* @author YUY
*/
public class GraphicsOverlayDemo extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
overlay();
}
private void overlay() {
// 几何图形的绘制——点、线、面
// 获取到覆盖物的集合
List<Overlay> overlays = mapView.getOverlays();
// 定义自己的覆盖物
GraphicsOverlay overlay = new GraphicsOverlay(mapView);
// 注意:覆盖物的数据设置
setData(overlay);
// 添加到集合中
overlays.add(overlay);
// 界面刷新
mapView.refresh();
}
private void setData(GraphicsOverlay overlay) {
// 几何元素
Geometry geometry = new Geometry();
geometry.setCircle(hmPos, 1000);// 圆
// 设置圆的样式
Symbol symbol = new Symbol();
Color color = symbol.new Color();
color.red = 255;
color.green = 0;
color.blue = 0;
color.alpha = 100;
symbol.setSurface(color, 1, 0);
Graphic graphic = new Graphic(geometry, symbol);
overlay.setData(graphic);
}
}
/**
* 文字覆盖物
* @author YUY
*
*/
public class TextOverlayDemo extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
overlay();
}
private void overlay() {
TextOverlay overlay=new TextOverlay(mapView);
//设置数据
setData(overlay);
mapView.getOverlays().add(overlay);
mapView.refresh();
}
private void setData(TextOverlay overlay) {
TextItem item=new TextItem();
item.fontColor=getColor();
item.fontSize=20;
itemNaN=hmPos;
item.text="黑马训练营";
item.align=TextItem.ALIGN_CENTER;
overlay.addText(item);
}
private Color getColor() {
Symbol symbol=new Symbol();
Color color=symbol.new Color();
color.red = 255;
color.green = 0;
color.blue = 0;
color.alpha = 100;
return color;
}
}
/**
* 分条目覆盖物
* @author YUY
*
*/
public class ItemizedOverlayDemo extends BaseActivity {
private View pop;
private TextView title;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
controller.setZoom(18);
overlay();
initPop();
}
private void initPop() {
pop = View.inflate(getApplicationContext(), R.layout.pop, null);
title = (TextView) pop.findViewById(R.id.title);
pop.setVisibility(View.INVISIBLE);
LayoutParams params = new MapView.LayoutParams(MapView.LayoutParams.WRAP_CONTENT, MapView.LayoutParams.WRAP_CONTENT,
null, MapView.LayoutParams.BOTTOM_CENTER);
mapView.addView(pop, params);
}
private void overlay() {
ItemizedOverlay<OverlayItem> overlay = new ItemizedOverlay<OverlayItem>(getResources().getDrawable(R.drawable.eat_icon),
mapView) {
@Override
protected boolean onTap(int index) {
OverlayItem item = getItem(index);
// item.getTitle();
// Toast.makeText(getApplicationContext(), item.getTitle(), 1).show();
title.setText(item.getTitle());
pop.setVisibility(View.INVISIBLE);// 第二次点击
LayoutParams params = new MapView.LayoutParams(MapView.LayoutParams.WRAP_CONTENT,
MapView.LayoutParams.WRAP_CONTENT, item.getPoint(), MapView.LayoutParams.BOTTOM_CENTER);
mapView.updateViewLayout(pop, params);
pop.setVisibility(View.VISIBLE);
return super.onTap(index);
}
};
OverlayItem item = new OverlayItem(hmPos, "黑马训练营", "4K就业");
overlay.addItem(item);
item = new OverlayItem(new GeoPoint(latitude + 1000, longitude), "向北", "增加纬度");
overlay.addItem(item);
item = new OverlayItem(new GeoPoint(latitude, longitude + 1000), "向东", "增加经度");
overlay.addItem(item);
item = new OverlayItem(new GeoPoint(latitude - 1000, longitude - 1000), "向西南", "减少经纬度");
overlay.addItem(item);
mapView.getOverlays().add(overlay);
mapView.refresh();
}
}
本文出自 “苗振忠” 博客,请务必保留此出处http://miaozhenzhong.blog.51cto.com/11277456/1847075
原文地址:http://miaozhenzhong.blog.51cto.com/11277456/1847075