百度地图周边检索功能的一些设置及自定义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);

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

猜你喜欢

转载自blog.csdn.net/xiyunmengyuan/article/details/75386127