220.map2-百度地图api使用

Layout中添加MapView控件用于展示地图

布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
	<!-- 地图的布局 -->
	<com.baidu.mapapi.map.MapView 
	    android:id="@+id/mapview"
	    android:layout_width="wrap_content"
    	android:layout_height="wrap_content"
	    />
</RelativeLayout>
是setContentView之前创建管理工具,并初使化SDKInitializer在initialize时校验key(permission check error)和网络状态(network error),关于状态码信息我们可以在SDKInitializer查询。

需要注意的是:

1.控制MapView的onResume、onPause、onDestroy ;百度地图的生命周期方法
2.SDKInitializer对象创建一个就可以;
3.必须校验key,并且key值不能为空;
4.Initialize方法接受的参数必须是global Application,不能传递Activity

IntentFilter filter = new IntentFilter();
filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);
filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);
registerReceiver(receiver, filter);

public void onReceive(Context context, Intent intent) {
String result = intent.getAction();
// 判断网络
if (result
.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {
Toast.makeText(getApplicationContext(), "无网络", 0).show();
}
// 授权验证
else if (result
.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {
Toast.makeText(getApplicationContext(), "授权失败", 0).show();
}
}
百度地图的控制管理

通过MapView设置缩放控件showZoomControls(false),默认显示
缩放级别:V2.0之前支持(3-18),V2.0之后多一级(3-19)
默认的缩放级别 12
设置地图的中心位置

BaiduMap baiduMap = mapView.getMap();
double latitude = 123.0432;//纬度
double longitude = 34.438;//经度
LatLng hmPos = new LatLng(latitude, longitude);
BaiduMap:控制地图移动、缩放、旋转
动画形式移动 :animateMapStatus(MapStatusUpdate)
缩放:MapStatusUpdateFactory:
zoomOut()—缩小;zoomIn()—放大;zoomTo (float)—指 定缩放级别;zoomBy(float) —按增量缩放级别;
旋转:MapStatus
水平方向:rotate(float),旋转角范围: 0 ~ 360 , 单位:度   默认值为0度,逆时针旋转为角度增大方向,通过BaiduMap的getMapStatus() .rotate获取当前角度
俯视: overlook(float) ,俯角范围:  -45 ~ 0 , 单位: 度

指南针设置:UiSettings().setCompassPosition(new Point(x, y)),坐标系原点为MapView左上顶点 ,指南针在3D模式下自动显现,隐藏指南针UiSettings().setCompassEnabled(false)

BaiduMap :处理地图事件

setOnMapClickListener(BaiduMap.OnMapClickListener listener)设置地图单击事件监听者

setOnMarkerClickListener(BaiduMap.OnMarkerClickListener listener)设置地图 Marker 覆盖物点击事件监听者

setOnMapDoubleClickListener(BaiduMap.OnMapDoubleClickListener listener)设置地图双击事件监听者

snapshot(BaiduMap.SnapshotReadyCallback callback)发起截图请求

需要引入包


需要添加权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ldw.zbqq"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <!-- 这个权限用于进行网络定位 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
    </uses-permission>
    <!-- 这个权限用于访问GPS定位 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
    </uses-permission>
    <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
    </uses-permission>
    <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
    </uses-permission>
    <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
    </uses-permission>
    <!-- 用于读取手机当前的状态 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" >
    </uses-permission>
    <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
    </uses-permission>
    <!-- 访问网络,网络定位需要上网 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- SD卡读取权限,用户写入离线定位数据 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" >
    </uses-permission>
    <!-- 允许应用读取低级别的系统日志文件 -->
    <uses-permission android:name="android.permission.READ_LOGS" >
    </uses-permission>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="HmmKW1mdCYxAqGTzZVjwFov3wjaw5jwt" />
        <activity
            android:name="com.ldw.zbqq.HelloWord"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Hello.java

package com.ldw.zbqq;

import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.model.LatLng;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.Toast;

public class HelloWord extends Activity {

	private MyBaduSdkReceiver baduSdkReceiver;
	private MapView mapview;
	private BaiduMap baiduMap;
	private double latitude = 23;// 纬度
	private double longitude = 114;// 经度
	private LatLng hmPos = new LatLng(latitude, longitude);//创建一个经纬度
	private static final String TAG = "HelloWorld";

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // 初始化地图
     	initManager();
     	setContentView(R.layout.common);
     	init();
        
    }

	//使用MapStatusUpdate修改地图的状态
	private void init() {
		// 设置地图级别(V2.X 3-19级 V1.X 3-18)
		// ① 修改了文件的格式 优化了空间的使用(北京 110M 15M)
		// ② 增加了级别 3D效果(18 19级的时候可以显示)
		
		mapview = (MapView) findViewById(R.id.mapview);

		//获取到地图控制器
		baiduMap = mapview.getMap();
		// BaiduMap: 管理具体的某一个MapView : 旋转,移动,缩放,事件。。
		
		// 描述地图状态将要发生的变化 使用工厂类MapStatusUpdateFactory创建
		MapStatusUpdate mapstatusUpdate = MapStatusUpdateFactory.zoomTo(19);// 默认的级别12
		// 设置缩放级别
		baiduMap.setMapStatus(mapstatusUpdate);
		
		//LatLng latlng = new LatLng(arg0, arg1);// 坐标 经纬度 参数1 纬度 参数2 经度
		MapStatusUpdate mapstatusUpdatePoint = MapStatusUpdateFactory
				.newLatLng(hmPos);
		// 设置中心点 默认是天安门
		baiduMap.setMapStatus(mapstatusUpdatePoint);
		
		// mapview.showZoomControls(false);// 默认是true 显示缩放按钮
		//
		// mapview.showScaleControl(false);// 默认是true 显示比例尺
		
	}
	
	//按不同的按键调用不同的方法,都使用MapStatusUpdate修改地图的状态
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// 旋转,移动,缩放
		switch (keyCode) {
		case KeyEvent.KEYCODE_1:
			// 放大
			// 放大地图缩放级别 每次放大一个级别
			MapStatusUpdate zoomInStatus = MapStatusUpdateFactory.zoomIn();
			baiduMap.setMapStatus(zoomInStatus);
			break;
		case KeyEvent.KEYCODE_2:
			// 缩小
			// 缩小地图缩放级别 每次缩小一个级别
			MapStatusUpdate zooOutStatus = MapStatusUpdateFactory.zoomOut();
			baiduMap.setMapStatus(zooOutStatus);
			break;
		case KeyEvent.KEYCODE_3:
			// 以一个点为中心 旋转
			MapStatus mapStatus = baiduMap.getMapStatus();// 获取地图的当前状态
			float rotate = mapStatus.rotate;
			Log.d(TAG, "rotate:" + rotate);
			// 旋转 范围0~360
			MapStatus rotateStatus = new  MapStatus.Builder().rotate(rotate+30).build();
			// 创建新的MapStatus
			MapStatusUpdate rotateStatusUpdate = MapStatusUpdateFactory.newMapStatus(rotateStatus);
			baiduMap.setMapStatus(rotateStatusUpdate);
			
			break;
		case KeyEvent.KEYCODE_4:
			// 已一条直线 为轴 旋转 Overlooking 俯角
			MapStatus mapStatusOver = baiduMap.getMapStatus();// 获取地图的当前状态
			float overlook = mapStatusOver.overlook;
			Log.d(TAG, "overlook:" + overlook);
			// 0~45
			MapStatus overStatus = new MapStatus.Builder().overlook(overlook-5).build();
			//创建新的MapStatus
			MapStatusUpdate overStatusUpdate = MapStatusUpdateFactory.newMapStatus(overStatus);
			baiduMap.setMapStatus(overStatusUpdate);
			break;
		case KeyEvent.KEYCODE_5:
			// 移动
			MapStatusUpdate moveStatusUpdate = MapStatusUpdateFactory.newLatLng(new LatLng(40.065796,116.349868));
			// 带动画的更新地图状态 耗时300毫秒
			baiduMap.animateMapStatus(moveStatusUpdate);
			break;

		default:
			break;
		}
		return super.onKeyDown(keyCode, event);
	}

	private void initManager() {
		//必须先初始化
        SDKInitializer.initialize(getApplicationContext()); // 不能传递Activity,必须是全局Context
        baduSdkReceiver = new MyBaduSdkReceiver();
        //添加filter
        IntentFilter filter = new IntentFilter();
		filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);// 注册网络错误
		filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR); // 注册key校验结果
		registerReceiver(baduSdkReceiver, filter);
	}
	
	//调用百度地图的生命周期方法
	@Override
	protected void onResume() {
		mapview.onResume();
		super.onResume();
	}

	//调用百度地图的生命周期方法
	@Override
	protected void onPause() {
		mapview.onPause();
		super.onPause();
	}
	
	//销毁广播并调用百度地图的生命周期方法
	@Override
	protected void onDestroy() {
		unregisterReceiver(baduSdkReceiver);
		mapview.onDestroy();
		super.onDestroy();
	}
	
	//注册一个广播
	class MyBaduSdkReceiver extends BroadcastReceiver {

		@Override
		public void onReceive(Context context, Intent intent) {
			String result = intent.getAction();
			if (result.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {
				// 网络错误
				Toast.makeText(getApplicationContext(), "无网络", 0).show();
			} else if (result.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {
				// key校验失败
				Toast.makeText(getApplicationContext(), "校验失败", 0).show();
			}
			
		}
		
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值