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

来源:互联网 发布:手机信号增强软件 编辑:程序博客网 时间:2024/06/11 23:21

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

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;@Overrideprotected 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();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}// 存储地址信息private Map<String, Object> resultMap = new HashMap<String, Object>();@Overridepublic 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);}@Overridepublic void onGeoCodeResult(Map<String, Object> map) {Log.i("data", "result====>" + map.toString());}@Overridepublic 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 覆盖物以及 InfoWindowmBaiduMap.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() {@Overridepublic 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,用于在地图上添加MarkerOverlayOptions 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() {@Overridepublic boolean onMarkerClick(Marker marker) {// 创建InfoWindow展示的viewTextView 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);// 显示InfoWindowmBaiduMap.showInfoWindow(mInfoWindow);return false;}};@Overrideprotected void onDestroy() {super.onDestroy();// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理mMapView.onDestroy();}@Overrideprotected void onResume() {super.onResume();// 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理mMapView.onResume();}@Overrideprotected 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->{

  • MapStatus
  • MapStatus.Builder
  • MapStatusUpdate
  • MapStatusUpdateFactory
}
这四个类可以好好研究一下(如果有兴趣的好)

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

  • BaiduMap
  • BaiduMapOptions
  • BitmapDescriptor
  • BitmapDescriptorFactory

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

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 0
原创粉丝点击