继定位与地理编码和反地理编码推出后,小编觉得把普通地图的一些功能再记录一次。
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相关类,在同一个包下
这里可是包含了地图的很多设置哟,比如:
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)
发起截图请求
|
PS:大神可以直接无视