26 百度地图的使用

    xiaoxiao2023-03-24  4

    1 先申请key 详细步骤 百度详细图片步骤

    2 配置环境变量(poi)

    百度详细图文介绍这里推荐下载SDK后用sample 中的jar包和类库

    2 配置定位的环境(上面的不一样 如果你只需要定位看这里即可)

    百度图文详细介绍这里推荐下载SDK后用sample 中的jar包和类库

    案例一 显示百度地图

    package com.qf.sxy.day27_baidumap; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.MapView; public class MainActivity extends AppCompatActivity { MapView mMapView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); //获取地图控件引用 mMapView = (MapView) findViewById(R.id.bmapView); } /** * 管理百度地图的生命周期 */ @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(); } } 当然初始化代码可以写application SDKInitializer.initialize(getApplicationContext()); 例子 package com.qf.sxy.day27_baidumap; import android.app.Application; import com.baidu.mapapi.SDKInitializer; /** * Created by sxy on 2016/9/27. * * 使用Application做全局初始化 * note:必须在清单文件进行注册 android:name=".MyApplication" * 否则 写没写这个Application是没有作用 */ public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); //在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); } } 注意需要在清单文件注册 <application android:name=".MyApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme">

    案例二 覆盖物

    说明:在地图上某个点显示个图标或者View等

    package com.qf.sxy.day27_baidumap; import android.graphics.Color; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.Button; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.InfoWindow; import com.baidu.mapapi.map.LogoPosition; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.Marker; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.map.OverlayOptions; import com.baidu.mapapi.model.LatLng; /** * 添加覆盖物 * 步骤: * 1,获取Baidumap对象 * 2,给Baidumap添加覆盖物 addOverlay * 3,给覆盖物添加点击监听 */ public class OverlayActivity extends AppCompatActivity { private MapView mapView; private BaiduMap baiduMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_overlay); mapView = ((MapView) findViewById(R.id.bmapView)); mapView.setLogoPosition(LogoPosition.logoPostionRightBottom); //获取百度地图对象 baiduMap = mapView.getMap(); // //地图类型 卫星 // baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); // //MAP_TYPE_NONE 空白的 // baiduMap.setMapType(BaiduMap.MAP_TYPE_NONE); //普通的 // baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); // // //开启交通图 // baiduMap.setTrafficEnabled(true); // // //开启交通图 // baiduMap.setBaiduHeatMapEnabled(true); //获取图标 BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher); //获取当前坐标 final LatLng latLng = new LatLng(40.089597, 116.419385); //获取OverlayOptions 对象 设置图标 OverlayOptions options= new MarkerOptions().icon(bitmapDescriptor).position(latLng).title("天通苑"); //添加覆盖物 baiduMap.addOverlay(options); //覆盖物的点击监听 baiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { Button btn = new Button(OverlayActivity.this); btn.setBackgroundColor(Color.WHITE); btn.setText(marker.getTitle()); BitmapDescriptor descriptor = BitmapDescriptorFactory.fromView(btn); /** * 参数1:图片 当然这也可以放View等 * 参数2:坐标点 * 参数3:y轴的偏移量 * 参数4:提示的监听 */ InfoWindow infoWindow = new InfoWindow(descriptor, latLng, -50, new InfoWindow.OnInfoWindowClickListener() { @Override public void onInfoWindowClick() { //隐藏 baiduMap.hideInfoWindow(); } }); //设置提示 baiduMap.showInfoWindow(infoWindow); return false; } }); } }

    案例三 路线规划

    说明:制定两个点的的路线图

    package com.qf.sxy.day27_baidumap; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.search.route.BikingRouteResult; import com.baidu.mapapi.search.route.DrivingRouteLine; import com.baidu.mapapi.search.route.DrivingRoutePlanOption; import com.baidu.mapapi.search.route.DrivingRouteResult; import com.baidu.mapapi.search.route.OnGetRoutePlanResultListener; import com.baidu.mapapi.search.route.PlanNode; import com.baidu.mapapi.search.route.RoutePlanSearch; import com.baidu.mapapi.search.route.TransitRouteResult; import com.baidu.mapapi.search.route.WalkingRouteResult; import com.qf.sxy.day27_baidumap.utils.DrivingRouteOverlay; import java.util.List; /** * 路线规划步骤: * 1,获取路线规划对象RoutePlanSearch * 2,对路线规划对象进行监听 * 3,开启路线查询(有四种) * 4,在监听中 进行处理 获取路线覆盖物 将其添加到地图 可以进行点击监听节点 */ public class RouteActivity extends AppCompatActivity { private MapView mMapView; private BaiduMap mBaiduMap; //路线规划的对象 private RoutePlanSearch mRoutePlanSearch; private DrivingRouteLine drivingRouteLine;//这个路线展示到Map @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_route); mMapView = ((MapView) findViewById(R.id.bmapView)); //获取百度地图对象 mBaiduMap = mMapView.getMap(); //获取路线规划对象 mRoutePlanSearch = RoutePlanSearch.newInstance(); //对路线规划进行监听 mRoutePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() { @Override public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) { //走路的规划 } @Override public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) { //公交的规划 } @Override public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) { //自己开车 //获取所有的路线 List<DrivingRouteLine> lines = drivingRouteResult.getRouteLines(); if(lines!=null&&lines.size()>0){//说明有路线 Log.e("AAA","==="+lines.size()); drivingRouteLine = lines.get(0);//这里我们只获取其中一条路径 }else{ Log.e("AAA","==没有路=="); } //将路线展示到地图 以覆盖物---这类给sample类帮我们画出 开头和结尾还有中间的路 MyOverlay myOverlay = new MyOverlay(mBaiduMap); //将开车的路线 给覆盖物 myOverlay.setData(drivingRouteLine); //对路线覆盖物监听 myOverlay内部实现了new BaiduMap.OnMarkerClickListener()方法 //监听地图上的箭头图片 (图片每次有转向路口都会有个箭头图片 点击图片显示相应的转向提示) mBaiduMap.setOnMarkerClickListener(myOverlay); //将覆盖物添加到地图 myOverlay.addToMap(); } @Override public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) { //骑自行车行 } }); //开启路线查询 mRoutePlanSearch.drivingSearch(new DrivingRoutePlanOption(). from(PlanNode.withCityNameAndPlaceName("北京","北京科技职业学院")). to(PlanNode.withCityNameAndPlaceName("北京","北京西站"))); } //开车的覆盖物 此类继承是百度sample中的类 public class MyOverlay extends DrivingRouteOverlay{ /** * 构造函数 * * @param baiduMap 该DrivingRouteOvelray引用的 BaiduMap */ public MyOverlay(BaiduMap baiduMap) { super(baiduMap); } //路线节点的 点击监听 @Override public boolean onRouteNodeClick(int i) { //监听地图上的箭头图片 (图片每次有转向路口都会有个箭头图片 点击图片显示相应的转向提示) //获取所有的节点 List<DrivingRouteLine.DrivingStep> lists = drivingRouteLine.getAllStep(); DrivingRouteLine.DrivingStep step = lists.get(i); Log.e("AAAA","==>"+step.getInstructions()); return super.onRouteNodeClick(i); } } }

    示例图:

    说明:图中箭头就是监听事件

    案例四 POI搜索 商铺

    POI是“Point of Interest”的缩写,中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。 package com.qf.sxy.day27_baidumap; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.InfoWindow; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.search.core.PoiInfo; import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener; import com.baidu.mapapi.search.poi.PoiCitySearchOption; import com.baidu.mapapi.search.poi.PoiDetailResult; import com.baidu.mapapi.search.poi.PoiDetailSearchOption; import com.baidu.mapapi.search.poi.PoiIndoorResult; import com.baidu.mapapi.search.poi.PoiResult; import com.baidu.mapapi.search.poi.PoiSearch; import com.qf.sxy.day27_baidumap.utils.PoiOverlay; import java.util.List; /** * 1,获取对象 * 2,设置监听 * 3,开启搜索 */ public class PoiSearchActivity extends AppCompatActivity { private MapView mMapView; private EditText mEtKey; private BaiduMap mBaiduMap ; private PoiSearch mPoiSearch;//Poi检索的对象 private PoiInfo poiInfo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_poi_search); mMapView = ((MapView) findViewById(R.id.bmapView)); mEtKey = ((EditText) findViewById(R.id.et_key)); mBaiduMap = mMapView.getMap(); } //点击按钮开始搜索 public void findClick(View view) { String keyStr = mEtKey.getText().toString().trim(); if(TextUtils.isEmpty(keyStr)){ Log.e("AAA","当前搜索的关键字为null"); return; } //实例化检索对象 mPoiSearch = PoiSearch.newInstance(); //Poi搜索的监听 mPoiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult poiResult) { //Poi搜索的结果 //清除之前的数据 mBaiduMap.clear(); MyPoiOverlay myPoiOverlay = new MyPoiOverlay(mBaiduMap); myPoiOverlay.setData(poiResult); mBaiduMap.setOnMarkerClickListener(myPoiOverlay); myPoiOverlay.addToMap(); } @Override public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) { //得到结果的详情 Intent intent = new Intent(PoiSearchActivity.this,PoidetailActivity.class); intent.putExtra("url",poiDetailResult.getDetailUrl()); startActivity(intent); } @Override public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) { //获取室内的结果 } }); //开启搜索 搜索所在的城市 关键字 mPoiSearch.searchInCity(new PoiCitySearchOption().city("北京").keyword(keyStr)); // LatLng llC = new LatLng(39.639723, 118.425541); // LatLng llD = new LatLng(39.906965, 118.401394); //坐标点的附近 // mPoiSearch.searchNearby(new PoiNearbySearchOption().location(llC).keyword()) //区域 设置俩个坐标点 左上 右下 // LatLngBounds latLngBounds = new LatLngBounds.Builder().include(llC).include(llD).build(); // mPoiSearch.searchInBound(new PoiBoundSearchOption().bound(latLngBounds)) } //Poi搜索的覆盖物 此类事sample class MyPoiOverlay extends PoiOverlay{ /** * 构造函数 * * @param baiduMap 该 PoiOverlay 引用的 BaiduMap 对象 */ public MyPoiOverlay(BaiduMap baiduMap) { super(baiduMap); } //点击覆盖物的监听 @Override public boolean onPoiClick(int i) { //获取Poi所有节点 List<PoiInfo> list = getPoiResult().getAllPoi(); //获取点击的节点 poiInfo = list.get(i); Button button = new Button(getApplicationContext()); button.setBackgroundColor(Color.GREEN); button.setText(poiInfo.name); BitmapDescriptor descriptor = BitmapDescriptorFactory.fromView(button); InfoWindow infoWindow = new InfoWindow(descriptor, poiInfo.location, -100, new InfoWindow.OnInfoWindowClickListener() { @Override public void onInfoWindowClick() { //根据Uid搜索详情 此时回调mPoiSearch的onGetPoiDetailResult方法 mPoiSearch.searchPoiDetail(new PoiDetailSearchOption().poiUid(poiInfo.uid)); mBaiduMap.hideInfoWindow(); } }); mBaiduMap.showInfoWindow(infoWindow); return super.onPoiClick(i); } } } package com.qf.sxy.day27_baidumap; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.webkit.WebView; import android.webkit.WebViewClient; public class PoidetailActivity extends AppCompatActivity { private WebView mWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_poidetail); mWebView = ((WebView) findViewById(R.id.webView)); mWebView.getSettings().setJavaScriptEnabled(true); String url = getIntent().getStringExtra("url"); mWebView.setWebViewClient(new WebViewClient() { //重写了 shouldOverrideUrlLoading()方法。这就表明当需要从一个网页跳转到另一个网页时,我们希望目标网页仍然在当前 WebView 中显示,而不是打开系统浏览器 @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); // 根据传入的参数再去加载新的网页 return true; // 表示当前WebView可以处理打开新网页的请求,不用借助系统浏览器 } }); mWebView.loadUrl(url); } }

    案例五 POI 查找公交路线

    package com.qf.sxy.day27_baidumap; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.EditText; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.search.busline.BusLineResult; import com.baidu.mapapi.search.busline.BusLineSearch; import com.baidu.mapapi.search.busline.BusLineSearchOption; import com.baidu.mapapi.search.busline.OnGetBusLineSearchResultListener; import com.baidu.mapapi.search.core.SearchResult; import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener; import com.baidu.mapapi.search.poi.PoiCitySearchOption; import com.baidu.mapapi.search.poi.PoiDetailResult; import com.baidu.mapapi.search.poi.PoiIndoorResult; import com.baidu.mapapi.search.poi.PoiResult; import com.baidu.mapapi.search.poi.PoiSearch; import com.qf.sxy.day27_baidumap.utils.BusLineOverlay; public class BusLineSearchActivity extends AppCompatActivity { private MapView mapView; private BaiduMap baiduMap; private EditText etBus; private PoiSearch poiSearch; private BusLineSearch busLineSearch; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_bus_line_search); mapView = ((MapView) findViewById(R.id.bmapView)); baiduMap = mapView.getMap(); etBus = ((EditText) findViewById(R.id.et_bus)); busLineSearch= BusLineSearch.newInstance(); busLineSearch.setOnGetBusLineSearchResultListener(new OnGetBusLineSearchResultListener() { @Override public void onGetBusLineResult(BusLineResult busLineResult) { if(busLineResult!=null&&busLineResult.error == SearchResult.ERRORNO.NO_ERROR){ //删除原来的覆盖物 baiduMap.clear(); //一个显示公交站点类 BusLineOverlay overlay = new BusLineOverlay(baiduMap); overlay.setData(busLineResult); overlay.addToMap(); } } }); //poi poiSearch = PoiSearch.newInstance(); poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() { @Override public void onGetPoiResult(PoiResult poiResult) { if(poiResult!=null&&poiResult.error== SearchResult.ERRORNO.NO_ERROR){ //可能查到多个 这里我们只取第一个 String uid = poiResult.getAllPoi().get(0).uid; busLineSearch.searchBusLine(new BusLineSearchOption().city("北京").uid(uid)); } } @Override public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) { } @Override public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) { } }); } public void searchClick(View view) { //开启搜索 城市 关键字 公交号 476 poiSearch.searchInCity(new PoiCitySearchOption().city("北京").keyword(etBus.getText().toString().trim())); } }

    案例六 定位

    环境搭建

    注意安卓6.0的运行时权限 安卓6.0运行时权限

    所需: liblocSDK6a.so locSDK_6.13.jar

    package com.qf.sxy.day27_baidumap; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.map.OverlayOptions; import com.baidu.mapapi.model.LatLng; public class LocationActivity extends AppCompatActivity { private MapView mapView; private BaiduMap baiduMap; //定位对象 private LocationClient locationClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_location); mapView = ((MapView) findViewById(R.id.bmapView)); baiduMap = mapView.getMap(); locationClient = new LocationClient(LocationActivity.this); //对定位的设置 LocationClientOption option = new LocationClientOption(); /** * LocationClientOption.LocationMode.Battery_Saving:低功耗定位 不用GPS (wifi 基站) * * LocationClientOption.LocationMode.Hight_Accuracy:高精度定位 全开GPS wifi 基站 * * LocationClientOption.LocationMode.Device_Sensors 仅仅使用设备 GPS 不支持室内 */ option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); /** * bd09ll:百度经纬度坐标 * bd09:墨卡托坐标 * gcjo2:国家测量局坐标 */ option.setCoorType("bd09ll"); //设置定位间隔时间 每隔两秒记录一次位置 option.setScanSpan(1000*2); //设置定位超出时间 option.setTimeOut(1000*10); //是否需要得到地址 option.setIsNeedAddress(true); //是否设置手机 机头方向 option.setNeedDeviceDirect(true); //2给定位对象进行设置 locationClient.setLocOption(option); //3监听 locationClient.registerLocationListener(new BDLocationListener() { @Override public void onReceiveLocation(BDLocation bdLocation) { //获取坐标 bdLocation.getLatitude()纬度 bdLocation.getLongitude()经度 LatLng latLng = new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude()); BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher); OverlayOptions options = new MarkerOptions().position(latLng).icon(descriptor).title("当前位置"); baiduMap.addOverlay(options); Log.e("fmy","位置"+bdLocation.getLatitude()); } }); //4启动 locationClient.start();//开启 locationClient.requestLocation();//发起请求 } }
    转载请注明原文地址: https://ju.6miu.com/read-1201167.html
    最新回复(0)