検索機能とカスタムマーカーポイントを囲むバイドゥマップのいくつかの設定

プロジェクトのニーズに応じて、2種類の座標点をマップ上にマークする必要があります。この要件に従って、さまざまなソースの座標を分類して表示する必要があります。次の図はレンダリングです。


Baidu SDKの最新バージョン4.3.1を使用しています。まず、BaiduマップAPI開発プラットフォームにアクセスして、登録とログインを行う必要があります。Baiduマップを使用するには、キーを申請する必要があります。

1.開発環境の構成:


ダウンロードしたsdk libsフォルダー内の対応するsoファイルとjarパッケージを独自のプロジェクトにテストし、各jarパッケージの依存関係を追加するだけです。


2. AndroidManifest.xmlファイルにいくつかの権限とキー設定を追加します。

必要な権限を追加する

<使用-許可android name = "android.permission.ACCESS_NETWORK_STATE" /> 
<使用-許可android name = "android.permission.INTERNET" /> 
<使用-許可android name = "com.android.launcher.permission .READ_SETTINGS "  /> 
<使用-許可android name = " android.permission.WAKE_LOCK " /> 
<使用-許可android 名前= "android.permission.CHANGE_WIFI_STATE"  /> 
<使用-許可android name = "android.permission.ACCESS_WIFI_STATE"  /> 
<使用-許可android name = "android.permission.GET_TASKS"  /> 
<使用-許可android name = "android.permission.WRITE_EXTERNAL_STORAGE" /> 
<使用-権限android name = "android.permission.WRITE_SETTINGS"  />	

アプリケーションに開発キーを追加する

< application >   
    < meta - data   
        android name = "com.baidu.lbsapi.API_KEY"   
        android  value = "开发者key"  />   
</ application >

3.  build.gradleでビルドプロジェクトが依存するjarに対応し、次の設定を追加する必要があります。追加しない場合、エラーが報告されます

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

以上でBaidu SDKの基本設定は完了ですので、以下にその使い方を説明します。

まず、対応するアクティビティまたはアプリケーションのonCreateメソッドの後にSDKを初期化する必要があります。また、返される左側のタイプを設定することもできます。

。SDKInitializer 初期化(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" / >                    

アクティビティで初期化

private MapView mapView;
private BaiduMap baiduMap;
PoiSearch mPoiSearch;

mapView = (MapView) findViewById(R.id.baidumaps);
// BaiduMapは特定のMapViewを管理します:回転、移動、スケーリング、イベント。baiduMap = のMapView .getMap();
 //ズームレベルを設定し、12のデフォルトレベルである
。MapStatusUpdate mapstatusUpdate = MapStatusUpdateFactory ZoomTo19;
 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);

发布了29 篇原创文章 · 获赞 40 · 访问量 3万+

おすすめ

転載: blog.csdn.net/xiyunmengyuan/article/details/75386127