百度地图周边检索功能的一些设置及自定义marker点

来源:互联网 发布:照片处理器软件下载 编辑:程序博客网 时间:2024/05/21 19:43

根据项目需求,要在地图上标记两种坐标点,根据这个需求需要对不同来源的坐标分类显示。下图是效果图:


我使用的是最新的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();//设置缩放级别,默认级别为12MapStatusUpdate 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);

阅读全文
1 0