百度地图定位+搜索+列表展示

距离上次写博客差不多半年了,我是一个不善于表达的人,想写博客又不知道写些什么,最近公司项目需要集成百度地图,踩了各种坑,各种不显示,弄了半天终于达到了想要的效果,为了让新手少踩坑,于是就有了这篇文章。话不多说,先上效果图。

      

代码链接


如果so库放在libs下需要在build.gradle中加如下代码

sourceSets {
    main {
        jniLibs.srcDir 'libs'
    }

    instrumentTest.setRoot('tests')
    debug.setRoot('build-types/debug')
    release.setRoot('build-types/release')
}

关键代码

初始定位

//初始定位
private void initLocation() {
    //重新设置
    checkPosition = 0;
    adapter.setCheckposition(0);

    mBaiduMap = mMapView.getMap();
    mBaiduMap.clear();
    // 开启定位图层
    mBaiduMap.setMyLocationEnabled(true);
    mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().zoom(17).build()));   // 设置级别

    // 定位初始化
    mLocationClient = new LocationClient(getApplicationContext()); // 声明LocationClient    mLocationClient.registerLocationListener(myListener);// 注册定位监听接口

    /**
     * 设置定位参数
     */
    LocationClientOption option = new LocationClientOption();
    option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);// 设置定位模式
    //    option.setScanSpan(5000);// 设置发起定位请求的间隔时间,ms
    option.setNeedDeviceDirect(true);// 设置返回结果包含手机的方向
    option.setOpenGps(true);
    option.setAddrType("all");// 返回的定位结果包含地址信息
    option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
    option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
    mLocationClient.setLocOption(option);
    mLocationClient.start(); // 调用此方法开始定位
}



第一定位需要在自定义的Location中附近查找代码如下:

public class MyLocationListener implements BDLocationListener {
    @Override
    public void onReceiveLocation(BDLocation location) {
        if (location == null || mMapView == null) {
            return;
        }

        locType = location.getLocType();

        longitude = location.getLongitude();
        latitude = location.getLatitude();
        if (location.hasRadius()) {// 判断是否有定位精度半径
            radius = location.getRadius();
        }

        if (locType == BDLocation.TypeNetWorkLocation) {
            addrStr = location.getAddrStr();// 获取反地理编码(文字描述的地址)
        }

        LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());

        //将当前位置加入List里面
        PoiInfo info = new PoiInfo();
        info.address = location.getAddrStr();
        info.city = location.getCity();
        info.location = ll;
        info.name = location.getAddrStr();
        dataList.add(info);
        adapter.notifyDataSetChanged();


        // 构造定位数据
        MyLocationData locData = new MyLocationData.Builder()
                .accuracy(location.getRadius())
                // 此处设置开发者获取到的方向信息,顺时针0-360
                .direction(100).latitude(location.getLatitude())
                .longitude(location.getLongitude()).build();
        mBaiduMap.setMyLocationData(locData);

        //画标志
        CoordinateConverter converter = new CoordinateConverter();
        converter.coord(ll);
        converter.from(CoordinateConverter.CoordType.COMMON);
        LatLng convertLatLng = converter.convert();

        OverlayOptions ooA = new MarkerOptions().position(ll).icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_marka));
        mCurrentMarker = (Marker) mBaiduMap.addOverlay(ooA);


        MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(convertLatLng, 17.0f);
        mBaiduMap.animateMapStatus(u);

        //画当前定位标志
        MapStatusUpdate uc = MapStatusUpdateFactory.newLatLng(ll);
        mBaiduMap.animateMapStatus(uc);

        mMapView.showZoomControls(false);
        //poi 搜索周边
        new Thread(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                Looper.prepare();
                searchNeayBy();
                Looper.loop();
            }
        }).start();


    }

    public void onReceivePoi(BDLocation poiLocation) {
        if (poiLocation == null) {
            return;
        }
    }
}

周边搜索代码


/**
 * 搜索周边
 */
private void searchNeayBy() {
    // POI初始化搜索模块,注册搜索事件监听
    mPoiSearch = PoiSearch.newInstance();
    mPoiSearch.setOnGetPoiSearchResultListener(this);
    PoiNearbySearchOption poiNearbySearchOption = new PoiNearbySearchOption();
    poiNearbySearchOption.keyword("公司");
    poiNearbySearchOption.location(new LatLng(latitude, longitude));
    poiNearbySearchOption.radius(100);  // 检索半径,单位是米
    poiNearbySearchOption.pageCapacity(20);  // 默认每页10    mPoiSearch.searchNearby(poiNearbySearchOption);  // 发起附近检索请求
}


关键字搜索代码:

private void sousuo() {
    String sousuo = mSouSuoET.getText().toString().toString();

    PoiCitySearchOption poiCitySearchOption = new PoiCitySearchOption()
            .city("温州")
            .keyword(sousuo);

    mPoiSearch.searchInCity(poiCitySearchOption);
}


搜索结果处理 需要实现接口OnGetPoiSearchResultListener

@Override
public void onGetPoiResult(PoiResult result) {
    // 获取POI检索结果
    if (result == null || result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {// 没有找到检索结果
        Toast.makeText(this, "未找到结果", Toast.LENGTH_LONG).show();
        return;
    }

    if (result.error == SearchResult.ERRORNO.NO_ERROR) {// 检索结果正常返回
        //       mBaiduMap.clear();
        if (result != null) {
            if (result.getAllPoi() != null && result.getAllPoi().size() > 0) {

                PoiInfo ad = (PoiInfo) result.getAllPoi().get(0);
                MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ad.location);
                mBaiduMap.animateMapStatus(u);
                mCurrentMarker.setPosition(ad.location);

                dataList.clear();
                
                
                //把搜索到的结果添加到列表的集合中
                dataList.addAll(result.getAllPoi());
                
                handler.sendEmptyMessage(0);
            }
        }
    }
}





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值