对地图的基本操作,标注地址,公交步行驾车路线搜索,附近搜索,反编译地址,屏幕坐标与地图经纬度的转换等(2)
秘钥申请以及地图的显示可以参考百度地图的秘钥申请与sdk下载,显示地图(1) ,该功能也是接着这个开始的
需要的工具包如下:(下载的百度地图sdk里包含的)
功能:显示标注:
public class MainActivity extends AppCompatActivity { private MapView mMapView = null; private BaiduMap mBaiduMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext,注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); //获取xml布局文件地图控件的引用 mMapView = (MapView) findViewById(R.id.bmapView); mBaiduMap = mMapView.getMap();//获取地图实例 //定义Maker坐标点 LatLng point = new LatLng(39.963175, 116.400244);//纬度,经度 //构建Marker图标 BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka); //构建MarkerOption设置参数,用于在地图上添加Marker(标志) OverlayOptions option = new MarkerOptions() .position(point) //设置参数 .icon(bitmap);//设置图片 //在地图上添加Marker(标注),并显示 mBaiduMap.addOverlay(option); } @Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mMapView.onPause(); } }
删除指定标注物:
// 在地图上添加Marker(标注),并显示 addOverlay = mBaiduMap.addOverlay(option2); if(addOverlay != null){ addOverlay.remove();//删除上次的标注物 其实就是添加标注物时利用返回值进行删除 }
百度地图使用指南:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/retrieval
布局文件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.workspace.my.baidumaptest.MainActivity"> <com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> </RelativeLayout>
效果图:
其他设置:
//获取地图view mMapView = (MapView) findViewById(R.id.bmapView); //获得MapView中的BaiduMap对象 mBaiduMap = mMapView.getMap(); //普通地图(默认) // mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); //卫星视图 // mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); ////空白地图, 基础地图瓦片将不会被渲染。在地图类型中设置为NONE,将不会使用流量下载基础地图瓦片图层。使用场景:与瓦片图层一起使用,节省流量,提升自定义瓦片图下载速度。 // mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE); //开启交通图 // mBaiduMap.setTrafficEnabled(true); //开热力图 mBaiduMap.setBaiduHeatMapEnabled(true);
公交,步行,驾车路线查询,附近POI查询,工程目录
代码见云盘
或者: http://www.cnblogs.com/fangg/p/5987245.html
反编译
public class MainActivity extends AppCompatActivity { private MapView mMapView; private BaiduMap mBaiduMap; private GeoCoder mSearch; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); //获取地图控件引用 mMapView = (MapView) findViewById(R.id.bmapView); mBaiduMap = mMapView.getMap(); //第一步,创建地理编码检索实例 mSearch = GeoCoder.newInstance(); //第二步,创建地理编码检索监听者; OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() { public void onGetGeoCodeResult(GeoCodeResult result) { if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { //没有检索到结果 Log.i("tag", "同向编码--没有获取到"); } //获取地理编码结果 Log.i("tag", "纬度:"+result.getLocation().latitude+",经度:"+result.getLocation().longitude); } @Override public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) { if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { //没有找到检索结果 Log.i("tag", "反向编码--没有获取到"); } //获取反向地理编码结果 Log.i("tag", "根据经纬度获取的位置:"+result.getAddress()); } }; //第三步,设置地理编码检索监听者 mSearch.setOnGetGeoCodeResultListener(listener); //通过位置获取经纬度 //mSearch.geocode(new GeoCodeOption().city("北京").address("海淀区上地十街10号")); //通过经纬度获取地址 mSearch.reverseGeoCode(new ReverseGeoCodeOption().location(new LatLng(26.209164,111.612552))); // mSearch.destroy();释放地理编码检索实例,放到监听到结果结束后 } }
屏幕坐标与地图中经纬度的转换:
//滑动监听 mBaiduMap.setOnMapStatusChangeListener(new OnMapStatusChangeListener() { @Override public void onMapStatusChangeStart(MapStatus arg0) { //开始滑动 } @Override public void onMapStatusChangeFinish(MapStatus arg0) { //滑动完成后调用 arg0.getMapStatus().tagget 获取地图的中心点坐标(可以跟下面的经纬度对比下,没测试) mBaiduMap.clear();// 清除标注 android.graphics.Point pt = new android.graphics.Point(); //获取地图控件的中心坐标(相对于地图控件) pt.x = mMapView.getWidth() / 2; pt.y = mMapView.getHeight() / 2; // 得到经纬度 将坐标值转换成地图中的经纬度 LatLng fromScreenLocation = mBaiduMap.getProjection().fromScreenLocation(pt); //通过经纬度转换成相对屏幕的坐标 //android.graphics.Point screenLocation = mBaiduMap.getProjection().toScreenLocation(fromScreenLocation); // 构建Marker图标 BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka); // 构建MarkerOption设置参数,用于在地图上添加Marker(标志) OverlayOptions option = new MarkerOptions().position( fromScreenLocation) // 设置参数 .icon(bitmap);// 设置图片 // 在地图上添加Marker(标注),并显示 mBaiduMap.addOverlay(option); // 通过位置获取经纬度 // mSearch.geocode(new // GeoCodeOption().city("北京").address("海淀区上地十街10号")); // 通过经纬度获取地址 mSearch.reverseGeoCode(new ReverseGeoCodeOption() .location(fromScreenLocation)); } @Override public void onMapStatusChange(MapStatus arg0) { // TODO Auto-generated method stub } });
POI检索与建议搜索: 需要OverlayManager.java 与 PoiOverlay.java 这两个类(上面所说的工具类中)
/** * 初始化数据与设置(POI检索与建议搜索) */ private void initData() { //设置适配器 dataList = new ArrayList<PoiInfo>(); dataList.add(currentPoiInfo); resultAdapter = new ResultAdapter(); listView.setAdapter(resultAdapter); // 初始化POI搜索模块,注册搜索事件监听 mPoiSearch = PoiSearch.newInstance(); mPoiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult poiResult) { if (poiResult == null || poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) { T.showS("未找到结果"); return; } if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) { //创建覆盖物对象 /*mBaiduMap.clear(); myPoiOverlay = new MyPoiOverlay(mBaiduMap); myPoiOverlay.setData(poiResult); myPoiOverlay.addToMap(); myPoiOverlay.zoomToSpan(); //给poi的结果设置点击事件,点击marker后弹出详情页 mBaiduMap.setOnMarkerClickListener(myPoiOverlay);*/ List<PoiInfo> allPoi = poiResult.getAllPoi(); dataList.addAll(allPoi);//将poi的搜索结果添加到集合 resultAdapter.notifyDataSetChanged(); return; } if (poiResult.error == SearchResult.ERRORNO.AMBIGUOUS_KEYWORD) { // 当输入关键字在本市没有找到,但在其他城市找到时,返回包含该关键字信息的城市列表 for (CityInfo cityInfo : poiResult.getSuggestCityList()) { if (poiResult.getSuggestCityList().size() == 1) { mPoiSearch.searchInCity((new PoiCitySearchOption()).city(cityInfo.city) .keyword(et_keyword.getText().toString()).pageNum(10)); } else { T.showS("未找到结果"); } } } } @Override public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) { if (poiDetailResult.error != SearchResult.ERRORNO.NO_ERROR) { Toast.makeText(SearchAddressActivity.this, "抱歉,未找到结果",0).show(); } else { //获取详情页的请求结果 String detailUrl = poiDetailResult.getDetailUrl(); //得到当前经纬度 Log.i("tag", "获取poi检索请求结果:name=" + poiDetailResult.getName() + ",地址=" + poiDetailResult.getAddress() +",经纬度对象="+poiDetailResult.getLocation()); Toast.makeText(SearchAddressActivity.this, detailUrl, 0).show(); } } @Override public void onGetPoiIndoorResult(PoiIndoorResult arg0) { } }); //初始化建议搜索模块,注册建议搜索事件监听 mSuggestionSearch = SuggestionSearch.newInstance(); mSuggestionSearch.setOnGetSuggestionResultListener(new OnGetSuggestionResultListener() { @Override public void onGetSuggestionResult(SuggestionResult res) { if (res == null || res.getAllSuggestions() == null) { return; } for (SuggestionResult.SuggestionInfo info : res.getAllSuggestions()) { if (info.key != null) { Log.i("tag", "地址="+info.key +",城市="+info.city+",区域="+info.district); //info.district 区域 //info.pt 经纬度 } } } }); //编辑框的监听 et_keyword.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if(s.length() >0){ //poi检索 mPoiSearch.searchInCity((new PoiCitySearchOption()).city(CommNames.CITY).keyword(s.toString()).pageNum(10)); } dataList.removeAll(dataList); dataList.add(currentPoiInfo); resultAdapter.notifyDataSetChanged(); /** * 使用建议搜索服务获取建议列表,结果在onSuggestionResult()中更新 */ mSuggestionSearch.requestSuggestion((new SuggestionSearchOption()).keyword(s.toString()).city("")); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } }); //listview的单击事件 listView.setOnItemClickListener(new OnItemClickListener() { private Overlay addOverlay; @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if(addOverlay != null){ addOverlay.remove();//删除上次的标注物 } PoiInfo poiInfo = dataList.get(position); LatLng location = poiInfo.location; // 构建Marker图标 BitmapDescriptor bitmap2 = BitmapDescriptorFactory.fromResource(R.drawable.icon_address); OverlayOptions option2 = new MarkerOptions().position(location) // 设置参数 .icon(bitmap2);// 设置图片 // 在地图上添加Marker(标注),并显示 addOverlay = mBaiduMap.addOverlay(option2); //显示到定位点 // 将地图显示到定位的地方 MapStatus mapStatus = new MapStatus.Builder().target(location).build(); mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(mapStatus)); } }); }
画运动轨迹与路线规划:http://www.jianshu.com/p/2ad4c2077dfd
Android百度地图(一):百度地图定位sdk 类方法参数、定位原理详细介绍
Android百度地图(二):百度地图sdk显示位置点、图层绘制
Android百度地图(四):百度地图运动轨迹纠偏、去噪、绑路之百度鹰眼sdk服务
Android百度地图(五):百度地图鹰眼sdk监控进出地理围栏(区域)
Android百度地图(六):百度地图POI检索,行政区边界、公交、线路规划查询,地理编码介绍
Android百度地图(二):百度地图sdk显示位置点、图层绘制
Android百度地图(四):百度地图运动轨迹纠偏、去噪、绑路之百度鹰眼sdk服务
Android百度地图(五):百度地图鹰眼sdk监控进出地理围栏(区域)
Android百度地图(六):百度地图POI检索,行政区边界、公交、线路规划查询,地理编码介绍