之前使用过一些第三方的地图api,最后还是觉得百度的比较好用,刚好最近做一个项目,需要用到地图的功能,也比较简单,就是获取当前位置,然后可以自己手动在地图上选择位置,把经纬度丢给服务端。我用的就是百度地图
下面就开始做了,注册开发者账号、申请key、下载SDK什么的,就不说了,官网上说的很清楚。就直接贴代码了:
我先建了一个类,继承Application,里面就一行代码,初始化地图。
[java]
view plain
copy
public class LocationApp extends Application { @Override public void onCreate() { super.onCreate(); SDKInitializer.initialize(getApplicationContext()); } }
为什么地图初始化的方法要写这里,因为文档里做了说明:
然后就是主类了,里面我先贴一部分代码,完整的之后在文章最后面有下载链接。
首先要在main.xml里面把地图的控件给加上:
[html]
view plain
copy
然后在Main.java中,对这个控件进行一些初始化,就可以展示一张最基本的地图了。
[java]
view plain
copy
private MapView mapView; private BaiduMap baiduMap;
[java]
view plain
copy
mapView = (MapView) findViewById(R.id.bmapView); baiduMap = mapView.getMap(); baiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(17));//地图缩放级别为17
就这样就可以了,运行的话,应该就可以看到位置在北京的地图。
当然这只是最简单了,还要有定位的功能,定位出来后,要在地图上把这个点标出来,然后把地图移动到这个点的位置。
[java]
view plain
copy
private LocationClient locationClient; private BDLocationListener listener = new MyLocationListener();
[java]
view plain
copy
locationClient = new LocationClient(getApplicationContext()); locationClient.registerLocationListener(listener); initLocation();
[java]
view plain
copy
// 初始化定位参数 private void initLocation(){ LocationClientOption option = new LocationClientOption(); option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系 int span=1000; option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的 option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要 option.setOpenGps(true);//可选,默认false,设置是否使用gps option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果 option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果 option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果 option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死 option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集 option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要 locationClient.setLocOption(option); locationClient.start(); }
[java]
view plain
copy
// 定位监听 public class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation loc) { if (loc != null && (loc.getLocType() == 161 || loc.getLocType() == 66)) { //这里得到BDLocation就是定位出来的信息了 } else { Toast.makeText(MainActivity.this, "定位失败,请检查手机网络或设置!", Toast.LENGTH_LONG).show(); } } }
上面的这些代码,就是定位的代码了,在MyLocationListener里面,BDLocation有值的话,就说明定位成功了。下面附上BDLocation的说明,想得到什么信息,都可以去得到:
内容就不贴了,太长了,直接给个网站,打开就可以了:百度API
既然定位的信息得到了,就要在地图上添加个标注,显示当前位置:
[java]
view plain
copy
LatLng point = new LatLng(location.getLatitude(), location.getLongitude()); setMapOverlay(point); baiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(point));
[java]
view plain
copy
// 在地图上添加标注 private void setMapOverlay(LatLng point) { latitude = point.latitude; longitude = point.longitude; baiduMap.clear(); BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_openmap_mark); OverlayOptions option = new MarkerOptions().position(point).icon(bitmap); baiduMap.addOverlay(option); }
这样就可以了,显示的结果就是下面这样的:
这样就满足了第一个需求,就是获取当前位置,并在地图上显示出来。第二个需求就是要能自己在地图上选点,比如现在自动定的位置,不想让服务端知道在这里,要换一个,就可以把地图拖动到其他地方,选择自己想要的位置,点一下,就可以了。
这个功能实现起来也比较简单,给地图添加一个OnMapClickListener点击事件就可以了:
[java]
view plain
copy
baiduMap.setOnMapClickListener(new OnMapClickListener() { @Override public boolean onMapPoiClick(MapPoi poi) { return false; } @Override public void onMapClick(LatLng point) { Log.d("map click", point.longitude+","+point.latitude); setMapOverlay(point); getInfoFromLAL(point); } });
[java]
view plain
copy
// 根据经纬度查询位置 private void getInfoFromLAL(final LatLng point) { pb.setVisibility(View.VISIBLE); infoText.setText("经度:"+point.latitudeE6+",纬度"+point.latitudeE6); GeoCoder gc = GeoCoder.newInstance(); gc.reverseGeoCode(new ReverseGeoCodeOption().location(point)); gc.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() { @Override public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) { pb.setVisibility(View.GONE); if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { Log.e("发起反地理编码请求", "未能找到结果"); } else { infoText.setText("经度:"+point.latitudeE6+",纬度"+point.latitudeE6 +"\n"+result.getAddress()); } } @Override public void onGetGeoCodeResult(GeoCodeResult result) { } }); }
这样就OK了。选择其他地方的一个点,就可以得到该点的位置了:
完事了,功能比较简单,附上源码下载地址:
csdn下载
项目放到eclipse中后,一定要在AndroidManifest.xml中把自己申请的key加上。
|