百度地图定位

1、版本和key的对应
相关包和权限的设定以及相关配置的引入
2、定位、加载已知定位、搜索

package com.DDMap.ddmap;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.Toast;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.map.LocationData;
import com.baidu.mapapi.map.MKEvent;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationOverlay;
import com.baidu.mapapi.map.PoiOverlay;
import com.baidu.mapapi.map.TransitOverlay;
import com.baidu.mapapi.search.MKAddrInfo;
import com.baidu.mapapi.search.MKBusLineResult;
import com.baidu.mapapi.search.MKDrivingRouteResult;
import com.baidu.mapapi.search.MKPoiInfo;
import com.baidu.mapapi.search.MKPoiResult;
import com.baidu.mapapi.search.MKSearch;
import com.baidu.mapapi.search.MKSearchListener;
import com.baidu.mapapi.search.MKSuggestionResult;
import com.baidu.mapapi.search.MKTransitRouteResult;
import com.baidu.mapapi.search.MKWalkingRouteResult;
import com.baidu.platform.comapi.basestruct.GeoPoint;

public class MainActivity extends Activity implements OnClickListener {
    protected static final String TAG = "MainActivity";
    private static boolean isWeiXing = false;
    private static boolean isSimple = true;
    private static LocationData locationData = new LocationData();
    private boolean flag_new = true;
    private MapView mMapView;
    private BMapManager mBMapMan;// 加载引擎
    private EditText et_search;
    private ImageView btn_search;
    private RadioButton radio_btn_changemode;// 改变模式的radio_btn_changemode
    private RadioButton radio_btn_refresh;// 更新位置的radio_btn_refresh
    private String key = "60BC0E114DF04490271E1FD3974546C4CDAD4CC3";
    // private String key = "wb1oFj9uMZBbKdQTu1P8HGEa";
    public LocationClient mLocationClient = null;
    public BDLocationListener myListener = new MyLocationListener();
    private MapController mMapController;
    private MKSearch mkSearch;
    private String content;// 用户输入的要查询的内容
    private GeoPoint pt1; // 当前坐标点

    private double mLat1 = 39.915; // point1纬度

    private double mLon1 = 116.404; // point1经度

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        mBMapMan = new BMapManager(getApplication());
        mBMapMan.init(key, null);
        // 注意:请在试用setContentView前初始化BMapManager对象,否则会报错
        setContentView(R.layout.activity_main);
        mMapView = (MapView) findViewById(R.id.bmapView);

        mMapView.setBuiltInZoomControls(true);
        // mMapView.setDrawOverlayWhenZooming(true);
        mMapController = mMapView.getController();
        // 得到mMapView的控制权,可以用它控制和驱动平移和缩放
        GeoPoint point = new GeoPoint((int) (39.915 * 1E6),
                (int) (116.404 * 1E6));
        // 用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)
        mMapController.setCenter(point);// 设置地图中心点
        mMapController.setZoom(12);// 设置地图zoom级别

        initView();

        initlocation();

        mLocationClient = new LocationClient(getApplicationContext()); // 声明LocationClient类
        mLocationClient.registerLocationListener(myListener); // 注册监听函数

        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);
        option.setAddrType("all");// 返回的定位结果包含地址信息
        option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
        option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms
        option.disableCache(true);// 禁止启用缓存定位
        option.setPoiNumber(5); // 最多返回POI个数
        option.setPoiDistance(1000); // poi查询距离
        option.setPoiExtraInfo(true); // 是否需要POI的电话和地址等详细信息

        // 发起定位请求
        mLocationClient.setLocOption(option);
        mLocationClient.start();

        mkSearch = new MKSearch();
        mkSearch.init(mBMapMan, new MKSearchListener() {

            @Override
            public void onGetWalkingRouteResult(MKWalkingRouteResult res,
                    int error) {
            }

            @Override
            public void onGetTransitRouteResult(MKTransitRouteResult res,
                    int error) {
                if (error != 0 || res == null) {
                    Toast.makeText(MainActivity.this, "抱歉,未找到结果",
                            Toast.LENGTH_SHORT).show();
                    return;
                }
                TransitOverlay routeOverlay = new TransitOverlay(
                        MainActivity.this, mMapView);
                // 此处仅展示一个方案作为示例
                routeOverlay.setData(res.getPlan(0));
                mMapView.getOverlays().clear();
                mMapView.getOverlays().add(routeOverlay);
                mMapView.refresh();
                // 使用zoomToSpan()绽放地图,使路线能完全显示在地图上
                mMapView.getController().zoomToSpan(
                        routeOverlay.getLatSpanE6(),
                        routeOverlay.getLonSpanE6());
                mMapView.getController().animateTo(res.getStart().pt);
            }

            @Override
            public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
            }

            @Override
            public void onGetPoiResult(MKPoiResult res, int type, int error) {

                if (error == MKEvent.ERROR_RESULT_NOT_FOUND) {
                    Toast.makeText(MainActivity.this, "抱歉,未找到结果",
                            Toast.LENGTH_LONG).show();
                    return;
                } else if (error != 0 || res == null) {
                    Toast.makeText(MainActivity.this, "搜索出错啦..",
                            Toast.LENGTH_LONG).show();
                    return;
                }

                // 将poi结果显示到地图上
                PoiOverlay poiOverlay = new PoiOverlay(MainActivity.this,
                        mMapView);
                poiOverlay.setData(res.getAllPoi());
                mMapView.getOverlays().clear();
                mMapView.getOverlays().add(poiOverlay);
                mMapView.refresh();
                // 当ePoiType为2(公交线路)或4(地铁线路)时, poi坐标为空
                for (MKPoiInfo info : res.getAllPoi()) {
                    if (info.pt != null) {
                        mMapView.getController().animateTo(info.pt);
                        break;
                    }
                }
            }

            @Override
            public void onGetPoiDetailSearchResult(int arg0, int arg1) {
            }

            @Override
            public void onGetDrivingRouteResult(MKDrivingRouteResult arg0,
                    int arg1) {
            }

            @Override
            public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {
            }

            @Override
            public void onGetAddrResult(MKAddrInfo arg0, int arg1) {
            }
        });

    }

    // 初始化控件
    private void initView() {
        btn_search = (ImageView) findViewById(R.id.btn_search);
        btn_search.setOnClickListener(this);
        et_search = (EditText) findViewById(R.id.et_search);
        content = et_search.getText().toString();
        radio_btn_changemode = (RadioButton) findViewById(R.id.radio_btn_changemode);
        radio_btn_refresh = (RadioButton) findViewById(R.id.radio_btn_refresh);
        radio_btn_changemode.setOnClickListener(this);
        radio_btn_refresh.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        // mMapView.setSatellite(true);//设置卫星地图
        // mMapView.setTraffic(true); 设置普通地图
        switch (v.getId()) {
        case R.id.radio_btn_changemode: // 改变模式的点击事件
            if (isWeiXing) {
                isWeiXing = false;
                isSimple = true;
                mMapView.setSatellite(isWeiXing);
                mMapView.setTraffic(isSimple);
            } else if (isSimple) {
                isSimple = false;
                isWeiXing = true;
                mMapView.setSatellite(isWeiXing);
                mMapView.setTraffic(isSimple);
            }
            break;
        case R.id.radio_btn_refresh: // 更新位置的点击事件
            flag_new = true;
            break;
        case R.id.btn_search: // 搜索附近的点击事件
            btn_search.setBackgroundColor(Color.GREEN);
            content = et_search.getText().toString();
            mkSearch.poiSearchNearBy(content, pt1, 10000);// 附近10000米进行搜索
            break;
        }

    }

    @Override
    protected void onDestroy() {
        mMapView.destroy();
        if (mBMapMan != null) {
            mBMapMan.destroy();
            mBMapMan = null;
        }
        super.onDestroy();
    }

    @Override
    protected void onPause() {
        mMapView.onPause();
        if (mBMapMan != null) {
            mBMapMan.stop();
        }
        super.onPause();
    }

    @Override
    protected void onResume() {
        mMapView.onResume();
        if (mBMapMan != null) {
            mBMapMan.start();
        }
        super.onResume();
    }

    private class MyLocationListener implements BDLocationListener {
        // 大概一秒钟定位一次
        @Override
        public void onReceiveLocation(BDLocation location) {
            if (location == null)
                return;
            if (flag_new == true) {
                Toast.makeText(MainActivity.this,
                        "我的定位" + location.getAddrStr(), Toast.LENGTH_SHORT)
                        .show();

                pt1 = new GeoPoint((int) (location.getLatitude() * 1E6),
                        (int) (location.getLongitude() * 1E6));
                locationData.latitude = location.getLatitude();
                locationData.longitude = location.getLongitude();
                locationData.direction = 2.0f;
                locationData.accuracy = location.getRadius();// 获取服务
                locationData.direction = location.getDerect();
                // myLocationOverlay.setData(locationData);//异步加载locationData,必须异步加载,否则myLocationOverlay不会显示
                mMapView.refresh();// 此处刷新必须有
                // 定位本地位置,此句没有,则无法定位
                mMapController.animateTo(new GeoPoint(
                        (int) (locationData.latitude * 1e6),
                        (int) (locationData.longitude * 1e6)));
                MyLocationOverlay myLocationOverlay = new MyLocationOverlay(
                        mMapView);
                // LocationData locData = new LocationData();
                // 手动将位置源置为天安门,在实际应用中,请使用百度定位SDK获取位置信息,要在SDK中显示一个位置,需要
                // 使用百度经纬度坐标(bd09ll)
                // locData.latitude = location.getLatitude();
                // locData.longitude = location.getLongitude();
                locationData.direction = 2.0f;
                myLocationOverlay.setData(locationData);
                mMapView.getOverlays().add(myLocationOverlay);
                mMapView.refresh();

                flag_new = false;
            }

        }

        @Override
        public void onReceivePoi(BDLocation poiLocation) {
            if (poiLocation == null) {
                Toast.makeText(getApplicationContext(), "null", 1).show();
                return;
            }
            Toast.makeText(getApplicationContext(), "111111", 1).show();
            Log.i("onReceivePoi", "______________________");
            // 初始化mkSearch
        }
    }

    private void initlocation() {
        mMapController.animateTo(new GeoPoint((int) (mLat1 * 1e6),
                (int) (mLon1 * 1e6)));
        MyLocationOverlay myLocationOverlay = new MyLocationOverlay(mMapView);

        LocationData locData = new LocationData();
        // 手动将位置源置为天安门,在实际应用中,请使用百度定位SDK获取位置信息,要在SDK中显示一个位置,需要
        // 使用百度经纬度坐标(bd09ll)
        locData.latitude = mLat1;
        locData.longitude = mLon1;
        myLocationOverlay.setData(locData);
        mMapView.getOverlays().add(myLocationOverlay);
        mMapView.refresh();
    }

    public static LocationData getLocationDate() {
        return locationData;
    }

}

参考:http://blog.csdn.net/android_ls/article/details/8578044

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看rEADME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通;、 3本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看ReAdmE.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值