使用百度地图api实现定位及选择位置功能

之前使用过一些第三方的地图api,最后还是觉得百度的比较好用,刚好最近做一个项目,需要用到地图的功能,也比较简单,就是获取当前位置,然后可以自己手动在地图上选择位置,把经纬度丢给服务端。我用的就是百度地图

下面就开始做了,注册开发者账号、申请key、下载SDK什么的,就不说了,官网上说的很清楚。就直接贴代码了:

我先建了一个类,继承Application,里面就一行代码,初始化地图。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public class LocationApp extends Application {  
  2.   
  3.     @Override  
  4.     public void onCreate() {  
  5.         super.onCreate();  
  6.         SDKInitializer.initialize(getApplicationContext());  
  7.     }  
  8.       
  9. }  

为什么地图初始化的方法要写这里,因为文档里做了说明:


然后就是主类了,里面我先贴一部分代码,完整的之后在文章最后面有下载链接。

首先要在main.xml里面把地图的控件给加上:

[html]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <com.baidu.mapapi.map.MapView    
  2.         android:id="@+id/bmapView"    
  3.         android:layout_width="match_parent"    
  4.         android:layout_height="match_parent"    
  5.         android:clickable="true" />  

然后在Main.java中,对这个控件进行一些初始化,就可以展示一张最基本的地图了。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private MapView mapView;  
  2. private BaiduMap baiduMap;  

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. mapView = (MapView) findViewById(R.id.bmapView);  
  2. baiduMap = mapView.getMap();  
  3. baiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(17));//地图缩放级别为17  

就这样就可以了,运行的话,应该就可以看到位置在北京的地图。

当然这只是最简单了,还要有定位的功能,定位出来后,要在地图上把这个点标出来,然后把地图移动到这个点的位置。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private LocationClient locationClient;  
  2. private BDLocationListener listener = new MyLocationListener();  
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. locationClient = new LocationClient(getApplicationContext());  
  2. locationClient.registerLocationListener(listener);  
  3. initLocation();  
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 初始化定位参数  
  2. private void initLocation(){  
  3.         LocationClientOption option = new LocationClientOption();  
  4.         option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系  
  5.         int span=1000;  
  6.         option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的  
  7.         option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要  
  8.         option.setOpenGps(true);//可选,默认false,设置是否使用gps  
  9.         option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果  
  10.         option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果  
  11.         option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果  
  12.         option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死  
  13.         option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集  
  14.         option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要  
  15.         locationClient.setLocOption(option);  
  16.         locationClient.start();  
  17.     }  
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 定位监听  
  2. public class MyLocationListener implements BDLocationListener {  
  3.   
  4.     @Override  
  5.     public void onReceiveLocation(BDLocation loc) {  
  6.         if (loc != null && (loc.getLocType() == 161 || loc.getLocType() == 66)) {  
  7.             //这里得到BDLocation就是定位出来的信息了  
  8.         } else {  
  9.             Toast.makeText(MainActivity.this"定位失败,请检查手机网络或设置!", Toast.LENGTH_LONG).show();  
  10.         }  
  11.     }  
  12.           
  13. }  

上面的这些代码,就是定位的代码了,在MyLocationListener里面,BDLocation有值的话,就说明定位成功了。下面附上BDLocation的说明,想得到什么信息,都可以去得到:

内容就不贴了,太长了,直接给个网站,打开就可以了:百度API

既然定位的信息得到了,就要在地图上添加个标注,显示当前位置:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. LatLng point = new LatLng(location.getLatitude(), location.getLongitude());  
  2. setMapOverlay(point);  
  3. baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(point));  
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 在地图上添加标注  
  2. private void setMapOverlay(LatLng point) {  
  3.     latitude = point.latitude;  
  4.     longitude = point.longitude;  
  5.           
  6.     baiduMap.clear();  
  7.     BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_openmap_mark);  
  8.     OverlayOptions option = new MarkerOptions().position(point).icon(bitmap);  
  9.     baiduMap.addOverlay(option);  
  10. }  

这样就可以了,显示的结果就是下面这样的:


这样就满足了第一个需求,就是获取当前位置,并在地图上显示出来。第二个需求就是要能自己在地图上选点,比如现在自动定的位置,不想让服务端知道在这里,要换一个,就可以把地图拖动到其他地方,选择自己想要的位置,点一下,就可以了。

这个功能实现起来也比较简单,给地图添加一个OnMapClickListener点击事件就可以了:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. baiduMap.setOnMapClickListener(new OnMapClickListener() {  
  2.               
  3.         @Override  
  4.         public boolean onMapPoiClick(MapPoi poi) {  
  5.                   
  6.             return false;  
  7.         }  
  8.               
  9.         @Override  
  10.         public void onMapClick(LatLng point) {  
  11.             Log.d("map click", point.longitude+","+point.latitude);  
  12.             setMapOverlay(point);  
  13.             getInfoFromLAL(point);  
  14.         }  
  15. });  
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 根据经纬度查询位置  
  2.     private void getInfoFromLAL(final LatLng point) {  
  3.         pb.setVisibility(View.VISIBLE);  
  4.         infoText.setText("经度:"+point.latitudeE6+",纬度"+point.latitudeE6);  
  5.         GeoCoder gc = GeoCoder.newInstance();  
  6.         gc.reverseGeoCode(new ReverseGeoCodeOption().location(point));  
  7.         gc.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {  
  8.               
  9.             @Override  
  10.             public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {  
  11.                 pb.setVisibility(View.GONE);  
  12.                 if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {  
  13.                     Log.e("发起反地理编码请求""未能找到结果");  
  14.                 } else {  
  15.                     infoText.setText("经度:"+point.latitudeE6+",纬度"+point.latitudeE6  
  16.                             +"\n"+result.getAddress());  
  17.                 }  
  18.             }  
  19.               
  20.             @Override  
  21.             public void onGetGeoCodeResult(GeoCodeResult result) {  
  22.                   
  23.             }  
  24.         });  
  25.     }  

这样就OK了。选择其他地方的一个点,就可以得到该点的位置了:

完事了,功能比较简单,附上源码下载地址: csdn下载

项目放到eclipse中后,一定要在AndroidManifest.xml中把自己申请的key加上。
  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值