百度地图Util 简单的封装百度地图

之前做项目,地理位置选择界面用到百度地图,当时全部都写在了Activity 导致整个Activity代码看起来特别乱  于是决定对百度地图这块做提取

好了废话不多说 直接上代码  有不足之处请指教  

现在只初步封装了  定位  poi  逆地理解析

import android.content.Context;
import android.util.Log;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
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.PoiIndoorResult;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
import java.util.List;


/**
 * Created by lybon 2017//2.
 * <p>
 * 对百度地图封装
 */

public class LocationUtil {
    private static MyLocationListenner myListener = new MyLocationListenner();
    private static LocationClient mLocClient;
    protected static currentAddress mCurrentAddress;//定位回调监听
    protected static poiSeach mPoi; //poi检索回调监听
    protected static geoCode mGeoCode;//反地理编码查询
    protected static boolean isOnes = true;//是否之调用一次
    private static GeoCoder geoCoder;

    public interface currentAddress {
        void getAddress(BDLocation location);
    }

    public interface poiSeach {
        void getPoi(List<PoiInfo> poiInfos);
    }

    public interface geoCode {
        void getGeoCode(List<PoiInfo> poiInfos);
    }

    /**
     * 定位模块调用
     *
     * @param mCurrentAddress2
     */
    public static void setCurrentAddress(currentAddress mCurrentAddress2, Context mContext, boolean one) {
        mCurrentAddress = mCurrentAddress2;
        getLocation(mContext);
        isOnes = one;
    }

    /**
     * POI检索模块
     *
     * @param mPoiSeach
     * @param city
     * @param code
     */
    public static void setPoi(poiSeach mPoiSeach, String city, String code) {
        mPoi = mPoiSeach;
        poiSeach(city, code);
    }

    /**
     * 逆地理编码
     *
     * @param mGeo
     * @param mLatLng
     */
    public static void setGeoCode(geoCode mGeo, LatLng mLatLng) {
        mGeoCode = mGeo;
    }

    /**
     * 定位模块
     */
    public static void getLocation(Context mContext) {
        // 定位初始化
        if (mLocClient == null) {
            mLocClient = new LocationClient(mContext);
            mLocClient.registerLocationListener(myListener);
            // 定位选项
            LocationClientOption option = new LocationClientOption();
            /**
             * coorType - 取值有3个: 返回国测局经纬度坐标系:gcj02 返回百度墨卡托坐标系 :bd09 返回百度经纬度坐标系
             * :bd09ll
             */
            option.setCoorType("bd09ll");
            // 设置是否需要地址信息,默认为无地址
            option.setIsNeedAddress(true);
            // 设置是否需要返回位置语义化信息,可以在BDLocation.getLocationDescribe()中得到数据,ex:"在天安门附近",
            // 可以用作地址信息的补充
            option.setIsNeedLocationDescribe(true);
            // 设置是否需要返回位置POI信息,可以在BDLocation.getPoiList()中得到数据
            option.setIsNeedLocationPoiList(true);
            /**
             * 设置定位模式 Battery_Saving 低功耗模式 Device_Sensors 仅设备(Gps)模式 Hight_Accuracy
             * 高精度模式
             */
            option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
            // 设置是否打开gps进行定位
            option.setOpenGps(true);
            // 设置扫描间隔,单位是毫秒 当<1000(1s)时,定时定位无效
            option.setScanSpan(1000);

            // 设置 LocationClientOption
            mLocClient.setLocOption(option);
        }
        mLocClient.start();
        mLocClient.requestLocation();
    }

    /**
     * 重写定位监听
     */
    public static class MyLocationListenner implements BDLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {
            // TODO Auto-generated method stub
            if (location != null) {
                if (location.getCity() != null
                        && !location.getCity().equals("")) {
                    if (isOnes == true) {
                        mLocClient.stop();
                    }
                    mCurrentAddress.getAddress(location);
                } else {
                    Log.v("zhaojihao", location.toString() + "||" + location.getLongitude());
                }
            } else {
                Log.e("zhaojihao", "失败");
            }
        }
    }

    /******************                定位模块结束                             ************************/

    /**
     * POI检索模块
     * @param city 检索城市
     * @param code 检索关键字
     */
    public static void poiSeach(String city, String code) {
        // 创建PoiSearch实例
        PoiSearch poiSearch = PoiSearch.newInstance();
        // 城市内检索
        PoiCitySearchOption poiCitySearchOption = new PoiCitySearchOption();
        // 关键字
        poiCitySearchOption.keyword(code);
        // 城市
        poiCitySearchOption.city(city);
        // 设置每页容量,默认为每页10条
        poiCitySearchOption.pageCapacity(10);
        // 分页编号
        poiCitySearchOption.pageNum(1);
        poiSearch.searchInCity(poiCitySearchOption);
        // 设置poi检索监听者
        poiSearch.setOnGetPoiSearchResultListener(new getPoiSearchResult());
    }
    public static class getPoiSearchResult implements OnGetPoiSearchResultListener{
        // poi 查询结果回调
        @Override
        public void onGetPoiResult(PoiResult poiResult) {
            try {
                mPoi.getPoi(poiResult.getAllPoi());
            } catch (Exception e) {
                mPoi.getPoi(null);
            }
        }
        // poi 详情查询结果回调
        @Override
        public void onGetPoiDetailResult(
                PoiDetailResult poiDetailResult) {
        }
        @Override
        public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
        }
    }
    /******************                POI检索模块结束                             ************************/

    /**
     * 逆地理编码解析
     *
     * @param latLng
     */
    public static void geoCode(LatLng latLng) {
        // 发起反地理编码请求(经纬度->地址信息)
        ReverseGeoCodeOption reverseGeoCodeOption = new ReverseGeoCodeOption();
        // 设置反地理编码位置坐标
        reverseGeoCodeOption.location(latLng);
        // 创建GeoCoder实例对象
        if (geoCoder == null) {
            geoCoder = GeoCoder.newInstance();
        }
        geoCoder.reverseGeoCode(reverseGeoCodeOption);
        // 设置查询结果监听者
        geoCoder.setOnGetGeoCodeResultListener(new MyOnGetGeoCodeResultListener());
    }

    public static class MyOnGetGeoCodeResultListener implements OnGetGeoCoderResultListener {
        @Override
        public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {

        }

        @Override
        public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
            try {
                if (reverseGeoCodeResult == null || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
                    mGeoCode.getGeoCode(null);
                    return;
                }
                mGeoCode.getGeoCode(reverseGeoCodeResult.getPoiList());
            } catch (Exception e) {
                Log.d("Exception", e.toString());
            }
        }
    }
}
 



猜你喜欢

转载自blog.csdn.net/u010123087/article/details/74177616