百度地图的简单使用(定位、画区域、线路规划、搜索)
来源:互联网 发布:python系统监控 编辑:程序博客网 时间:2024/05/20 20:19
参考学习:
百度地图官网:
androidsdk/guide/basicmap - Wiki http://lbsyun.baidu.com/index.php?title=androidsdk/guide/basicmap
很有学习价值!!!
Small_Cake的专栏里对于百度地图的使用做了很详细的介绍
1.深入学习百度地图Android SDK v4.0.0【第一关】基础地图 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52193921
2.深入学习百度地图Android SDK v4.0.0【第二关】公交地图 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52199135
3.深入学习百度地图Android SDK v4.0.0【第三关】路线规划 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52212402
4.深入学习百度地图Android SDK v4.0.0【第四关】OpenGL绘制 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52336116
5.深入学习百度地图Android SDK v4.0.0【第五关】瓦片图层 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52370635
6.深入学习百度地图Android SDK v4.0.0【第六关】室内地图 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52370729
7.深入学习百度地图Android SDK v4.0.0【第七关】周边雷达 - xiaoshubing的专栏 - CSDN博客 http://blog.csdn.net/xiaoshubing/article/details/52412099
注意事项:
libs文件夹放入jar包,在main里新建的jniLibs文件夹放入.so文件
具体代码:
学习的时候,大神有时没有放具体的布局截图或代码,所以自行研究了一下,特此记录下来。
我把每一个功能都独立出来了,一个大功能一个界面。
1.公交线路搜索:
1.布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:background="#FFFFFF" android:layout_width="match_parent" android:layout_height="match_parent"> <EditText android:id="@+id/ed_start_bus_station" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入城市名称"/> <EditText android:id="@+id/ed_end_bus_station" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入公交路线号"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:orientation="horizontal"> <TextView android:id="@+id/tv_choose_bus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="搜索公交路线" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:gravity="center" android:layout_weight="1" android:textSize="21sp"/> <TextView android:id="@+id/tv_previous" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="上一个" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:gravity="center" android:layout_weight="1" android:textSize="21sp"/> <TextView android:id="@+id/tv_next" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="下一个" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:gravity="center" android:layout_weight="1" android:textSize="21sp"/> </LinearLayout> <com.baidu.mapapi.map.MapView android:id="@+id/map_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="10dp" android:clickable="true" /></LinearLayout>
2.activity代码:
public class ActBusLineMap extends AppCompatActivity implements OnGetBusLineSearchResultListener, OnGetPoiSearchResultListener { @BindView(R.id.map_view) MapView mapView; @BindView(R.id.ed_start_bus_station) EditText edStartBusStation; @BindView(R.id.ed_end_bus_station) EditText edEndBusStation; @BindView(R.id.tv_choose_bus) TextView tvChooseBus; @BindView(R.id.tv_previous) TextView tvPrevious; @BindView(R.id.tv_next) TextView tvNext; private BaiduMap mBaiduMap; private PoiSearch poiSearch; private BusLineSearch busLineSearch; private List<String> busLines = new ArrayList<>(); private int uidPostion = 0;//当前选中第几条路线 private BusLineResult mBusLineResult; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_act_buslinemap); ButterKnife.bind(this); mBaiduMap = mapView.getMap(); init(); onEvent(); } /** * 点击事件 * @param view */ @OnClick({R.id.tv_choose_bus, R.id.tv_previous, R.id.tv_next}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.tv_choose_bus: poiSearch.searchInCity( new PoiCitySearchOption().city( edStartBusStation.getText().toString()).keyword(edEndBusStation.getText().toString())); break; case R.id.tv_previous: if (uidPostion>0){ uidPostion--; searchBusLine(); } break; case R.id.tv_next: if (uidPostion<(busLines.size()-1)){ uidPostion++; searchBusLine(); } break; } } private void onEvent() { } public void init() { //检索查询初始化并监听 poiSearch = PoiSearch.newInstance(); poiSearch.setOnGetPoiSearchResultListener(this); //路线查询初始化并监听 busLineSearch = BusLineSearch.newInstance(); busLineSearch.setOnGetBusLineSearchResultListener(this); //公交路线覆盖物,并设置路线的点击事件 overlay = new BusLineOverlay(mBaiduMap){ @Override public boolean onBusStationClick(int index) { if (mBusLineResult.getStations() != null && mBusLineResult.getStations().get(index) != null) { showToast( mBusLineResult.getStations().get(index).getTitle() ); } return true; }; }; mBaiduMap.setOnMarkerClickListener(overlay); } /** * 【1】首先检索查询 * * @param poiResult */ @Override public void onGetPoiResult(PoiResult poiResult) { if (poiResult == null || poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) { showToast("抱歉,未找到结果" ); return; } if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) { busLines.clear(); List<PoiInfo> allPoi = poiResult.getAllPoi(); if (allPoi == null || allPoi.size() == 0) return; for (int i = 0; i < allPoi.size(); i++) { PoiInfo poiInfo = allPoi.get(i); //如果是公交类型的路线,就把它的UID添加到集合中 if (poiInfo.type == PoiInfo.POITYPE.BUS_LINE) { busLines.add(poiInfo.uid); } } mBusLineResult=null; if (busLines.size() == 0) return; uidPostion = 0; showToast( "发现"+busLines.size()+"条线路!"); busLineSearch.searchBusLine( new BusLineSearchOption().city(edStartBusStation.getText().toString()).uid(busLines.get(uidPostion))); } } /** * 【2】从检索的结果中筛选出公交路线 * 并将其添加到地图上 * * @param busLineResult */ private BusLineResult route = null; // 保存驾车/步行路线数据的变量,供浏览节点时使用 private int nodeIndex = -2; // 节点索引,供浏览节点时使用 BusLineOverlay overlay; // 公交路线绘制对象 @Override public void onGetBusLineResult(BusLineResult busLineResult) { if (busLineResult == null || busLineResult.error != SearchResult.ERRORNO.NO_ERROR) { showToast( "抱歉,未找到结果" ); return; } mBaiduMap.clear(); mBusLineResult = busLineResult; nodeIndex = -1; overlay.removeFromMap(); overlay.setData(busLineResult); overlay.addToMap(); overlay.zoomToSpan(); tvPrevious.setVisibility(View.VISIBLE); tvNext.setVisibility(View.VISIBLE); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("路线详情").setMessage(busLineResult.getBusLineName()).setPositiveButton("朕知道了",null).show(); } @Override public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) { } @Override public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) { } private void searchBusLine(){ showToast( "当前查询的路线=="+uidPostion); busLineSearch.searchBusLine( new BusLineSearchOption().city(edStartBusStation.getText().toString()).uid(busLines.get(uidPostion))); } private void showToast(String str){ Toast.makeText(ActBusLineMap.this,str,Toast.LENGTH_SHORT).show(); } @Override public void onBackPressed() { super.onBackPressed(); if (!isFinishing()) { finish(); } } @Override protected void onDestroy() { super.onDestroy(); // 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mapView.onDestroy(); busLineSearch.destroy(); poiSearch.destroy(); } @Override protected void onResume() { super.onResume(); // 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mapView.onResume(); } @Override protected void onPause() { super.onPause(); // 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mapView.onPause(); }}
2.定位
1.布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:background="#FFFFFF" android:layout_width="match_parent" android:layout_height="match_parent"> <com.baidu.mapapi.map.MapView android:id="@+id/map_view" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" /></LinearLayout>
2.activity代码:
public class ActLocation extends AppCompatActivity { @BindView(R.id.map_view) MapView mapView; private BaiduMap mBaiduMap; public LocationClient mLocationClient = null; //BDAbstractLocationListener为7.2版本新增的Abstract类型的监听接口, // 原有BDLocationListener接口暂时同步保留。具体介绍请参考后文中的说明 public BDAbstractLocationListener myListener = new MyLocationListener(); @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_act_location); ButterKnife.bind(this); mBaiduMap = mapView.getMap(); //设置地图级别为18 initMap(18); mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类 mLocationClient.registerLocationListener( myListener ); //注册监听函数 mLocationClient.start(); initLocation(); } private void initLocation(){ LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); //可选,默认高精度,设置定位模式,高精度,低功耗,仅设备 option.setCoorType("bd09ll"); //可选,默认bd09ll表示百度经纬度坐标,设置返回的定位结果坐标系 int span=1000; option.setScanSpan(span); //可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的 option.setIsNeedAddress(true); //可选,设置是否需要地址信息,默认不需要 option.setOpenGps(true); //可选,默认false,设置是否使用gps option.setLocationNotify(true); //可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果 option.setIsNeedLocationDescribe(true); //可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近” option.setIsNeedLocationPoiList(true); //可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到 option.setIgnoreKillProcess(false); //可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死// option.setIgnoreCacheException(false); //可选,默认false,设置是否收集CRASH信息,默认收集 option.setEnableSimulateGps(false); //可选,默认false,设置是否需要过滤GPS仿真结果,默认需要// option.setWifiValidTime(5*60*1000); //可选,7.2版本新增能力,如果您设置了这个接口,首次启动定位时,会先判断当前WiFi是否超出有效期,超出有效期的话,会先重新扫描WiFi,然后再定位 mLocationClient.setLocOption(option); } public class MyLocationListener extends BDAbstractLocationListener { @Override public void onReceiveLocation(BDLocation location) { if( location != null ){ //设置一开始的中心点 initLocation( location.getLatitude(), location.getLongitude() ); //显示标记图标 drawMark( location.getLatitude(), location.getLongitude() ); //以此为中心绘制指定区域圆形 drawCircle( location.getLatitude(), location.getLongitude() ); } //获取定位结果 location.getTime(); //获取定位时间 location.getLocationID(); //获取定位唯一ID,v7.2版本新增,用于排查定位问题 location.getLocType(); //获取定位类型 location.getLatitude(); //获取纬度信息 location.getLongitude(); //获取经度信息 location.getRadius(); //获取定位精准度 location.getAddrStr(); //获取地址信息 location.getCountry(); //获取国家信息 location.getCountryCode(); //获取国家码 location.getCity(); //获取城市信息 location.getCityCode(); //获取城市码 location.getDistrict(); //获取区县信息 location.getStreet(); //获取街道信息 location.getStreetNumber(); //获取街道码 location.getLocationDescribe(); //获取当前位置描述信息 location.getPoiList(); //获取当前位置周边POI信息 location.getBuildingID(); //室内精准定位下,获取楼宇ID location.getBuildingName(); //室内精准定位下,获取楼宇名称 location.getFloor(); //室内精准定位下,获取当前位置所处的楼层信息 if (location.getLocType() == BDLocation.TypeGpsLocation){ //当前为GPS定位结果,可获取以下信息 location.getSpeed(); //获取当前速度,单位:公里每小时 location.getSatelliteNumber(); //获取当前卫星数 location.getAltitude(); //获取海拔高度信息,单位米 location.getDirection(); //获取方向信息,单位度 } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){ //当前为网络定位结果,可获取以下信息 location.getOperators(); //获取运营商信息 } else if (location.getLocType() == BDLocation.TypeOffLineLocation) { //当前为网络定位结果 } else if (location.getLocType() == BDLocation.TypeServerError) { //当前网络定位失败 //可将定位唯一ID、IMEI、定位失败时间反馈至loc-bugs@baidu.com } else if (location.getLocType() == BDLocation.TypeNetWorkException) { //当前网络不通 } else if (location.getLocType() == BDLocation.TypeCriteriaException) { //当前缺少定位依据,可能是用户没有授权,建议弹出提示框让用户开启权限 //可进一步参考onLocDiagnosticMessage中的错误返回码 } } /** * 回调定位诊断信息,开发者可以根据相关信息解决定位遇到的一些问题 * 自动回调,相同的diagnosticType只会回调一次 * * @param locType 当前定位类型 * @param diagnosticType 诊断类型(1~9) * @param diagnosticMessage 具体的诊断信息释义 */ public void onLocDiagnosticMessage(int locType, int diagnosticType, String diagnosticMessage) { if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_BETTER_OPEN_GPS) { //建议打开GPS } else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_BETTER_OPEN_WIFI) { //建议打开wifi,不必连接,这样有助于提高网络定位精度! } else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_CHECK_LOC_PERMISSION) { //定位权限受限,建议提示用户授予APP定位权限! } else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_CHECK_NET) { //网络异常造成定位失败,建议用户确认网络状态是否异常! } else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_CLOSE_FLYMODE) { //手机飞行模式造成定位失败,建议用户关闭飞行模式后再重试定位! } else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_INSERT_SIMCARD_OR_OPEN_WIFI) { //无法获取任何定位依据,建议用户打开wifi或者插入sim卡重试! } else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_NEED_OPEN_PHONE_LOC_SWITCH) { //无法获取有效定位依据,建议用户打开手机设置里的定位开关后重试! } else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_SERVER_FAIL) { //百度定位服务端定位失败 //建议反馈location.getLocationID()和大体定位时间到loc-bugs@baidu.com } else if (diagnosticType == LocationClient.LOC_DIAGNOSTIC_TYPE_FAIL_UNKNOWN) { //无法获取有效定位依据,但无法确定具体原因 //建议检查是否有安全软件屏蔽相关定位权限 //或调用LocationClient.restart()重新启动后重试! } } } /** * 设置地图级别为18 * * @param grade */ private void initMap(int grade) { //描述地图将要发生的变化,使用工厂类MapStatusUpdateFactory创建, //设置级别为18,进去就是18了,默认是12 MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.zoomTo(grade); mBaiduMap.setMapStatus(mapStatusUpdate); //是否显示缩放按钮 //mMapView.showZoomControls(false); } /** * 绘制mark覆盖物 */ private void drawMark(double varX, double varY) { MarkerOptions markerOptions = new MarkerOptions(); BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.ic_map_mark); // 描述图片 markerOptions.position(new LatLng(varX, varY)) // 设置位置 .icon(bitmap) // 加载图片 .draggable(true) // 支持拖拽 .title("当前位置"); // 显示文本 //把绘制的圆添加到百度地图上去 mBaiduMap.addOverlay(markerOptions); } /** * 设置一开始中心点的经纬度坐标 * * @param varX * @param varY */ private void initLocation(double varX, double varY) { //经纬度(纬度,经度) LatLng latlng = new LatLng(varX, varY); MapStatusUpdate mapStatusUpdate_circle = MapStatusUpdateFactory.newLatLng(latlng); mBaiduMap.setMapStatus(mapStatusUpdate_circle); } /** * 绘制圆 */ private void drawCircle( double varX, double varY) { // 1.创建自己 CircleOptions circleOptions = new CircleOptions(); // 2.设置数据 以世界之窗为圆心,1000米为半径绘制 circleOptions.center(new LatLng(varX, varY))//中心 .radius(1000) //半径 .fillColor(0x00000000)//填充圆的颜色 0x60FF0000 .stroke(new Stroke(10, 0x600FF000)); //边框的宽度和颜色 //把绘制的圆添加到百度地图上去 mBaiduMap.addOverlay(circleOptions); } @Override public void onBackPressed() { super.onBackPressed(); if (!isFinishing()) { finish(); } } @Override protected void onDestroy() { super.onDestroy(); // 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mapView.onDestroy(); } @Override protected void onResume() { super.onResume(); // 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mapView.onResume(); } @Override protected void onPause() { super.onPause(); // 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mapView.onPause(); }}
3.搜索关键词:
1.布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:background="#FFFFFF" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:orientation="horizontal" android:layout_margin="10dp" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/ed_search" android:layout_margin="10dp" android:layout_width="match_parent" android:layout_weight="1" android:layout_height="match_parent" /> <Button android:id="@+id/btn_range_search" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#00000000" android:textSize="24sp" android:layout_weight="3" android:text="范围搜索"/> <Button android:id="@+id/btn_around_search" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#00000000" android:textSize="24sp" android:layout_weight="3" android:text="周边搜索"/> </LinearLayout> <com.baidu.mapapi.map.MapView android:id="@+id/map_view" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" /></LinearLayout>
2.acitivty代码:
public class ActSearchAddress extends AppCompatActivity { @BindView(R.id.ed_search) EditText edSearch; @BindView(R.id.btn_range_search) Button btnRangeSearch; @BindView(R.id.btn_around_search) Button btnAroundSearch; @BindView(R.id.map_view) MapView mapView; //初始化一个搜索广播 private PoiSearch poiSearch; private BaiduMap mBaiduMap; private double coordinateX = 22.5422870000; private double coordinateY = 113.9804440000; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_act_searchaddress); ButterKnife.bind(this); mBaiduMap = mapView.getMap(); //设置地图级别为18 initMap(18); //设置地图中心点 initLocation(coordinateX, coordinateY); } @OnClick({R.id.btn_range_search, R.id.btn_around_search}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.btn_range_search: //范围搜索 //搜索:指定范围、关键字,周边搜索和范围搜索基本一致 if (!TextUtils.isEmpty(edSearch.getText().toString().trim())) { rangeSearch(edSearch.getText().toString().trim()); } else { Toast.makeText(getApplicationContext(), "请输入关键字", Toast.LENGTH_SHORT).show(); } break; case R.id.btn_around_search: //周边圆形搜索 //搜索:指定关键字、圆半径、中心点 if (!TextUtils.isEmpty(edSearch.getText().toString().trim())) { aroundSearch(edSearch.getText().toString().trim()); } else { Toast.makeText(getApplicationContext(), "请输入关键字", Toast.LENGTH_SHORT).show(); } break; } } /** * 设置地图级别为18 * * @param grade */ private void initMap(int grade) { //描述地图将要发生的变化,使用工厂类MapStatusUpdateFactory创建, //设置级别为18,进去就是18了,默认是12 MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.zoomTo(grade); mBaiduMap.setMapStatus(mapStatusUpdate); //是否显示缩放按钮 //mMapView.showZoomControls(false); } /** * 设置一开始中心点的经纬度坐标 * * @param varX * @param varY */ private void initLocation(double varX, double varY) { //经纬度(纬度,经度) LatLng latlng = new LatLng(varX, varY); MapStatusUpdate mapStatusUpdate_circle = MapStatusUpdateFactory.newLatLng(latlng); mBaiduMap.setMapStatus(mapStatusUpdate_circle); } /** * 范围搜索:指定范围、关键字进行搜索 * 标记处此范围内所有与关键字相关的地方 * * @param keyWord */ private void rangeSearch(String keyWord) { // 实例化搜索方法 PoiSearch newInstance = PoiSearch.newInstance(); newInstance.setOnGetPoiSearchResultListener(new MyRangeSearchListener()); // 发出搜索的请求 范围检索 PoiBoundSearchOption boundOption = new PoiBoundSearchOption(); // 确定两点坐标(东北,西南),在此两点之间的范围内搜索 LatLngBounds latLngBounds = new LatLngBounds.Builder() // 这里我们随机弄两个坐标 分别是深圳世界之窗附近 .include(new LatLng(22.5441560000, 113.9828800000)) // 世界之窗右上角的美加广场 .include(new LatLng(22.5413850000, 113.9777770000)) // 世界之窗左下角的一个不知道叫啥的街道 .build(); boundOption.bound(latLngBounds); // 设置搜索的范围 boundOption.keyword(keyWord); // 搜索的关键字 newInstance.searchInBound(boundOption); } /** * 周边搜索 * * @param keyWord */ private void aroundSearch(String keyWord) { poiSearch = PoiSearch.newInstance(); poiSearch.setOnGetPoiSearchResultListener(new MyAroudSearchListener()); PoiNearbySearchOption nearbyOption = new PoiNearbySearchOption(); LatLng hmPos = new LatLng(22.5441560000, 113.9828800000);//指定中心点 nearbyOption.location(hmPos);// 设置中心点 nearbyOption.radius(1000);// 设置半径 单位是米 nearbyOption.keyword(keyWord);// 关键字 poiSearch.searchNearby(nearbyOption); } /** * 范围搜索监听 */ class MyRangeSearchListener implements OnGetPoiSearchResultListener { @Override public void onGetPoiDetailResult(PoiDetailResult result) { } @Override public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) { } @Override public void onGetPoiResult(PoiResult result) { // 收到发送过来的搜索请求之后我们进行处理 if (result == null || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) { Toast.makeText(getApplicationContext(), "未搜索到结果", Toast.LENGTH_LONG).show(); return; } //搜索类型的类 PoiOverlay overlay = new PoiOverlay(mBaiduMap); //处理搜索Poi的覆盖物 mBaiduMap.setOnMarkerClickListener(overlay);// 把事件分发给overlay,overlay才能处理点击事件 overlay.setData(result); //设置结果 overlay.addToMap();//把搜索的结果添加到地图中去 overlay.zoomToSpan(); //自动缩放到所以的mark覆盖物都能看到 } } /** * 周边搜索(圆形) */ class MyAroudSearchListener implements OnGetPoiSearchResultListener { @Override public void onGetPoiDetailResult(PoiDetailResult result) { if (result == null || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) { Toast.makeText(getApplicationContext(), "未搜索到结果", Toast.LENGTH_LONG).show(); return; } String text = result.getAddress() + "::" + result.getCommentNum() + result.getEnvironmentRating(); Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG).show(); } @Override public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) { } @Override public void onGetPoiResult(PoiResult result) { if (result == null || SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) { Toast.makeText(getApplicationContext(), "未搜索到结果", Toast.LENGTH_LONG).show(); return; } PoiOverlay overlay = new MyPoiOverlay(mBaiduMap);// 搜索poi的覆盖物 mBaiduMap.setOnMarkerClickListener(overlay);// 把事件分发给overlay,overlay才能处理点击事件 overlay.setData(result);// 设置结果 overlay.addToMap();// 把搜索的结果添加到地图中 overlay.zoomToSpan();// 缩放地图,使所有Overlay都在合适的视野内 注: 该方法只对Marker类型的overlay有效 } } //自己实现点击事件 class MyPoiOverlay extends PoiOverlay { public MyPoiOverlay(BaiduMap arg0) { super(arg0); } @Override public boolean onPoiClick(int index) { PoiResult poiResult = getPoiResult(); PoiInfo poiInfo = poiResult.getAllPoi().get(index);// 得到点击的那个poi信息 String text = poiInfo.name + "," + poiInfo.address; Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); PoiDetailSearchOption detailOption = new PoiDetailSearchOption(); detailOption.poiUid(poiInfo.uid);// 设置poi的uid poiSearch.searchPoiDetail(detailOption); return super.onPoiClick(index); } } @Override public void onBackPressed() { super.onBackPressed(); if (!isFinishing()) { finish(); } } @Override protected void onDestroy() { super.onDestroy(); // 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mapView.onDestroy(); } @Override protected void onResume() { super.onResume(); // 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mapView.onResume(); } @Override protected void onPause() { super.onPause(); // 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mapView.onPause(); }}
4.线路规划
1.布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:background="#FFFFFF" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:id="@+id/layout_search_bus_line" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <EditText android:id="@+id/ed_city" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入城市名"/> <EditText android:id="@+id/ed_start_bus_station" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入起始点"/> <EditText android:id="@+id/ed_end_bus_station" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:hint="请输入终点"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/tv_choose_biking" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="骑行" android:layout_margin="5dp" android:gravity="center" android:layout_weight="1" android:textSize="21sp"/> <TextView android:id="@+id/tv_choose_car" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="驾车" android:layout_margin="5dp" android:gravity="center" android:layout_weight="1" android:textSize="21sp"/> <TextView android:id="@+id/tv_choose_bus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="公交" android:layout_margin="5dp" android:gravity="center" android:layout_weight="1" android:textSize="21sp"/> <TextView android:id="@+id/tv_choose_walk" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="步行" android:layout_margin="5dp" android:gravity="center" android:layout_weight="1" android:textSize="21sp"/> </LinearLayout> </LinearLayout> <com.baidu.mapapi.map.MapView android:id="@+id/map_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="10dp" android:clickable="true" /></LinearLayout>
2.activity代码:
public class ActRoutePlanMap extends AppCompatActivity implements OnGetRoutePlanResultListener { @BindView(R.id.map_view) MapView mapView; @BindView(R.id.ed_city) EditText edCity; @BindView(R.id.ed_start_bus_station) EditText edStartBusStation; @BindView(R.id.ed_end_bus_station) EditText edEndBusStation; @BindView(R.id.tv_choose_biking) TextView tvChooseBiking; @BindView(R.id.tv_choose_car) TextView tvChooseCar; @BindView(R.id.tv_choose_bus) TextView tvChooseBus; @BindView(R.id.tv_choose_walk) TextView tvChooseWalk; private BaiduMap mBaiduMap; private RoutePlanSearch routePlanSearch;//路径规划搜索接口 private BikingRouteOverlay bikingOverlay; private DrivingRouteOverlay drivingOverlay; private TransitRouteOverlay transOverlay; private WalkingRouteOverlay walkingOverlay; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_act_routeplanmap); ButterKnife.bind(this); mBaiduMap = mapView.getMap(); init(); } @OnClick({ R.id.tv_choose_biking, R.id.tv_choose_car, R.id.tv_choose_bus, R.id.tv_choose_walk}) public void onViewClicked(View view) { //路径规划中的出行节点信息,出行节点包括:起点,终点,途经点 PlanNode fromPlanNode = PlanNode.withCityNameAndPlaceName(edCity.getText().toString(), edStartBusStation.getText().toString()); PlanNode toPlanNode = PlanNode.withCityNameAndPlaceName(edCity.getText().toString(), edEndBusStation.getText().toString()); switch (view.getId()) { /** * 各种路线规划的查询 */ case R.id.tv_choose_biking: //骑行路线 routePlanSearch.bikingSearch(new BikingRoutePlanOption().from(fromPlanNode).to(toPlanNode)); break; case R.id.tv_choose_car: //驾车路线 routePlanSearch.drivingSearch(new DrivingRoutePlanOption().from(fromPlanNode).to(toPlanNode)); break; case R.id.tv_choose_bus: //换乘公共交通工具的路线 routePlanSearch.transitSearch(new TransitRoutePlanOption().city(edCity.getText().toString()).from(fromPlanNode).to(toPlanNode)); break; case R.id.tv_choose_walk: //步行路线 routePlanSearch.walkingSearch(new WalkingRoutePlanOption().from(fromPlanNode).to(toPlanNode)); break; } } public void init() { //路径规划搜索接口 routePlanSearch = RoutePlanSearch.newInstance(); routePlanSearch.setOnGetRoutePlanResultListener(this); //骑行覆盖物添加并监听 bikingOverlay = new BikingRouteOverlay(mBaiduMap); //驾车覆盖物添加并监听 drivingOverlay = new DrivingRouteOverlay(mBaiduMap); //换乘覆盖物添加并监听 transOverlay = new TransitRouteOverlay(mBaiduMap); //步行覆盖物添加并监听 walkingOverlay = new WalkingRouteOverlay(mBaiduMap); //TODO: 添加各种路线覆盖物的点击事件 mBaiduMap.setOnMarkerClickListener(bikingOverlay); mBaiduMap.setOnMarkerClickListener(drivingOverlay); mBaiduMap.setOnMarkerClickListener(transOverlay); mBaiduMap.setOnMarkerClickListener(walkingOverlay); } /** * 以下四个方法是路线规划搜索监听后的回调 * a.步行回调 * * @param walkingRouteResult */ @Override public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) { if (walkingRouteResult == null || walkingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) { showToast( "抱歉,未找到结果"); return; } showToast( "步行线路条数:" + walkingRouteResult.getRouteLines().size()); List<WalkingRouteLine> routeLines = walkingRouteResult.getRouteLines(); mBaiduMap.clear(); walkingOverlay.removeFromMap(); walkingOverlay.setData(routeLines.get(0)); walkingOverlay.addToMap(); walkingOverlay.zoomToSpan(); } /** * b.换乘路线结果回调 * * @param transitRouteResult */ @Override public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) { if (transitRouteResult == null || transitRouteResult.error != SearchResult.ERRORNO.NO_ERROR) { showToast("抱歉,未找到结果" ); return; } showToast( "公交线路条数:" + transitRouteResult.getRouteLines().size()); List<TransitRouteLine> routeLines = transitRouteResult.getRouteLines(); mBaiduMap.clear(); transOverlay.removeFromMap(); transOverlay.setData(routeLines.get(0)); transOverlay.addToMap(); transOverlay.zoomToSpan(); } @Override public void onGetMassTransitRouteResult(MassTransitRouteResult massTransitRouteResult) { } /** * c.驾车路线结果回调 * * @param drivingRouteResult */ @Override public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) { if (drivingRouteResult == null || drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) { showToast( "抱歉,未找到结果" ); return; } showToast( "驾车线路条数:" + drivingRouteResult.getRouteLines().size()); List<DrivingRouteLine> routeLines = drivingRouteResult.getRouteLines(); mBaiduMap.clear(); drivingOverlay.removeFromMap(); drivingOverlay.setData(routeLines.get(0)); drivingOverlay.addToMap(); drivingOverlay.zoomToSpan(); } @Override public void onGetIndoorRouteResult(IndoorRouteResult indoorRouteResult) { } /** * d.骑行路线结果回调 * * @param bikingRouteResult */ @Override public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) { if (bikingRouteResult == null || bikingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) { showToast( "抱歉,未找到结果"); return; } showToast( "骑行线路条数:" + bikingRouteResult.getRouteLines().size()); List<BikingRouteLine> routeLines = bikingRouteResult.getRouteLines(); mBaiduMap.clear(); bikingOverlay.removeFromMap(); bikingOverlay.setData(routeLines.get(0)); bikingOverlay.addToMap(); bikingOverlay.zoomToSpan(); } private void showToast(String str){ Toast.makeText(ActRoutePlanMap.this,str,Toast.LENGTH_SHORT).show(); } @Override public void onBackPressed() { super.onBackPressed(); if (!isFinishing()) { finish(); } } @Override protected void onDestroy() { super.onDestroy(); // 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mapView.onDestroy(); routePlanSearch.destroy(); } @Override protected void onResume() { super.onResume(); // 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mapView.onResume(); } @Override protected void onPause() { super.onPause(); // 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mapView.onPause(); }}
5.标记地址、画区域、更新标记图、自定义弹出框
1.布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:background="#FFFFFF" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ScrollView android:layout_width="match_parent" android:layout_height="100dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:orientation="horizontal" android:layout_margin="10dp" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/tv_custom_map" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="19sp" android:text="普通地图"/> <TextView android:id="@+id/tv_satellite_map" android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="19sp" android:text="卫星地图"/> <TextView android:id="@+id/tv_blank_map" android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="19sp" android:text="空白地图"/> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_margin="10dp" android:gravity="center" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/tv_traffic_map" android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="19sp" android:text="开启交通图"/> <TextView android:id="@+id/tv_thermal_map" android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="19sp" android:text="开启热力图"/> </LinearLayout> </LinearLayout> </ScrollView> <com.baidu.mapapi.map.MapView android:id="@+id/map_view" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" /></LinearLayout>
2.activity代码:
/** * 1.显示地图(普通、卫星、空白、交通图、热力图) * 2.标记指定的位置点、不断更新标记图标 * 3.在指定的位置点显示自定义文字 * 4.点击指定的位置点的标记图标,显示自定义弹出框 * 5.指定半径、中心点画出区域圆形图 * 6.显示指南针 * 7.设置地图级别、中心点 */public class ActCommonMap extends AppCompatActivity { @BindView(R.id.map_view) MapView mapView; @BindView(R.id.tv_custom_map) TextView tvCustomMap; @BindView(R.id.tv_satellite_map) TextView tvSatelliteMap; @BindView(R.id.tv_blank_map) TextView tvBlankMap; @BindView(R.id.tv_traffic_map) TextView tvTrafficMap; @BindView(R.id.tv_thermal_map) TextView tvThermalMap; private BaiduMap mBaiduMap; //要显示的pop private View pop; //pop中的文本信息 private TextView popWindowTitle; private boolean isTrafficMap = false; private boolean isThermalMap = false; private boolean isInfoWindow = false; private double coordinateX = 22.5422870000; private double coordinateY = 113.9804440000; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_act_commonmap); ButterKnife.bind(this); initView(); } @OnClick({R.id.tv_custom_map, R.id.tv_satellite_map, R.id.tv_blank_map, R.id.tv_traffic_map, R.id.tv_thermal_map}) public void onViewClicked(View view) { switch (view.getId()) { case R.id.tv_custom_map: //普通地图 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); break; case R.id.tv_satellite_map: //卫星地图 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); break; case R.id.tv_blank_map: //空白地图, 基础地图瓦片将不会被渲染。在地图类型中设置为NONE, // 将不会使用流量下载基础地图瓦片图层。使用场景:与瓦片图层一起使用, // 节省流量,提升自定义瓦片图下载速度。 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE); break; case R.id.tv_traffic_map: if (isTrafficMap == false) { //开启交通图 mBaiduMap.setTrafficEnabled(true); tvTrafficMap.setText("关闭交通图"); isTrafficMap = true; } else { //开启交通图 mBaiduMap.setTrafficEnabled(false); tvTrafficMap.setText("开启交通图"); isTrafficMap = false; } break; case R.id.tv_thermal_map: if (isThermalMap == false) { //城市热力图 mBaiduMap.setBaiduHeatMapEnabled(true); tvThermalMap.setText("关闭热力图"); isThermalMap = true; } else { //开启交通图 mBaiduMap.setBaiduHeatMapEnabled(false); tvThermalMap.setText("开启热力图"); isThermalMap = false; } break; } } /** * 设置地图属性等等 */ private void initView(){ mBaiduMap = mapView.getMap(); //设置地图级别为18 initMap(18); //设置地图中心点 initLocation(coordinateX, coordinateY); //显示指南针 mBaiduMap.getUiSettings().setCompassEnabled(true);// //绘制区域圆形// drawCircle();// //显示自定义文字// drawText(); //显示标记图标 drawMark(coordinateX, coordinateY); //初始化popwindow,通过点击mark来控制它的显示 initPop(); //mark的点击事件 // 点击某一个mark在他上放显示泡泡 // 加载pop 添加到mapview 把他设置为隐藏 当点击的时候更新pop的位置 设置为显示 mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker result) { showPop(result); return true; } }); //隐藏pop pop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { pop.setVisibility(View.INVISIBLE); } });// //不断切换mark图标(显示多个图片的来回切换,类似于帧动画)// drawMarks(); } /** * 不断更新Mark图标 * 显示多个图片的来回切换,类似于帧动画 * 拿上面那个方法直接改的设置icon * 绘制mark覆盖物 */ private void drawMarks() { MarkerOptions markerOptions = new MarkerOptions(); BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.ic_map_mark); // 描述图片 ArrayList<BitmapDescriptor> bitmaps = new ArrayList<BitmapDescriptor>(); bitmaps.add(bitmap); //显示多个图片的来回切换,类似于帧动画 bitmaps.add(BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher_round)); markerOptions.position(new LatLng(22.5422870000, 113.9804440000)) // 设置位置 //.icon(bitmap) // 加载图片 //切换图片 .icons(bitmaps) .period(10) //切换时间 .draggable(true) // 支持拖拽 .title("世界之窗旁边的草房"); // 显示文本 mBaiduMap.addOverlay(markerOptions); } /** * 初始化pop */ private void initPop() { pop = View.inflate(getApplicationContext(), R.layout.map_pop_window, null); //必须使用百度的params ViewGroup.LayoutParams params = new MapViewLayoutParams.Builder().layoutMode(MapViewLayoutParams.ELayoutMode.mapMode) //按照经纬度设置 .position(new LatLng(coordinateX, coordinateY)) //这个坐标无所谓的,但是不能传null .width(MapViewLayoutParams.WRAP_CONTENT) //宽度 .height(MapViewLayoutParams.WRAP_CONTENT) //高度 .build(); mapView.addView(pop, params); //先设置隐藏,点击的时候显示 pop.setVisibility(View.INVISIBLE); popWindowTitle = (TextView) pop.findViewById(R.id.popWindowTitle); } /** * 显示加载pop */ private void showPop( Marker result){ if( !isInfoWindow){ //处理点击 ,当点击的时候更新并且显示位置 ViewGroup.LayoutParams params = new MapViewLayoutParams.Builder(). layoutMode(MapViewLayoutParams.ELayoutMode.mapMode) //按照经纬度设置位置 .position(result.getPosition()) //这个坐标无所谓的,但是不能传null .width(MapViewLayoutParams.WRAP_CONTENT) //宽度 .height(MapViewLayoutParams.WRAP_CONTENT) //高度 .yOffset(-5) //相距 正值往下 负值往上 .build(); mapView.updateViewLayout(pop, params); //更新下title String title = result.getTitle(); popWindowTitle.setText(title); pop.setVisibility(View.VISIBLE); }else{ pop.setVisibility(View.INVISIBLE); } } /** * 绘制mark覆盖物 */ private void drawMark(double varX, double varY) { MarkerOptions markerOptions = new MarkerOptions(); BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.ic_map_mark); // 描述图片 markerOptions.position(new LatLng(varX, varY)) // 设置位置 .icon(bitmap) // 加载图片 .draggable(true) // 支持拖拽 .title("世界之窗旁边的草房"); // 显示文本 //把绘制的圆添加到百度地图上去 mBaiduMap.addOverlay(markerOptions); } /** * 绘制文字 */ private void drawText() { TextOptions textOptions = new TextOptions(); textOptions.fontColor(Color.RED) //设置字体颜色 .text("自定义文字覆盖物") //设置显示文本 .position(new LatLng(22.5422870000, 113.9804440000)) //设置显示坐标 .fontSize(20) //设置文本大小 .typeface(Typeface.SERIF) //设置字体 Android的字体就三种,对称的,不对称的,等宽的 .rotate(30); //设置旋转角度 //把绘制的圆添加到百度地图上去 mBaiduMap.addOverlay(textOptions); } /** * 绘制圆 */ private void drawCircle() { // 1.创建自己 CircleOptions circleOptions = new CircleOptions(); // 2.设置数据 以世界之窗为圆心,1000米为半径绘制 circleOptions.center(new LatLng(22.5422870000, 113.9804440000))//中心 .radius(1000) //半径 .fillColor(0x60FF0000)//填充圆的颜色 .stroke(new Stroke(10, 0x600FF000)); //边框的宽度和颜色 //把绘制的圆添加到百度地图上去 mBaiduMap.addOverlay(circleOptions); } /** * 设置地图级别为18 * * @param grade */ private void initMap(int grade) { //描述地图将要发生的变化,使用工厂类MapStatusUpdateFactory创建, //设置级别为18,进去就是18了,默认是12 MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.zoomTo(grade); mBaiduMap.setMapStatus(mapStatusUpdate); //是否显示缩放按钮 //mMapView.showZoomControls(false); } /** * 设置一开始中心点的经纬度坐标 * * @param varX * @param varY */ private void initLocation(double varX, double varY) { //经纬度(纬度,经度) LatLng latlng = new LatLng(varX, varY); MapStatusUpdate mapStatusUpdate_circle = MapStatusUpdateFactory.newLatLng(latlng); mBaiduMap.setMapStatus(mapStatusUpdate_circle); } @Override public void onBackPressed() { super.onBackPressed(); if (!isFinishing()) { finish(); } } @Override protected void onDestroy() { super.onDestroy(); // 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mapView.onDestroy(); } @Override protected void onResume() { super.onResume(); // 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mapView.onResume(); } @Override protected void onPause() { super.onPause(); // 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mapView.onPause(); }}
补充:
配置文件里需要添加:
1..在application外添加权限:
<!-- 百度地图需要的权限 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!-- 这个权限用于进行网络定位--> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <!-- 这个权限用于访问GPS定位--> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <!-- 获取运营商信息,用于支持提供运营商信息相关的接口--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <!-- 用于读取手机当前的状态--> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- 访问网络,网络定位需要上网--> <uses-permission android:name="android.permission.INTERNET" /> <!-- SD卡读取权限,用户写入离线定位数据--> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
2.在application里添加你在百度地图为应用申请的key:
<!-- 百度地图key --> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="xxxxxxxxxxx" />
3.写定位功能时,需在application里添加:
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>
- 百度地图的简单使用(定位、画区域、线路规划、搜索)
- 使用百度地图进行区域搜索与定位
- 使用百度地图进行区域搜索与定位
- 百度地图api 自定义驾车线路规划 车辆实时定位
- 百度地图的简单使用与定位
- 百度地图线路规划 + 地理编码结合使用,精确找到终点的位置
- 百度地图简单基础显示+定位+搜索
- android 百度地图线路规划问题
- 百度地图定位的使用
- 百度地图的使用(定位)
- 百度地图定位的使用
- 百度地图的定位和poi搜索
- 使用百度地图实现拖动定位、搜索定位
- 百度地图简单定位
- 高德地图线路规划的接入使用(步行-公交-驾车)
- Android_百度地图(一)简单的定位
- 百度地图定位功能的简单应用
- 简单百度地图的定位开发
- java利用qrcode生成带有logo的二维码(logo位置及大小自己调)
- thinkphp5.0中让某些记录优先展示
- GLIB编译
- Linux中“is not in the sudoers file”解决方法
- FreeSSHd 两种连接方式的配置
- 百度地图的简单使用(定位、画区域、线路规划、搜索)
- RecyclerView的使用
- Servlet
- Java8 Lambda表达式性能问题
- 构建iOS持续集成平台(二)——测试框架
- Vue2.0+组件库总结
- Chronometer(计时器)
- Linux 下 新增Oracle10g 实例
- SqlServer 2014 解密存储过程