百度地圖周邊檢索功能的一些設置及自定義marker點

根據項目需求,要在地圖上標記兩種座標點,根據這個需求需要對不同來源的座標分類顯示。下圖是效果圖:


我使用的是最新的4.3.1版本的百度sdk,首先需要去百度地圖api開發平臺註冊登陸,要想使用百度地圖還要申請key:

1.開發環境配置:


只需要將下載的sdk libs文件夾中相應的so文件和jar包考到自己的項目中並添加每個jar包的依賴;


2.在AndroidManifest.xml文件中要添加一些權限和 key的設置:

添加所需權限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS" />	

在application中添加開發密鑰

<application>  
    <meta-data  
        android:name="com.baidu.lbsapi.API_KEY"  
        android:value="開發者 key" />  
</application>

3. 對應在build.gradle生成工程所依賴的jar,並需要添加如下設置,否則會報錯

sourceSets {
    main {
        jniLibs.srcDirs = ['libs']
    }
}

至此百度sdk的基本配置已經完成了 下面介紹如何使用:

首先需要在對應的activity 或者 Application 的 onCreate方法之後初始化sdk,還可以設置返回的左邊類型

SDKInitializer.initialize(getApplicationContext());
SDKInitializer.setCoordType(CoordType.GCJ02);//默認爲BD09LL座標

佈局xml文件中添加地圖控件;

<com.baidu.mapapi.map.MapView
    android:id="@+id/baidumaps"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:clickable="true" />

在activity中初始化

private MapView mapView;
private BaiduMap baiduMap;
PoiSearch mPoiSearch;

mapView = (MapView) findViewById(R.id.baidumaps);
//BaiduMap管理具體的某一個MapView: 旋轉,移動,縮放,事件。。。
baiduMap = mapView.getMap();
//設置縮放級別,默認級別爲12
MapStatusUpdate mapstatusUpdate = MapStatusUpdateFactory.zoomTo(19);
baiduMap.setMapStatus(mapstatusUpdate);
mPoiSearch = PoiSearch.newInstance();
mPoiSearch.setOnGetPoiSearchResultListener(poiListener);
nearbySearch(1);
設置一下基本參數之後就可以調用

/**
 * 附近檢索
 */
private void nearbySearch(int page) {
    PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption();
    //120.220854,30.259387
    nearbySearchOption.location(new LatLng(latitude,longitude));
    nearbySearchOption.keyword("超市");//小吃快餐
    nearbySearchOption.radius(10000);// 檢索半徑,單位是米
    nearbySearchOption.pageNum(page);
    nearbySearchOption.pageCapacity(500);
    mPoiSearch.searchNearby(nearbySearchOption);// 發起附近檢索請求
}

還要對mPoiSearch設置監聽方法:

 OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener(){
        public void onGetPoiResult(PoiResult result){
            if (result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
                Toast.makeText(ShopMapActivity.this, "沒有搜索到結果...",
                        Toast.LENGTH_LONG).show();
            }

            else {
                baiduMap.clear();
                // 得到具體地址的座標
 		// 此處是設置藍色標記的方法 
                for(int i=0;i<result.getAllPoi().size();i++) {
                    PoiInfo pos = result.getAllPoi().get(i);

                    LatLng lat = pos.location;
                    // 得到一個標記的控制器
                    MarkerOptions mMarkerOptions = new MarkerOptions();
                    // 我們設置標記的時候需要傳入的參數
                    BitmapDescriptor mbitmapDescriptor = BitmapDescriptorFactory
                            .fromResource(R.mipmap.location_blue);
                    // 設置標記的圖標
                    mMarkerOptions.icon(mbitmapDescriptor);
                    // 設置標記的座標
                    mMarkerOptions.position(lat);
                    mMarkerOptions.title(pos.name);
                    // 添加標記
                    baiduMap.addOverlay(mMarkerOptions);
                    // 設置地圖跳轉的參數
                    MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory
                            .newLatLngZoom(lat, 15);
                    // 設置進行地圖跳轉
                    baiduMap.setMapStatus(mMapStatusUpdate);
                }                                  

紅色標記點的設置 這裏的list是一些模擬數據

for(int i=0;i<list.size();i++) {
    PoiInfo pos = result.getAllPoi().get(i);
    LatLng lat = list.get(i);
    // 得到一個標記的控制器
    MarkerOptions mMarkerOptions = new MarkerOptions();
    // 我們設置標記的時候需要傳入的參數
    BitmapDescriptor mbitmapDescriptor = BitmapDescriptorFactory
            .fromResource(R.mipmap.location_red);
    // 設置標記的圖標
    mMarkerOptions.icon(mbitmapDescriptor);
    // 設置標記的座標
    mMarkerOptions.position(lat);
    mMarkerOptions.title(pos.name);
    // 添加標記
    baiduMap.addOverlay(mMarkerOptions);
    // 設置地圖跳轉的參數
    MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory
            .newLatLngZoom(lat, 15);
    // 設置進行地圖跳轉
    baiduMap.setMapStatus(mMapStatusUpdate);
}
	baiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
                        @Override
                        public void onMapClick(LatLng latLng) {
                            baiduMap.hideInfoWindow();
                        }

                        @Override
                        public boolean onMapPoiClick(MapPoi mapPoi) {
                            return false;
                        }
                    });
                    baiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
                        @Override
                        public boolean onMarkerClick(Marker marker) {
                            showLocation(marker);//點擊marker顯示詳細信息
//                           
                            return true;
                        }
                    });
            }
            progressDialog.dismiss();
        }

        public void onGetPoiDetailResult(PoiDetailResult result){
            //獲取Place詳情頁檢索結果
            progressDialog.dismiss();
        }

        @Override
        public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
            progressDialog.dismiss();
        }
    };
 private void showLocation(final Marker marker) {  //顯示氣泡
        // 創建InfoWindow展示的view
        LatLng pt = null;
        double latitude, longitude;
        latitude = marker.getPosition().latitude;
        longitude = marker.getPosition().longitude;
        InfoWindow infoWindow;
        TextView tv = new TextView(ShopMapActivity.this);
        tv.setBackgroundResource(R.drawable.change_btn_bg_gray);
        tv.setPadding(30, 20, 30, 20);// 大小
        tv.setText( marker.getTitle());
        tv.setTextColor(Color.parseColor("#000000"));
        final LatLng latLng = marker.getPosition();
        Point p = baiduMap.getProjection().toScreenLocation(latLng);
        p.y -= 47;
        LatLng ll = baiduMap.getProjection().fromScreenLocation(p);
        mInfoWindow = new InfoWindow(tv, ll, 1);
        baiduMap.showInfoWindow(mInfoWindow); //顯示氣泡

    }

protected void initData(Bundle savedInstanceState) {
    list.add(new LatLng(31.172713399983827,121.48811344710886));
    list.add(new LatLng(31.179060850684824,121.50363668006136));
    list.add(new LatLng(31.17131410477326,121.49315948551842));
    list.add(new LatLng(31.176633393276752,121.48780798968677));
    list.add(new LatLng(31.178353120267477,121.47352839282098));
}

最終實現的效果:


如果有ui刷新的操作 對空件的requestFocus請求將會失效  需要做個延遲操作

goodsSearch.postDelayed(new Runnable() {
public void run() {
etAddGoods.requestFocus();
}
},500);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章