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
这里可是包含了地图的很多设置哟,比如:
void
addHeatMap(HeatMap heatmap)
添加热力图
Overlay
addOverlay(OverlayOptions options)
向地图添加一个 Overlay
void
animateMapStatus(MapStatusUpdate update)
以动画方式更新地图状态,动画耗时 300 ms
void
animateMapStatus(MapStatusUpdate update, int durationMs)
以动画方式更新地图状态
void
clear()
清空地图所有的 Overlay 覆盖物以及 InfoWindow
MyLocationConfiguration
getLocationConfigeration()
获取定位图层配置信息
MyLocationData
getLocationData()
获取定位数据
MapStatus
getMapStatus()
获取地图的当前状态
int
getMapType()
获取地图当前的模式,普通地图或者卫星图
float
getMaxZoomLevel()
获取地图最大缩放级别
float
getMinZoomLevel()
获取地图最小缩放级别
Projection
getProjection()
获取地图投影坐标转换器, 当地图初始化完成之前返回 null,在 OnMapLoadedCallback.onMapLoaded() 之后才能正常
UiSettings
getUiSettings()
获取地图ui控制器
void
hideInfoWindow()
隐藏当前 InfoWindow
boolean
isBaiduHeatMapEnabled()
获取是否打开百度热力图层(百度自有数据图层)
boolean
isBuildingsEnabled()
获取是否允许楼块效果
boolean
isMyLocationEnabled()
获取是否允许定位图层
boolean
isSupportBaiduHeatMap()
查询当前图区是否支持百度热力图
boolean
isTrafficEnabled()
获取是否打开交通图层
void
setBaiduHeatMapEnabled(boolean enabled)
设置是否打开百度热力图图层(百度自有数据图层) 注:地图层级大于11时,可显示热力图
void
setBuildingsEnabled(boolean enabled)
设置是否允许楼块效果
void
setMapStatus(MapStatusUpdate update)
改变地图状态
void
setMapType(int type)
设置地图类型
MAP_TYPE_NORMAL
普通图; MAP_TYPE_SATELLITE
卫星图void
setMaxAndMinZoomLevel(float max, float min)
设置地图最大以及最小缩放级别,地图支持的最大最小级别分别为[3-19]
void
setMyLocationConfigeration(MyLocationConfiguration configeration)
设置定位图层配置信息,只有先允许定位图层后设置定位图层配置信息才会生效,参见 setMyLocationEnabled(boolean)
void
setMyLocationData(MyLocationData data)
设置定位数据, 只有先允许定位图层后设置数据才会生效,参见 setMyLocationEnabled(boolean)
void
setMyLocationEnabled(boolean enabled)
设置是否允许定位图层
void
setOnMapClickListener(BaiduMap.OnMapClickListener listener)
设置地图单击事件监听者
void
setOnMapDoubleClickListener(BaiduMap.OnMapDoubleClickListener listener)
设置地图双击事件监听者
void
setOnMapDrawFrameCallback(BaiduMap.OnMapDrawFrameCallback callback)
设置百度地图在每一帧绘制时的回调接口,该接口在绘制线程中调用
void
setOnMapLoadedCallback(BaiduMap.OnMapLoadedCallback callback)
设置地图加载完成回调
void
setOnMapLongClickListener(BaiduMap.OnMapLongClickListener listener)
设置地图长按事件监听者
void
setOnMapStatusChangeListener(BaiduMap.OnMapStatusChangeListener listener)
设置地图状态监听者
void
setOnMarkerClickListener(BaiduMap.OnMarkerClickListener listener)
设置地图 Marker 覆盖物点击事件监听者
void
setOnMarkerDragListener(BaiduMap.OnMarkerDragListener listener)
设置 Marker 拖拽事件监听者
void
setOnMyLocationClickListener(BaiduMap.OnMyLocationClickListener listener)
设置定位图标点击事件监听者
void
setTrafficEnabled(boolean enabled)
设置是否打开交通图层
void
showInfoWindow(InfoWindow infoWindow)
显示 InfoWindow
void
snapshot(BaiduMap.SnapshotReadyCallback callback)
发起截图请求
这只是BaiduMap类的一小部分,大家可以移步到API中细看PS:大神可以直接无视
0 0
- Android百度地图之普通地图使用<V3.2.0>
- Android中级篇之百度地图SDK v3.5.0-基础地图[图解百度地图基础教程]
- android百度地图:卫星地图普通地图交通地图切换
- Android中级篇之百度地图SDK v3.5.0-Hello BaiduMap[图解第一次运行百度地图]
- 百度地图 Android SDK - 新版本(v3.2.0)正式上线
- android 百度地图v3.2.0获取实际地址
- android百度地图 SDK v3.5.0
- Android 百度地图 SDK v3.0.0
- Android中级篇之百度地图SDK v3.5.0-FragmentMap地图框架[图解SupportMapFragment类]
- android 之 百度地图
- Android百度地图使用
- Android百度地图使用
- Android百度地图使用
- Android 百度地图使用
- android开发之学会使用百度地图
- Android百度地图使用之定位
- Android中级篇之百度地图SDK v3.5.0-百度地图定位[超详细图解定位基础]
- Android中级篇之百度地图SDK v3.5.0-百度地图定位[超详细图解定位基础]
- 初探页面布局
- 创建虚拟目录
- 译 Programming with typesafe enums and annotations in Java 5
- fork vfork clone区别
- cocos2dx-3.0的开发准备
- Android百度地图之普通地图使用<V3.2.0>
- Linux 系统下运行 Windows程序
- 物业部年终总结金融年终总结范文
- Notification中使用TaskStackBuilder
- 自己在VB编程过程中遇到的--不能加载MSCOMCTL.OCX提示
- 同步IO和异步IO
- Android中Parcelable接口用法
- ML—方差分析的思考
- 查询指定sequence的当前值 oracle