Android百度地图之普通地图使用<V3.2.0>

继定位与地理编码和反地理编码推出后,小编觉得把普通地图的一些功能再记录一次。

SDK是最新的V3.2.0,当然了,也使用了定位SDK的。

需求:定位->显示到地图上->关键词搜索->地图上显示->点击显示的图标,弹出pop提示

有图有真相:(虽然有点丑,将就一下下哈)




当然了,本次的所有功能就如上图

要使用到这里的定位:Android百度地图使用之定位和地理、反地理编码<基于定位SDK4.2>

将LocationUtils中的接口:OnResultMapListener增添了回调方法:

/**
		 * 地理信息地址回传
		 * 
		 * @param map
		 */
		public void onResult(Map<String, Object> map);

在LocationUtils的实现接口方法:onResultData中调用:

// 如果没有获取到
		if (!map.keySet().contains("address")) {
			// 传入经纬度
			getAddress(Double.parseDouble(map.get("latitude").toString()),
					Double.parseDouble(map.get("longitude").toString()));
		} else {
			if (mOnResultMapListener != null) {
				mOnResultMapListener.onResult(map);
			}
		}

只是在else中修改了回调方法,其余没有什么多的操作。

那么,看重点,我就直接上代码了

package com.napoleonbai.baidu_map;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;
import android.widget.Toast;

import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;
import com.baidu.mapapi.map.BaiduMap.OnMyLocationClickListener;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
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.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiCitySearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiNearbySearchOption;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
import com.napoleonbai.baidu_map.LocationUtils.OnResultMapListener;

/**
 * 此类提供测试,没有其他作用
 * 
 * @author NapoleonBai
 *
 */
public class MainActivity extends Activity implements OnResultMapListener {

	private LocationUtils mLocationUtils;
	private MapView mMapView = null;
	private BaiduMap mBaiduMap;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 初始化地图SDK<最好放置在Application中>
		SDKInitializer.initialize(getApplicationContext());
		// 创建定位管理信息对象
		mLocationUtils = new LocationUtils(getApplicationContext());
		setContentView(R.layout.activity_main);
		// 开启定位
		mLocationUtils.startLocation();
		mLocationUtils.registerOnResult(this);

		// mLocationUtils.getLocation("广安", "邓小平故居");
		initMapView();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	// 存储地址信息
	private Map<String, Object> resultMap = new HashMap<String, Object>();

	@Override
	public void onReverseGeoCodeResult(Map<String, Object> map) {
		Log.i("data", "result====>" + map.toString());
		resultMap = map;
		showLocationOverlay(
				Double.parseDouble(map.get("latitude").toString()),
				Double.parseDouble(map.get("longitude").toString()),
				map.keySet().contains("accuracy") ? Float.parseFloat(map.get(
						"accuracy").toString()) : 70);
	}

	@Override
	public void onGeoCodeResult(Map<String, Object> map) {
		Log.i("data", "result====>" + map.toString());

	}

	@Override
	public void onResult(Map<String, Object> map) {
		resultMap = map;
		showLocationOverlay(
				Double.parseDouble(map.get("latitude").toString()),
				Double.parseDouble(map.get("longitude").toString()),
				map.keySet().contains("accuracy") ? Float.parseFloat(map.get(
						"accuracy").toString()) : 70);
	}

	/**
	 * 初始化布局视图
	 */
	private void initMapView() {
		// 获取地图控件引用
		mMapView = (MapView) findViewById(R.id.bmapView);
		// 获取百度Map对象
		mBaiduMap = mMapView.getMap();
		mBaiduMap.setBuildingsEnabled(true);
		mBaiduMap.setMyLocationEnabled(true);
		// 普通地图
		mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
	}

	/**
	 * 设置定位图层
	 */
	private void showLocationOverlay(double latitude, double longitude,
			float accuracy) {
		currentLatLng = new LatLng(latitude, longitude);

		// 清空地图所有的 Overlay 覆盖物以及 InfoWindow
		mBaiduMap.clear();
		// 配置定位图层显示方式 false是不允许显示方向信息,然后自定义了一个显示图标
		if (mMyLocationConfiguration == null) {
			mMyLocationConfiguration = new MyLocationConfiguration(
					MyLocationConfiguration.LocationMode.FOLLOWING, false,
					BitmapDescriptorFactory
							.fromResource(R.drawable.ic_launcher));
		}
		// 设置定位坐标及精度信息
		locData = new MyLocationData.Builder().accuracy(accuracy)
				.latitude(latitude).longitude(longitude).build();
		// 设置配置信息
		mBaiduMap.setMyLocationConfigeration(mMyLocationConfiguration);
		// 设置定位数据
		mBaiduMap.setMyLocationData(locData);
		// 设置定位图标点击事件
		mBaiduMap.setOnMyLocationClickListener(mOnMyLocationClickListener);
		// 设置Marker点击监听
		mBaiduMap.setOnMarkerClickListener(mOnMarkerClickListener);
	}

	// 定位图层显示方式配置对象
	private MyLocationConfiguration mMyLocationConfiguration;

	// 定位信息设置对象
	private MyLocationData locData;

	/**
	 * 定位图标点击事件
	 */
	private OnMyLocationClickListener mOnMyLocationClickListener = new OnMyLocationClickListener() {
		@Override
		public boolean onMyLocationClick() {
			Toast.makeText(MainActivity.this,
					"地址:" + resultMap.get("address").toString(),
					Toast.LENGTH_SHORT).show();
			// 这里实现关键词搜索
			search("", "复旦大学");
			return false;
		}
	};

	/* ===============================检索========================= */

	private PoiSearch mPoiSearch;

	/**
	 * 执行搜索时调用方法,城市名称可以为null,那么这样就执行的是周边搜索,就是以当前位置进行的周边搜索
	 * 
	 * @param city
	 *            城市名称
	 * @param keyWord
	 *            关键词
	 */
	private void search(String city, String keyWord) {
		// 如果关键词为空,直接提示不执行
		if (TextUtils.isEmpty(keyWord)) {
			Toast.makeText(MainActivity.this, "请完整搜索信息", Toast.LENGTH_SHORT)
					.show();
			return;
		}
		// 获取热点检索对象
		mPoiSearch = PoiSearch.newInstance();
		if (TextUtils.isEmpty(city)) {
			PoiNearbySearchOption mPoiNearbySearchOption = new PoiNearbySearchOption();
			mPoiNearbySearchOption.keyword(keyWord);
			// 设置中心坐标为当前位置
			mPoiNearbySearchOption.location(currentLatLng);
			mPoiNearbySearchOption.radius(100000);// 半径设置为10WM
			// 设置周边搜索
			mPoiSearch.searchNearby(mPoiNearbySearchOption);

		} else {
			// 进行热点搜索,需要城市和关键词
			mPoiSearch.searchInCity((new PoiCitySearchOption()).city(city)
					.keyword(keyWord).pageNum(30));
		}
		// 设置监听对象
		mPoiSearch.setOnGetPoiSearchResultListener(poiListener);

	}

	// 当前坐标信息
	private LatLng currentLatLng;
	// 搜索结果
	private List<PoiInfo> searchDatas = new ArrayList<PoiInfo>();

	/**
	 * 检索结果监听
	 */
	OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {
		public void onGetPoiResult(PoiResult result) {
			if (result.getAllPoi() == null) {
				Toast.makeText(MainActivity.this, "没有结果", Toast.LENGTH_SHORT)
						.show();
				return;
			}
			searchDatas = result.getAllPoi();
			drawMarker();
		}

		public void onGetPoiDetailResult(PoiDetailResult result) {
			// 获取Place详情页检索结果
		}
	};

	/* ======================绘制图标============================== */
	private void drawMarker() {
		// 清除所有图层
		mBaiduMap.clear();
		// 获取POI检索结果
		for (int i = 0; i < searchDatas.size(); i++) {
			Log.i("data", searchDatas.get(i).address + searchDatas.get(i).name);
			// 定义Maker坐标点
			LatLng point = new LatLng(searchDatas.get(i).location.latitude,
					searchDatas.get(i).location.longitude);
			if (i == 0) {
				// 如果是第一个点,那么就设置为地图的中心点位置
				// 1.
				// 通过构造器得到地图状态对象,并进行中心坐标设置,传入mBaiduMap.getMapStatus()是以之前的地图状态为基础。

				MapStatus mMapStatus = new MapStatus.Builder(
						mBaiduMap.getMapStatus()).target(point).build();
				// 设置地图状态将要发生的变化
				MapStatusUpdate mMapStatusUpdate1 = MapStatusUpdateFactory
						.newMapStatus(mMapStatus);
				// 改变地图状态
				mBaiduMap.setMapStatus(mMapStatusUpdate1);
<span style="white-space:pre">				</span>/*
				// 2.直接通过MapStatusUpdate设置新的中心点
				MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory
						.newLatLng(point);
				// 以动画方式改变地图状态,300毫秒
				mBaiduMap.animateMapStatus(mMapStatusUpdate);
<span style="white-space:pre">				</span>*/
			}

			// 构建Marker图标
			BitmapDescriptor bitmap = BitmapDescriptorFactory
					.fromResource(R.drawable.ic_launcher);

			// 构建MarkerOption,用于在地图上添加Marker
			OverlayOptions option = new MarkerOptions().position(point).icon(
					bitmap);
			// 在地图上添加Marker,并显示
			Marker marker = (Marker) mBaiduMap.addOverlay(option);
			// 设置Marker的title,这里采用address和name的形式
			marker.setTitle(searchDatas.get(i).address
					+ searchDatas.get(i).name);
		}
	}

	/**
	 * Marker点击事件监听
	 */
	private OnMarkerClickListener mOnMarkerClickListener = new OnMarkerClickListener() {

		@Override
		public boolean onMarkerClick(Marker marker) {
			// 创建InfoWindow展示的view
			TextView textview = new TextView(getApplicationContext());
			textview.setBackgroundColor(Color.YELLOW);
			textview.setMaxEms(15);
			textview.setPadding(5, 5, 5, 5);
			textview.setTextColor(Color.RED);
			textview.setText(marker.getTitle());
			// 定义用于显示该InfoWindow的坐标点
			LatLng pt = new LatLng(marker.getPosition().latitude,
					marker.getPosition().longitude);
			// 创建InfoWindow , 传入 view, 地理坐标, y 轴偏移量
			InfoWindow mInfoWindow = new InfoWindow(textview, pt, -47);
			// 显示InfoWindow
			mBaiduMap.showInfoWindow(mInfoWindow);
			return false;
		}
	};

	@Override
	protected void onDestroy() {
		super.onDestroy();
		// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
		mMapView.onDestroy();
	}

	@Override
	protected void onResume() {
		super.onResume();
		// 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
		mMapView.onResume();
	}

	@Override
	protected void onPause() {
		super.onPause();
		// 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
		mMapView.onPause();

	}

}

这个类,就实现了所有功能,当然,如果想要设置指定坐标为地图中心点,那么如代码中的:

// 如果是第一个点,那么就设置为地图的中心点位置
// 1.
// 通过构造器得到地图状态对象,并进行中心坐标设置,传入mBaiduMap.getMapStatus()是以之前的地图状态为基础。

MapStatus mMapStatus = new MapStatus.Builder(
						mBaiduMap.getMapStatus()).target(point).build();
// 设置地图状态将要发生的变化
MapStatusUpdate mMapStatusUpdate1 = MapStatusUpdateFactory.newMapStatus(mMapStatus);
// 改变地图状态
mBaiduMap.setMapStatus(mMapStatusUpdate1);

// 2.直接通过MapStatusUpdate设置新的中心点
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newLatLng(point);
// 以动画方式改变地图状态,300毫秒
mBaiduMap.animateMapStatus(mMapStatusUpdate);
这里提供了这两种方式来进行设置

关于这个可以怎么设置,参考文档在这里:http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v3_2_0/->com.baidu.mapapi.map->{

}
这四个类可以好好研究一下(如果有兴趣的好)

然后就是BaiduMap相关类,在同一个包下

这里可是包含了地图的很多设置哟,比如:

voidaddHeatMap(HeatMap heatmap)
添加热力图
OverlayaddOverlay(OverlayOptions options)
向地图添加一个 Overlay
voidanimateMapStatus(MapStatusUpdate update)
以动画方式更新地图状态,动画耗时 300 ms
voidanimateMapStatus(MapStatusUpdate update, int durationMs)
以动画方式更新地图状态
voidclear()
清空地图所有的 Overlay 覆盖物以及 InfoWindow
MyLocationConfigurationgetLocationConfigeration()
获取定位图层配置信息
MyLocationDatagetLocationData()
获取定位数据
MapStatusgetMapStatus()
获取地图的当前状态
intgetMapType()
获取地图当前的模式,普通地图或者卫星图
floatgetMaxZoomLevel()
获取地图最大缩放级别
floatgetMinZoomLevel()
获取地图最小缩放级别
ProjectiongetProjection()
获取地图投影坐标转换器, 当地图初始化完成之前返回 null,在 OnMapLoadedCallback.onMapLoaded() 之后才能正常
UiSettingsgetUiSettings()
获取地图ui控制器
voidhideInfoWindow()
隐藏当前 InfoWindow
booleanisBaiduHeatMapEnabled()
获取是否打开百度热力图层(百度自有数据图层)
booleanisBuildingsEnabled()
获取是否允许楼块效果
booleanisMyLocationEnabled()
获取是否允许定位图层
booleanisSupportBaiduHeatMap()
查询当前图区是否支持百度热力图
booleanisTrafficEnabled()
获取是否打开交通图层
voidsetBaiduHeatMapEnabled(boolean enabled)
设置是否打开百度热力图图层(百度自有数据图层) 注:地图层级大于11时,可显示热力图
voidsetBuildingsEnabled(boolean enabled)
设置是否允许楼块效果
voidsetMapStatus(MapStatusUpdate update)
改变地图状态
voidsetMapType(int type)
设置地图类型 MAP_TYPE_NORMAL 普通图; MAP_TYPE_SATELLITE 卫星图
voidsetMaxAndMinZoomLevel(float max, float min)
设置地图最大以及最小缩放级别,地图支持的最大最小级别分别为[3-19]
voidsetMyLocationConfigeration(MyLocationConfiguration configeration)
设置定位图层配置信息,只有先允许定位图层后设置定位图层配置信息才会生效,参见 setMyLocationEnabled(boolean)
voidsetMyLocationData(MyLocationData data)
设置定位数据, 只有先允许定位图层后设置数据才会生效,参见 setMyLocationEnabled(boolean)
voidsetMyLocationEnabled(boolean enabled)
设置是否允许定位图层
voidsetOnMapClickListener(BaiduMap.OnMapClickListener listener)
设置地图单击事件监听者
voidsetOnMapDoubleClickListener(BaiduMap.OnMapDoubleClickListener listener)
设置地图双击事件监听者
voidsetOnMapDrawFrameCallback(BaiduMap.OnMapDrawFrameCallback callback)
设置百度地图在每一帧绘制时的回调接口,该接口在绘制线程中调用
voidsetOnMapLoadedCallback(BaiduMap.OnMapLoadedCallback callback)
设置地图加载完成回调
voidsetOnMapLongClickListener(BaiduMap.OnMapLongClickListener listener)
设置地图长按事件监听者
voidsetOnMapStatusChangeListener(BaiduMap.OnMapStatusChangeListener listener)
设置地图状态监听者
voidsetOnMarkerClickListener(BaiduMap.OnMarkerClickListener listener)
设置地图 Marker 覆盖物点击事件监听者
voidsetOnMarkerDragListener(BaiduMap.OnMarkerDragListener listener)
设置 Marker 拖拽事件监听者
voidsetOnMyLocationClickListener(BaiduMap.OnMyLocationClickListener listener)
设置定位图标点击事件监听者
voidsetTrafficEnabled(boolean enabled)
设置是否打开交通图层
voidshowInfoWindow(InfoWindow infoWindow)
显示 InfoWindow
voidsnapshot(BaiduMap.SnapshotReadyCallback callback)
发起截图请求
这只是BaiduMap类的一小部分,大家可以移步到API中细看

PS:大神可以直接无视


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值