首页 > 代码库 > 百度地图(1)

百度地图(1)

一、简介百度地图API

1、简介:

百度地图移动版API(Android)是一套基于Android设备的应用程序接口,通过该接口,可以轻松访问百度服务和数据,构建功能丰富、交互性强的地图应用程序

2、功能:

百度地图移动版API不仅包含构建地图的基本接口,还提供了本地搜索、路线规划、地图定位等数据服务。

 

辅助内容:如何把地图展示出来,构建构建功能丰富、交互性强的地图应用程序

 

3、三大核心类:

BmapManagerMapView MapController

1BmapManager

百度地图的管理工具,可以看成是地图的引擎管理工具

验证申请的KEY


2)MapView

从布局文件中找到指定的控件mapView

控制onPause;onResumeonDestroy方法,伴随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.jarlocSDK_3.1.jar

添加.so文件:拷贝libapp_BaiduMapApplib_v2_1_2.soliblocSDK3.solibvi_voslib.solibs\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() {

实现其中的两个方法:

①、授权验证的状态:失败的失败码iError300

②、网络判断:失败了返回的iError2

 

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)控制MapViewonResumeonPausedestroy

实现Activity的onResumeonPause还有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();

&设置colorRGB及透明度,并将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进行更新

@、显示出poppop.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

百度地图(1)