百度地图,百度定位。
2015-09-22 20:24
211 查看
百度地图
百度地图是第三方的东西,由百度提供接口,我们只要用他的接口就可以了。环境搭配
在百度地图的API中下载相关的实例,在实例中的libs中粘贴1)baidumapapi_v3_5_0.jarhe和locSDK_5.2.jar这两个jar包到我们的libs中。将所有的so文件粘贴过来,在我们的main中建立一个jniLibs文件夹,将so文件拷入这个文件夹中。2)将jar包导入。
申请密钥
具体的过程在百度中说的非常清楚,这里不再讨论,只是注意包名一定要是你的工程的文件,debug码在copy的时候前后不要有空格。当我们按照百度的提示写好代码后就可以出现百度地图了,有关百度地图的其他功能都在demo中有提及,这里我们主要讲search地点,在我们输入地址的名称后,可以在地图中显示出来。还可以在两点之间画直线。在demo的GeoCoderDemo中是有关地理编码功能的例子。
反Geo搜索是什么我也不知道。这里理顺一下思路:
地理编码
1)获得GeoCoder的实例mSearch。GeoCoder mSearch = null; // 搜索模块,也可去掉地图模块独立使用 mSearch = GeoCoder.newInstance();
2)设置mSearch 的监听事件,在监听事件中有两个方法onGetGeoCodeResult()是获得Geo搜索的结果,另一个onGetReverseGeoCodeResult()获得反Geo搜索的结果。
通过:
mBaiduMap.addOverlay(new MarkerOptions().position(result.getLocation()) .icon(BitmapDescriptorFactory .fromResource(R.mipmap.icon_marka))); mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(result .getLocation()));
在所寻找的点上标有图标,R.mipmap.icon_marka,就是那个图标。
通过:
result.getLocation().latitude, result.getLocation().longitude
获得维度和经度。
完整的代码如下:
//对mSearch加入监听事件。 mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() { @Override public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) { if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) { Toast.makeText(MainActivity.this, "抱歉,未能找到结果", Toast.LENGTH_LONG) .show(); return; } mbaidu.clear(); mbaidu.addOverlay(new MarkerOptions().position(geoCodeResult.getLocation()) .icon(BitmapDescriptorFactory .fromResource(R.mipmap.pp))); mbaidu.setMapStatus(MapStatusUpdateFactory.newLatLng(geoCodeResult .getLocation())); String strInfo = String.format("纬度:%f 经度:%f", geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude); Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show(); if(count==1){ LatLng point1 = new LatLng(geoCodeResult.getLocation().latitude,geoCodeResult.getLocation().longitude); points.add(point1); }else if(count==2){ LatLng point2 = new LatLng(geoCodeResult.getLocation().latitude,geoCodeResult.getLocation().longitude); points.add(point2); } } @Override public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) { } }); }
这里的 mbaidu = mMapView.getMap();//会的map实例。
通过mMapView.getMap()获得百度地图的实例。
这里的 LatLng point2 = new LatLng(geoCodeResult.getLocation().latitude,geoCodeResult.getLocation().longitude);是LatLng 是以经纬度确定的点。在画线的时候会用到。
在button的点击事件中输入地址就可以找到我们想找的结果了。
mSearch.geocode(new GeoCodeOption().city("北京").address("中关村"));
当点击的时候会定位到我们需要的点。
在地图中划线
demo中GeometryDemo是换各种图形的示例:public void addCustomElementsDemo() { // 添加折线 LatLng p1 = new LatLng(39.97923, 116.357428); LatLng p2 = new LatLng(39.94923, 116.397428); LatLng p3 = new LatLng(39.97923, 116.437428); List<LatLng> points = new ArrayList<LatLng>(); points.add(p1); points.add(p2); points.add(p3); OverlayOptions ooPolyline = new PolylineOptions().width(10) .color(0xAAFF0000).points(points); mBaiduMap.addOverlay(ooPolyline);
从上面的代码可以看到是非常清晰的,
1)将要连接的点通过LatLng 实例获得经纬度点,
2)将这些点add到list中,剩下的代码就不是我们关心的问题了。
定位
定位并不是百度地图的功能必须另外下载SDK;注意当地图鱼定位同时在一个项目中的时候,注意libs的SDKjar只需要最新的就可以了。比如说6.02.so文件也是这样删掉5.0的保留6.0的不可以都存在。
具体的就不写了,可以看百度的SDK,这里只说一下思路:
1)获得LocationClient的实例,并对实例进行注册监听:
mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类 mLocationClient.registerLocationListener( myListener ); //注册监听函数
我们再myListener 的实例中可以得到我们的位置:
public BDLocationListener myListener = new MyLocationListener();
class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { mytextview.setText(location.getAddress().address); array[4]= location.getLatitude(); array[5]= location.getLongitude(); LatLng point = new LatLng(location.getLatitude(),location.getLongitude()); points.add(point); mbaidu.addOverlay(new MarkerOptions().position(point) .icon(BitmapDescriptorFactory .fromResource(R.mipmap.pp))); mbaidu.setMapStatus(MapStatusUpdateFactory.newLatLng(point)); StringBuffer sb = new StringBuffer(256); sb.append("time : "); sb.append(location.getTime()); sb.append("\nerror code : "); sb.append(location.getLocType()); sb.append("\nlatitude : "); sb.append(location.getLatitude()); sb.append("\nlontitude : "); sb.append(location.getLongitude()); sb.append("\nradius : "); sb.append(location.getRadius()); if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果 sb.append("\nspeed : "); sb.append(location.getSpeed());// 单位:公里每小时 sb.append("\nsatellite : "); sb.append(location.getSatelliteNumber()); sb.append("\nheight : "); sb.append(location.getAltitude());// 单位:米 sb.append("\ndirection : "); sb.append(location.getDirection());// 单位度 sb.append("\naddr : "); sb.append(location.getAddrStr()); sb.append("\ndescribe : "); sb.append("gps定位成功"); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果 sb.append("\naddr : "); sb.append(location.getAddrStr()); //运营商信息 sb.append("\noperationers : "); sb.append(location.getOperators()); sb.append("\ndescribe : "); sb.append("网络定位成功"); } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果 sb.append("\ndescribe : "); sb.append("离线定位成功,离线定位结果也是有效的"); } else if (location.getLocType() == BDLocation.TypeServerError) { sb.append("\ndescribe : "); sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因"); } else if (location.getLocType() == BDLocation.TypeNetWorkException) { sb.append("\ndescribe : "); sb.append("网络不同导致定位失败,请检查网络是否通畅"); } else if (location.getLocType() == BDLocation.TypeCriteriaException) { sb.append("\ndescribe : "); sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机"); } sb.append("\nlocationdescribe : "); sb.append(location.getLocationDescribe());// 位置语义化信息 List<Poi> list = location.getPoiList();// POI数据 if (list != null) { sb.append("\npoilist size = : "); sb.append(list.size()); for (Poi p : list) { sb.append("\npoi= : "); sb.append(p.getId() + " " + p.getName() + " " + p.getRank()); } } Log.i("BaiduLocationApiDem", sb.toString()); mLocationClient.stop(); } }
这里location.getAddress().address就可以获得我们的地理位置的名称。
2)初始化
initLocation();
3)start:
mLocationClient.start();
这样就结束了。
相关文章推荐
- Android第三方控件——百度地图的使用
- MySQL Meta中的length字段 -- (2) length的推导
- 利用bootstrap Grid栅格系统的向下缩小特性排版
- 在Android中使用IOC框架让代码更清爽
- UVA 10518 How Many Calls?
- 模板(泛型)
- Jvm垃圾回收机制
- get请求返回中文乱码问题
- SoundPool的使用技巧
- zoj3609
- bitset 使用指南
- iOS经典讲解之多线程应用场景
- MySQL的分层数据管理与无限级分类
- 简易指南针
- oracle_控制用户权限
- Jvm垃圾回收机制
- Android组件系列----Intent详解
- 0917 实验一词法分析程序
- Mongodb安装为32位windows服务
- C# list 多条件排序