先來看看產品🐶抄襲的產品原效果php
第二個gif是實現的效果,超市,地鐵,學校使用的icon都是不一樣的圖標,gif模糊看不出來,html
實際開發的時候切換成對應的資源圖片就能夠了java
接下來看實現的步驟和部分代碼,完整的類的代碼在後邊也會有react
下載Jar包資源android
一、百度開發者平臺註冊app獲取appkey等信息,填寫對應的SHA1值和包名信息git
若是獲取SHA1的值能夠跳轉到:http://www.javashuo.com/article/p-bzqwokhs-kg.htmlgithub
建立好應用以後,選擇功能下載如圖:json
解壓以後,把lib中的jar包和資源文件放到項目lib文件夾下api
在app的build.gradle文件中添加微信
sourceSets { main { jniLibs.srcDir 'libs' //說明so的路徑爲該libs路徑,關聯全部地圖SDK的so文件 jniLibs.srcDirs = ['libs'] } }
完整的app的build.gradle文件
apply plugin: 'com.android.application' android { compileSdkVersion 27 defaultConfig { applicationId "com.dc.baidumap" minSdkVersion 21 targetSdkVersion 27 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" signingConfig signingConfigs.release } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } debug { signingConfig signingConfigs.release } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } sourceSets { main { jniLibs.srcDir 'libs' //說明so的路徑爲該libs路徑,關聯全部地圖SDK的so文件 jniLibs.srcDirs = ['libs'] } } productFlavors { } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') //noinspection GradleCompatible implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support.constraint:constraint-layout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' //Rx系列 implementation 'io.reactivex.rxjava2:rxjava:2.1.3' implementation 'com.squareup.retrofit2:retrofit:2.3.0' implementation 'com.squareup.retrofit2:converter-gson:2.3.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' //OkHttp implementation 'com.squareup.okhttp3:okhttp:3.9.0' implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0' //Retrofit implementation 'com.squareup.retrofit2:converter-scalars:2.3.0' implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.1.0' //FastJson implementation 'com.alibaba:fastjson:1.2.47' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' //解決Android3.0之後不能butterknife問題 implementation 'com.jakewharton:butterknife:8.4.0' annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0' implementation 'com.android.support:design:27.1.1' //首頁複雜佈局BaseRecyclerViewAdapterHelper // implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.8.1' //圖片加載框架Glide implementation 'com.github.bumptech.glide:glide:4.7.1' implementation files('libs/BaiduLBS_Android.jar') implementation files('libs/IndoorscapeAlbumPlugin.jar') }
AndroidManifest.xml須要添加的代碼,固然還有權限
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="百度開發者平臺上建立的應用的appkey" /> <!-- http://lbsyun.baidu.com/apiconsole/key -->
完整的AndroidManifest.xml文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.dc.baidumap"> !--所需權限--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_LOGS" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!--直接撥打電話權限--> <uses-permission android:name="android.permission.CALL_PHONE" /> <!--廣播跳轉--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!--百度地圖--> <!--百度地圖權限--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!--Mob分享--> <uses-permission android:name="android.permission.GET_TASKS" /> <!-- 短信驗證登錄功能須要添加次權限來自動填充驗證碼,用不到能夠去掉 --> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" /> <!--微信支付權限--> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <!--支付寶支付權限--> <!-- 安卓讀寫sd權限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!--相機權限--> <uses-permission android:name="android.permission.CAMERA" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:name=".base.BaseApplication" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".view.PoiJsActivity"/> <activity android:name=".view.QuanJingActivity"/> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="RaPt4YCMB4DONvcOLbKIC7E5tKZjnH66" /> <!-- http://lbsyun.baidu.com/apiconsole/key --> </application> </manifest>
基本的準備完成以後,開始看POI頁面的部分功能代碼
先在應用程序建立初始化SDK,BaseApplication中
全部的準備工做完成,開始POI檢索功能代碼
POI檢索的百度官方文檔 http://lbsyun.baidu.com/index.php?title=androidsdk/guide/search/poi
實例化POI檢索對象
poiSearch= PoiSearch.newInstance();//建立POI檢索實例
檢索功能實現
poiSearch.searchNearby(new PoiNearbySearchOption() .sortType(PoiSortType.distance_from_near_to_far) // .sortType(PoiSortType.comprehensive) .keyword("地鐵")//關鍵詞 .radius(radius)//檢索範圍 .pageCapacity(pageCapacity)//檢索的條數,每頁 .pageNum(pageIndex)//頁碼,注意,這裏是從0開始的 .location(new LatLng(lat,lng)));//檢索地點,demo中這裏使用的是定位,固然你可使用後臺獲取的經緯度,可是注意要使用百度的轉換方法轉換正確
POI檢索監聽
OnGetPoiSearchResultListener poiSearchResultListener=new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult poiResult) { //獲取POI檢索結果 } @Override public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {//獲取某個Poi詳細信息 //獲取Place詳情頁檢索結果 } @Override public void onGetPoiDetailResult(PoiDetailSearchResult poiDetailSearchResult) { } @Override public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {//查詢室內poi檢索結果回調 } };
在檢索的監聽回調中作邏輯判斷處理
//建立POI檢索監聽 OnGetPoiSearchResultListener poiSearchResultListener=new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult poiResult) { //獲取POI檢索結果 // 獲取POI檢索結果 if (poiResult == null || poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) { Toast.makeText(PoiJsActivity.this, "未找到結果", Toast.LENGTH_LONG).show(); //只把當前的添加進去 if (baiduMap!=null){ baiduMap.clear(); PoiOverlay ov=new MyPoiOverlay(baiduMap); baiduMap.setOnMarkerClickListener(ov); //把當前定位點添加到集合的最後一個 PoiInfo poiInfo=new PoiInfo(); poiInfo.setLocation(new LatLng(lat,lng)); poiInfo.setName("這是座標點"); // poiResult.getAllPoi().set(poiInfos.size()+1,poiInfo); PoiResult poiResult1=new PoiResult(); List<PoiInfo> poiInfoList=new ArrayList<>(); poiInfoList.add(poiInfo); poiResult1.setPoiInfo(poiInfoList); //在這裏處理顯示那種圖標的問題 ov.setData(poiResult1,numType); //添加PoiOverlay到地圖中 ov.addToMap(); ov.zoomToSpan(); } return; } if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) { /** * PoiInfo中包含了經緯度、城市、地址信息、poi名稱、uid、郵編、電話等等信息; 有了這些,你是否是能夠能夠在這裏畫一個自定義的圖層了,而後添加點擊事件,作一些操做了呢 */ List<PoiInfo> poiInfos = poiResult.getAllPoi();//poi列表 Log.e("poiDatassss", JSON.toJSONString(poiInfos)); baiduMap.clear(); //建立PoiOverlay PoiOverlay overlay=new MyPoiOverlay(baiduMap); //設置overlay能夠處理標註點擊事件 baiduMap.setOnMarkerClickListener(overlay); //設置PoiOverlay數據 //把當前定位點添加到集合的最後一個 PoiInfo poiInfo=new PoiInfo(); poiInfo.setLocation(new LatLng(lat,lng)); poiInfo.setName("這是座標點"); // poiResult.getAllPoi().set(poiInfos.size()+1,poiInfo); PoiResult poiResult1=new PoiResult(); poiInfos.add(poiInfo); poiResult1.setPoiInfo(poiInfos); //在這裏處理顯示那種圖標的問題 overlay.setData(poiResult1,numType); //添加PoiOverlay到地圖中 overlay.addToMap(); overlay.zoomToSpan(); return; } } @Override public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {//獲取某個Poi詳細信息 //獲取Place詳情頁檢索結果 } @Override public void onGetPoiDetailResult(PoiDetailSearchResult poiDetailSearchResult) { } @Override public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {//查詢室內poi檢索結果回調 } };
上面的代碼中基本註釋都挺清除的,我在說一下我實現的思路等:搜索過來以後先判斷有沒有檢索到數據,若是沒有就提示未查詢到結果,由於檢索到數據以後 map.clear清掉了marker點,全部得從新把當前的定位的點構建出來
若是大家不須要當前的定位地點一下代碼能夠不用使用
//把當前定位點添加到集合的最後一個 PoiInfo poiInfo=new PoiInfo(); poiInfo.setLocation(new LatLng(lat,lng)); poiInfo.setName("這是座標點"); // poiResult.getAllPoi().set(poiInfos.size()+1,poiInfo); PoiResult poiResult1=new PoiResult(); List<PoiInfo> poiInfoList=new ArrayList<>(); poiInfoList.add(poiInfo);
完整類代碼以下
package com.dc.baidumap.view; import android.Manifest; import android.app.Activity; import android.content.pm.PackageManager; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.Toast; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.location.Poi; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.MapStatus; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.map.OverlayOptions; import com.baidu.mapapi.map.UiSettings; 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.poi.OnGetPoiSearchResultListener; import com.baidu.mapapi.search.poi.PoiAddrInfo; import com.baidu.mapapi.search.poi.PoiCitySearchOption; import com.baidu.mapapi.search.poi.PoiDetailResult; import com.baidu.mapapi.search.poi.PoiDetailSearchResult; import com.baidu.mapapi.search.poi.PoiIndoorResult; import com.baidu.mapapi.search.poi.PoiNearbySearchOption; import com.baidu.mapapi.search.poi.PoiResult; import com.baidu.mapapi.search.poi.PoiSearch; import com.baidu.mapapi.search.poi.PoiSortType; import com.dc.baidumap.R; import com.dc.baidumap.base.BaseActivity; import com.dc.baidumap.module.PoiInfoEntity; import java.util.ArrayList; import java.util.List; import butterknife.BindView; /** * @ClassName: PoiJsActivity * @Description:Poi檢索頁面 * @Author: dingchao * @Date: 2019/1/4 14:08 */ public class PoiJsActivity extends BaseActivity implements View.OnClickListener, BaiduMap.OnMapLoadedCallback { @BindView(R.id.mapv_poi) MapView mapv_poi; @BindView(R.id.btn_poi_cs) Button btn_poi_cs; @BindView(R.id.btn_poi_dt) Button btn_poi_dt; @BindView(R.id.btn_poi_zz) Button btn_poi_zz; BMapManager bMapManager;//定義管理sdk對象 BaiduMap baiduMap; PoiSearch poiSearch; int radius=2000;//檢索半徑 int pageIndex=0;//頁碼 int pageCapacity=10;//每頁條數 Activity activity; //定位當前位置相關 private LocationClient mLocationClient; double lat;//維度 double lng;//經度 MapStatus ms; private int numType;//判斷顯示那種圖標 @Override protected int getLayout() { return R.layout.activity_poi; } @Override public void onMapLoaded() { // TODO Auto-generated method stub ms = new MapStatus.Builder().zoom(6).build(); baiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(ms)); } @Override protected void initEvent() { poiSearch= PoiSearch.newInstance();//建立POI檢索實例 btn_poi_cs.setOnClickListener(this); btn_poi_dt.setOnClickListener(this); btn_poi_zz.setOnClickListener(this); activity = PoiJsActivity.this; initData(); List<String> permissionList = new ArrayList<>(); //獲取數據信息 if (ContextCompat.checkSelfPermission(PoiJsActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION); } if (ContextCompat.checkSelfPermission(PoiJsActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.READ_PHONE_STATE); } if (ContextCompat.checkSelfPermission(PoiJsActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if (!permissionList.isEmpty()) { String[] permissions = permissionList.toArray(new String[permissionList.size()]); ActivityCompat.requestPermissions(activity, permissions, 1); } else { // requestLocation(); } } private void initData() { poiSearch.setOnGetPoiSearchResultListener(poiSearchResultListener); //首先定位獲取當前經緯度定位 initLocation(); requestLocation(); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_poi_cs: numType=1; //發起檢索請求,獲取附近超市的數據 // poiSearch.searchInCity(new PoiCitySearchOption() // .city("北京")//搜索城市 // .keyword("超市")//搜索的關鍵字 // .pageNum(10));//搜索的條數 /** * 搜索位置點周邊POI */ // PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption(); //POI附近檢索參數設置類 // nearbySearchOption.keyword("超市");//搜索關鍵字,好比:銀行、網吧、餐廳等 // nearbySearchOption.location(new LatLng(lat,lng));//搜索的位置點 // nearbySearchOption.radius(radius);//搜索覆蓋半徑 // nearbySearchOption.sortType(PoiSortType.distance_from_near_to_far);//搜索類型,從近至遠 // nearbySearchOption.pageNum(pageIndex);//查詢第幾頁:POI量可能會不少,會有分頁查詢; // nearbySearchOption.pageCapacity(pageCapacity);//設置每頁查詢的個數,默認10個 // poiSearch.searchNearby(nearbySearchOption);//查詢 poiSearch.searchNearby(new PoiNearbySearchOption() .sortType(PoiSortType.distance_from_near_to_far) // .sortType(PoiSortType.comprehensive) .keyword("超市") .radius(radius) .pageCapacity(pageCapacity) .pageNum(pageIndex) .location(new LatLng(lat,lng))); break; case R.id.btn_poi_dt: numType=2; poiSearch.searchNearby(new PoiNearbySearchOption() .sortType(PoiSortType.distance_from_near_to_far) // .sortType(PoiSortType.comprehensive) .keyword("地鐵") .radius(radius) .pageCapacity(pageCapacity) .pageNum(pageIndex) .location(new LatLng(lat,lng))); break; case R.id.btn_poi_zz: numType=3; poiSearch.searchNearby(new PoiNearbySearchOption() .sortType(PoiSortType.distance_from_near_to_far) // .sortType(PoiSortType.comprehensive) .keyword("學校") .radius(radius) .pageCapacity(pageCapacity) .pageNum(pageIndex) .location(new LatLng(lat,lng))); break; } } //建立POI檢索監聽 OnGetPoiSearchResultListener poiSearchResultListener=new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult poiResult) { //獲取POI檢索結果 // 獲取POI檢索結果 if (poiResult == null || poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) { Toast.makeText(PoiJsActivity.this, "未找到結果", Toast.LENGTH_LONG).show(); //只把當前的添加進去 if (baiduMap!=null){ baiduMap.clear(); PoiOverlay ov=new MyPoiOverlay(baiduMap); baiduMap.setOnMarkerClickListener(ov); //把當前定位點添加到集合的最後一個 PoiInfo poiInfo=new PoiInfo(); poiInfo.setLocation(new LatLng(lat,lng)); poiInfo.setName("這是座標點"); // poiResult.getAllPoi().set(poiInfos.size()+1,poiInfo); PoiResult poiResult1=new PoiResult(); List<PoiInfo> poiInfoList=new ArrayList<>(); poiInfoList.add(poiInfo); poiResult1.setPoiInfo(poiInfoList); //在這裏處理顯示那種圖標的問題 ov.setData(poiResult1,numType); //添加PoiOverlay到地圖中 ov.addToMap(); ov.zoomToSpan(); } return; } if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) { /** * PoiInfo中包含了經緯度、城市、地址信息、poi名稱、uid、郵編、電話等等信息; 有了這些,你是否是能夠能夠在這裏畫一個自定義的圖層了,而後添加點擊事件,作一些操做了呢 */ List<PoiInfo> poiInfos = poiResult.getAllPoi();//poi列表 Log.e("poiDatassss", JSON.toJSONString(poiInfos)); baiduMap.clear(); //建立PoiOverlay PoiOverlay overlay=new MyPoiOverlay(baiduMap); //設置overlay能夠處理標註點擊事件 baiduMap.setOnMarkerClickListener(overlay); //設置PoiOverlay數據 //把當前定位點添加到集合的最後一個 PoiInfo poiInfo=new PoiInfo(); poiInfo.setLocation(new LatLng(lat,lng)); poiInfo.setName("這是座標點"); // poiResult.getAllPoi().set(poiInfos.size()+1,poiInfo); PoiResult poiResult1=new PoiResult(); poiInfos.add(poiInfo); poiResult1.setPoiInfo(poiInfos); //在這裏處理顯示那種圖標的問題 overlay.setData(poiResult1,numType); //添加PoiOverlay到地圖中 overlay.addToMap(); overlay.zoomToSpan(); return; } } @Override public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {//獲取某個Poi詳細信息 //獲取Place詳情頁檢索結果 } @Override public void onGetPoiDetailResult(PoiDetailSearchResult poiDetailSearchResult) { } @Override public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {//查詢室內poi檢索結果回調 } }; @Override protected void onDestroy() { super.onDestroy(); //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理 mapv_poi.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理 mapv_poi.onResume(); } @Override protected void onPause() { super.onPause(); //在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理 mapv_poi.onPause(); } //定位方法 private void initLocation() { mLocationClient = new LocationClient(PoiJsActivity.this); LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);// 高精度 option.setAddrType("all"); option.setCoorType("bd09ll"); option.setIsNeedAddress(true); mLocationClient.setLocOption(option); mLocationClient.registerLocationListener(new BDLocationListener() { @Override public void onReceiveLocation(BDLocation bdLocation) { StringBuilder currentPosition = new StringBuilder(); currentPosition.append("維度:").append(bdLocation.getLatitude()).append("\n"); currentPosition.append("經度:").append(bdLocation.getLongitude()).append("\n"); currentPosition.append("國家:").append(bdLocation.getCountry()).append("\n"); currentPosition.append("省:").append(bdLocation.getProvince()).append("\n"); currentPosition.append("市:").append(bdLocation.getCity()).append("\n"); currentPosition.append("區:").append(bdLocation.getDistrict()).append("\n"); currentPosition.append("街道:").append(bdLocation.getStreet()).append("\n"); currentPosition.append("定位方式:"); Log.e("tag", "當前的定位方式=" + bdLocation.getLocType()); if (bdLocation.getLocType() == BDLocation.TypeGpsLocation) { currentPosition.append("GPS"); } else if (bdLocation.getLocType() == BDLocation.TypeNetWorkLocation) { currentPosition.append("網絡"); } Log.e("address", "定位數據:=" + currentPosition); lat = bdLocation.getLatitude(); lng = bdLocation.getLongitude(); //傳遞進來的經緯度,這裏使用的是定位的 LatLng llText = new LatLng(lat,lng); baiduMap=mapv_poi.getMap(); MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.zoomBy(4); baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(llText));//設置定位的位置在屏幕的中間位置 baiduMap.animateMapStatus(mapStatusUpdate); // mapv_poi.showScaleControl(false); // mapv_poi.showZoomControls(false); // mapv_poi.setNestedScrollingEnabled(false); UiSettings settings = baiduMap.getUiSettings(); // settings.setAllGesturesEnabled(false);//關閉一切手勢操做 //構建Marker圖標,設置位置圓點 BitmapDescriptor bitmap = BitmapDescriptorFactory .fromResource(R.mipmap.mapdian); //構建MarkerOption,用於在地圖上添加Marker OverlayOptions option = new MarkerOptions() .position(llText) .icon(bitmap); baiduMap.addOverlay(option); } }); } /*地圖定位相關*/ private void requestLocation() { mLocationClient.start(); } private class MyPoiOverlay extends PoiOverlay { public MyPoiOverlay(BaiduMap baiduMap) { super(baiduMap); } @Override public boolean onPoiClick(int index) { super.onPoiClick(index); return true; } } }
再來看一下PoiOverlay這個類,這個類在你下載的百度Demo中能夠找到,能夠根據本身的需求進行修改這個類,在這裏我就處理這個類,增長了本身須要的判斷代碼
看下代碼
/** * 用於顯示poi的overly */ public class PoiOverlay extends OverlayManager { private static final int MAX_POI_SIZE = 10; private PoiResult mPoiResult = null; private int numType; public int getNumType() { return numType; } public void setNumType(int numType) { this.numType = numType; } /** * 構造函數 * * @param baiduMap 該 PoiOverlay 引用的 BaiduMap 對象 */ public PoiOverlay(BaiduMap baiduMap) { super(baiduMap); } /** * 設置POI數據 * * @param poiResult 設置POI數據 * @param numType */ public void setData(PoiResult poiResult, int numType) { this.mPoiResult = poiResult; this.numType=numType; } @Override public final List<OverlayOptions> getOverlayOptions() { if (mPoiResult == null || mPoiResult.getAllPoi() == null) { return null; } List<OverlayOptions> markerList = new ArrayList<>(); int markerSize = 0; for (int i = 0; i < mPoiResult.getAllPoi().size() && markerSize < MAX_POI_SIZE; i++) { if (mPoiResult.getAllPoi().get(i).location == null) { continue; } markerSize++; Bundle bundle = new Bundle(); bundle.putInt("index", i); //本身修改,判斷最後一個,最後一個爲本身添加的座標地點 if (i==mPoiResult.getAllPoi().size()-1){ markerList.add(new MarkerOptions() //動態切換不一樣的圖標信息 // .icon(BitmapDescriptorFactory.fromAssetWithDpi("Icon_mark" + markerSize + ".png")) .icon(BitmapDescriptorFactory.fromResource(R.mipmap.mapdian)) .extraInfo(bundle) .position(mPoiResult.getAllPoi().get(i).location)); }else{ //判斷要顯示那種圖標 if (numType==1){//A也就是超市 markerList.add(new MarkerOptions() //動態切換不一樣的圖標信息 // .icon(BitmapDescriptorFactory.fromAssetWithDpi("Icon_mark" + markerSize + ".png")) .icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_marka)) .extraInfo(bundle) .position(mPoiResult.getAllPoi().get(i).location)); }else if (numType==2){//B也就是地鐵 markerList.add(new MarkerOptions() //動態切換不一樣的圖標信息 // .icon(BitmapDescriptorFactory.fromAssetWithDpi("Icon_mark" + markerSize + ".png")) .icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_markb)) .extraInfo(bundle) .position(mPoiResult.getAllPoi().get(i).location)); }else if (numType==3){//C 也就是學校 markerList.add(new MarkerOptions() //動態切換不一樣的圖標信息 // .icon(BitmapDescriptorFactory.fromAssetWithDpi("Icon_mark" + markerSize + ".png")) .icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_markc)) .extraInfo(bundle) .position(mPoiResult.getAllPoi().get(i).location)); } } } return markerList; } /** * 獲取該PoiOverlay的poi數據 * * @return POI數據 */ public PoiResult getPoiResult() { return mPoiResult; } /** * 覆寫此方法以改變默認點擊行爲 * * @param i 被點擊的poi在 * {@link PoiResult#getAllPoi()} 中的索引 * @return true--事件已經處理,false--事件未處理 */ public boolean onPoiClick(int i) { // if (mPoiResult.getAllPoi() != null // && mPoiResult.getAllPoi().get(i) != null) { // Toast.makeText(BMapManager.getInstance().getContext(), // mPoiResult.getAllPoi().get(i).name, Toast.LENGTH_LONG) // .show(); // } return false; } @Override public final boolean onMarkerClick(Marker marker) { if (!mOverlayList.contains(marker)) { return false; } if (marker.getExtraInfo() != null) { return onPoiClick(marker.getExtraInfo().getInt("index")); } return false; } @Override public boolean onPolylineClick(Polyline polyline) { return false; } }
顯示不一樣的Icon是根據構造的時候傳遞的numType來進行判斷的,固然能夠有不一樣的實現方式,這裏我是用的傳參來進行Icon的判斷
主要的判斷方法是這裏,由於我在上邊,把當前的定位放在了最後一個,這裏要判斷最後一個,而後添加不一樣的點,而後再根據numType來判斷顯示其餘類型的圖片
到這裏能實現的功能是檢索當前位置,周邊信息的檢索,代碼寫的比較亂,也沒有整理,小bug也沒改。。。
主要是到點了,要下班啦,此博客記錄POI檢索功能的簡單實現,記錄一下
有問題或者有更好的建議歡迎大家留言,或者發送郵件到個人郵箱 dingchao7323@qq.com
撒呦哪啦~跑路