最近在做百度地图的一个应用。只能说智商有限,百度的官方demo确实没有看懂。朋友给了一个demo,简单,好用。自己整理了下思路,写出来,免得下次忘记。
第一步、正确导入百度的jar。
第二步、请在mainactivity里写入SDKInitializer.initialize(getApplicationContext());
一定要写在setContentView(R.layout.activity_main);之前。要不就那个页面用百度地图就在哪个页面写,比较麻烦。
第三步、定位。
3、1 获得mapview 对象 mapView=(MapView) findViewById(R.id.mapview_nearby);
3、2 BaiduMap baiduMap=mapView.getMap();
3、3 实例化位置对象:locationClient=new LocationClient(getActivity());
3、4 创建设置定位参数的对象:LocationClientOption locationClientOption=new LocationClientOption();
3、5设置当前定位的模式:
高精度定位模式:这种定位模式下,会同时使用网络定位和GPS定位,优先返回最高精度的定位结果;Hight_Accuracy
低功耗定位模式:这种定位模式下,不会使用GPS,只会使用网络定位(Wi-Fi和基站定位)Battery_Saving
仅用设备定位模式:这种定位模式下,不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位 Device_Sensors
locationClientOption.setLocationMode(LocationMode.Battery_Saving);
设置当前定位使用的坐标系
返回国测局经纬度坐标系 coor=gcj02
返回百度墨卡托坐标系 coor=bd09
返回百度经纬度坐标系 coor=bd09ll
locationClientOption.setCoorType("bd09ll");
//设置两次定位的间隔时间 指定间隔的毫秒值
locationClientOption.setScanSpan(1000);
//设置定位的超时时间
locationClientOption.setTimeOut(3000);
locationClientOption.setIsNeedAddress(true);//返回的定位结果包含地址信息
locationClientOption.setNeedDeviceDirect(true);//返回的定位结果包含手机机头的方向
3、6://将当前设置的options定位的设置设置到定位对象中
locationClient.setLocOption(locationClientOption);
3、7
//位置接收器对象注册位置监听
locationClient.registerLocationListener(new BDLocationListener() {
//接收定位获取的位置信息 将位置信息回传
@Override
public void onReceiveLocation(BDLocation dbBdLocation) {
//在定位的结果对象中获取当前位置的经纬度
latLng=new LatLng(dbBdLocation.getLatitude(), dbBdLocation.getLongitude());
Log.i(TAG, "当前定位纬度是-------"+latLng.latitude);
Log.i(TAG, "当前定位经度是--------------"+latLng.longitude);
//执行搜索
poiSearch();
//将当前定位内容添加到地图
BitmapDescriptor bitmapDescriptor=BitmapDescriptorFactory.fromResource(R.drawable.ico_map_location);
OverlayOptions overlayOptions=new MarkerOptions().icon(bitmapDescriptor).position(latLng);
baiduMap.clear();
baiduMap.addOverlay(overlayOptions);
}
});
3、8启动定位
locationClient.start();
if(locationClient!=null &&locationClient.isStarted()){
locationClient.requestLocation();//发送定位请求
}
第四步、搜索
4、1实例化poi检索器
poiSearch=PoiSearch.newInstance();
4、2
//poiSearch绑定poi检索获取结果的监听
poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
//表示当poi检索获取到具体的数据结果时会回调该方法 并且将检索的结果PoiResult对象回传
@Override
public void onGetPoiResult(PoiResult poiresult) {
//1.创建显示poi检索结果的图层
MyPoiOverlay poiOverlay=new MyPoiOverlay(baiduMap);
//2.将poi检索结果添加到图层
poiOverlay.setData(poiresult);
baiduMap.setOnMarkerClickListener(poiOverlay);
//3.将具有poi检索结果的图层添加到地图中
poiOverlay.addToMap();
poiOverlay.zoomToSpan();
}
//表示当poi检索获取到结果的详情时会回调该方法 并且将检索结果的详情PoiDetailResult回传
//poiSearch.searchPoiDetail()之后
@Override
public void onGetPoiDetailResult(PoiDetailResult poidetailresult) {
// Intent intent=new Intent(PoiSearchActivity.this, PoiSearchResultActivity.class);
// //获取当前的详情对应的url地址
// intent.putExtra("detailUrl", poidetailresult.getDetailUrl());
// startActivity(intent);
}
});
4、3
//调用相应的方法启动poi检索 PoiCitySearchOption 按照城市查询的查询条件对象 city(查询城市名称).keyword(查询的关键字)
poiSearch.searchInCity(new PoiCitySearchOption().city("北京").keyword("美食"));
//poiSearch.searchNearby(arg0) 周边查询 PoiNearbySearchOption
//poiSearch.searchNearby(new PoiNearbySearchOption().location(null).keyword(arg0))
//poiSearch.searchInBound(arg0) 区域检索 PoiBoundSearchOption
//poiSearch.searchInBound(new PoiBoundSearchOption().bound(arg0));
4、4
//自定义PoiOverlay
public class MyPoiOverlay extends PoiOverlay{
public MyPoiOverlay(BaiduMap arg0) {
super(arg0);
}
//表示当前的PoiOverlay设置setOnMarkerClickListener监听事件时 当点击PoiOverlay中的marker时就会调用该方法
@Override
public boolean onPoiClick(int position) {
//先通过getPoiResult()方法获取当前的PoiOverlay中的所有的结果 然后调用getAllPoi()获取图层中的所有的PoiInfo
List<PoiInfo> list=getPoiResult().getAllPoi();
poiInfo=list.get(position);
Button button=new Button(PoiSearchActivity.this);
button.setBackgroundColor(Color.GRAY);
button.setText(poiInfo.name);
BitmapDescriptor descriptor=BitmapDescriptorFactory.fromView(button);
InfoWindow infoWindow=new InfoWindow(descriptor, poiInfo.location, -35, new InfoWindow.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick() {
poiSearch.searchPoiDetail(new PoiDetailSearchOption().
poiUid(poiInfo.uid));//PoiDetailSearchOption 获取当前点击的InfoWindow所对应的详情
baiduMap.hideInfoWindow();
}
});
baiduMap.showInfoWindow(infoWindow);
return true;
}
}
尾声:因为项目需要,需要删除-+和放大镜的标志。
标志什么的去除,请移步:http://zhidao.baidu.com/link?url=tFfOcc-Hd-6sK7Pl9QWi7tVeQXYeY_l-xWtopunwta6FCSsNSQMN9nTgCkpmAp6A3XplpwbyqFNJcS-NG7pii_OfT7jmRmfzH7abeA_pi5e
写的比较匆忙,如果发现错误请指正。