您的位置:首页 > 其它

百度地图工具类封装(包括定位,附近、城市、范围poi检索,反地理编码)

2015-11-19 20:30 567 查看
百度key的申请在此就不多说了.

在应用Application中的onCreate()方法中初始化百度地图sdk各组件

//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());


核心代码(主要包含各个功能初始化及初始化后功能调用方法)

public class BDMapManager implements OnMapClickListener, BDLocationListener,
OnGetGeoCoderResultListener, OnGetPoiSearchResultListener {
private BaiduMap mBaiduMap;
private MapView mapView;
private Context context;
public LocationClient mLocationClient;
private Vibrator mVibrator;
private LocationClientOption clientOption;
private BDMapResultInternet bdMapResult;
// 定位参数
private LocationMode tempMode = LocationMode.Hight_Accuracy;
private String tempcoor = "bd09ll";
private GeoCoder geoCoder;
private List<PoiInfo> poilist;
private LatLng point;
private ReverseGeoCodeOption codeOption;
private PoiSearch mPoiSearch;

/**
* 构造函数
*
* @param context
*            上下文对象
* @param mapView
*            百度地图显示控件
*/
public BDMapManager(Context context, MapView mapView,
BDMapResultInternet bdMapResult) {
this.mapView = mapView;
this.mBaiduMap = mapView.getMap();
this.context = context;
this.bdMapResult = bdMapResult;
}

/**
* 设置百度地图响应地图上poi点点击
*/
public void setMapPoiChickListener() {
mBaiduMap.setOnMapClickListener(this);
}

/**
*
* @return 返回初始化完成后的BaiduMap
*/
public BaiduMap getBaiduMap() {
return mBaiduMap;
}

/**
* 初始化百度定位
*/
public LocationClient initLocationClient() {
// TODO Auto-generated method stub
mLocationClient = new LocationClient(context.getApplicationContext());
mLocationClient.registerLocationListener(this);
mVibrator = (Vibrator) context.getApplicationContext()
.getSystemService(Service.VIBRATOR_SERVICE);
clientOption = new LocationClientOption();
clientOption.setLocationMode(tempMode);// 可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
clientOption.setCoorType(tempcoor);// 可选,默认gcj02,设置返回的定位结果坐标系,
// int span = 100000;
// clientOption.setScanSpan(span);//
// 可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
clientOption.setIsNeedAddress(true);// 可选,设置是否需要地址信息,默认不需要
clientOption.setOpenGps(true);// 可选,默认false,设置是否使用gps
clientOption.setPriority(LocationClientOption.GpsFirst); // 设置GPS优先
clientOption.setLocationNotify(true);// 可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
clientOption.setIgnoreKillProcess(true);// 可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
mLocationClient.setLocOption(clientOption);
return mLocationClient;
}

/**
* 初始化百度地图地理编码功能
*/
public GeoCoder initGeoCoder() {
geoCoder = GeoCoder.newInstance();
geoCoder.setOnGetGeoCodeResultListener(this);
codeOption = new ReverseGeoCodeOption();
return geoCoder;
}

/**
* 初始化创建PoiSearch实例(poi检索)
*
* @return PoiSearch实例
*/
public PoiSearch initPoiSearch() {
mPoiSearch = PoiSearch.newInstance();
mPoiSearch.setOnGetPoiSearchResultListener(this);
return mPoiSearch;
}

/**
* poi范围内检索
*
* @param latLang
*            地理范围数据结构,由西南以及东北坐标点确认
* @param keyWord
*            检索关键字
* @param pageCapacity
*            设置每页容量,默认为每页10条
* @param pageNum
*            分页编号
*/
public void poiSearchInBound(LatLngBounds latLang, String keyWord,
int pageCapacity, int pageNum) {
PoiBoundSearchOption poiBoundOption = new PoiBoundSearchOption();
poiBoundOption.bound(latLang);
poiBoundOption.keyword(keyWord);
poiBoundOption.pageCapacity(pageCapacity);
poiBoundOption.pageNum(pageNum);
mPoiSearch.searchInBound(poiBoundOption);
}

/**
* poi城市内检索
*
* @param city
*            城市名称
* @param keyWord
*            检索关键字
* @param pageCapacity
*            设置每页容量,默认为每页10条
* @param pageNum
*            分页编号
*/
public void poiSearchInCity(String city, String keyWord, int pageCapacity,
int pageNum) {
PoiCitySearchOption poiCityOption = new PoiCitySearchOption();
poiCityOption.city(city);
poiCityOption.keyword(keyWord);
poiCityOption.pageCapacity(pageCapacity);
poiCityOption.pageNum(pageNum);
mPoiSearch.searchInCity(poiCityOption);
}

/**
* poi周边检索
*
* @param keyWord
*            检索关键字
* @param location
*            检索位置
* @param pageCapacity
*            设置每页容量,默认为每页10条
* @param pageNum
*            分页编号
* @param radius
*            设置检索的半径范围
* @param sortType
*            搜索结果排序规则,可选,默认
*/
public void pioSearchNearby(String keyWord, LatLng location,
int pageCapacity, int pageNum, int radius, PoiSortType sortType) {
PoiNearbySearchOption poiNearbyOption = new PoiNearbySearchOption();
poiNearbyOption.keyword(keyWord);
poiNearbyOption.location(location);
poiNearbyOption.pageCapacity(pageCapacity);
poiNearbyOption.pageNum(pageNum);
poiNearbyOption.radius(radius);
poiNearbyOption.sortType(sortType);
}

/**
* 手动定位当前位置
*/
public void Location() {
// 开启定位
mLocationClient.start();
// start之后会默认发起一次定位请求,开发者无须判断isstart并主动调用request
mLocationClient.requestLocation();
}

/**
* 手动获取附近poi点
*/
public void getlocationPlacePoi() {
codeOption.location(point);
geoCoder.reverseGeoCode(codeOption);
}

/**
* 释放百度地图(Activity onDestroy调用方法)
*/
public void onDestroyBDMap() {
if (mLocationClient != null) {
mLocationClient.stop();
}
if (geoCoder != null) {
geoCoder.destroy();
}
if (mPoiSearch != null) {
mPoiSearch.destroy();
}
mapView.onDestroy();
}

/**
* Activity onResume调用方法
*/
public void onResumeBDMap() {
mapView.onResume();
}

/**
* Activity onPause调用方法
*/
public void onPauseBDMap() {
mapView.onPause();
}

/**
* 定位完成后结果回调
*/
@Override
public void onReceiveLocation(BDLocation location) {
// TODO Auto-generated method stub
bdMapResult.getBDLocation(location);
point = new LatLng(location.getLatitude(), location.getLongitude());
}

/**
* 地理编码查询结果回调函数
*/
@Override
public void onGetGeoCodeResult(GeoCodeResult arg0) {
// TODO Auto-generated method stub
bdMapResult.getGeoCodeResult(arg0);
}

/**
* 反地理编码查询结果回调函数
*/
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult arg0) {
bdMapResult.getReverseGeoCodeResult(arg0);
}

/**
* 地图点击响应回调
*/
@Override
public void onMapClick(LatLng arg0) {
// TODO Auto-generated method stub
bdMapResult.getClickMapMessage(arg0);
}

/**
* 地图poi点点击响应回调
*/
@Override
public boolean onMapPoiClick(MapPoi mapPoi) {
// TODO Auto-generated method stub
// mapPoi.getName(); // 名称
// mapPoi.getPosition(); // 坐标
b
4000
dMapResult.getClickMapPoiMessage(mapPoi);
return false;
}

/**
* poi 详情查询结果回调
*/
@Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
// TODO Auto-generated method stub
bdMapResult.getPoiDetailResult(poiDetailResult);
}

/**
* poi 查询结果回调
*/
@Override
public void onGetPoiResult(PoiResult poiResult) {
// TODO Auto-generated method stub
bdMapResult.getPoiResult(poiResult);
}


回调接口类(返回功能数据,获取数据后操作就由自己去处理了)

/**
* 百度地图回调接口类
* @author user
*
*/
public interface BDMapResultInternet {
/**
* 地图poi点点击响应回调
* @param mapPoi poi点对象
* 名称:mapPoi.getName(); 坐标:mapPoi.getPosition();
*/
void getClickMapPoiMessage(MapPoi mapPoi);
/**
* 地图点击响应回调
* @param latLng 坐标对象
*/
void getClickMapMessage(LatLng latLng);
/**
* 反地理编码查询结果回调函数
* @param codeResult 反地理编码查询结果对象
*/
void getReverseGeoCodeResult(ReverseGeoCodeResult codeResult);
/**
* 地理编码查询结果回调函数
* @param geoCodeResult
*/
void getGeoCodeResult(GeoCodeResult geoCodeResult);
/**
* 定位完成后结果回调
* @param location
*/
void getBDLocation(BDLocation location);
/**
* poi 详情查询结果回调
* @param poiDetailResult
*/
void getPoiDetailResult(PoiDetailResult poiDetailResult);
/**
* poi 查询结果回调
* @param poiResult
*/
void getPoiResult(PoiResult poiResult);
}

附加方法

bmapView.removeViewAt(1);
bmapView.removeViewAt(2);View child = bmapView.getChildAt(1);// 隐藏百度logo和缩放控件ZoomControlif (child instanceof ImageView || child instanceof ZoomControls) {child.setVisibility(View.INVISIBLE);}



监听自定义缩放控件

zoomInBtn = (Button) v.findViewById(R.id.zoomin);
zoomOutBtn = (Button) v.findViewById(R.id.zoomout);
zoomInBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
float zoomLevel = baiduMap.getMapStatus().zoom;
L.i(Float.toString(zoomLevel));
if(zoomLevel<=18){
//					MapStatusUpdateFactory.zoomIn();
baiduMap.setMapStatus(MapStatusUpdateFactory.zoomIn());
zoomOutBtn.setEnabled(true);
}else{
Toast.makeText(getActivity(), "已经放至最大!", Toast.LENGTH_SHORT).show();
zoomInBtn.setEnabled(false);
}
}
});
zoomOutBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
float zoomLevel = baiduMap.getMapStatus().zoom;
if(zoomLevel>4){
baiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut());
zoomInBtn.setEnabled(true);
}else{
zoomOutBtn.setEnabled(false);
Toast.makeText(getActivity(), "已经缩至最小!", Toast.LENGTH_SHORT).show();
}
}
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息