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