百度地图之定位+移动选址

2024-05-06 09:18

本文主要是介绍百度地图之定位+移动选址,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 转载自:

    http://blog.csdn.net/y1scp/article/details/49095729

  • 百学须先立志---学前须知:

    我们经常在各大主流APP上要求被写上地址,如百度外卖、爱鲜蜂收货地址等等;其中他们大多数是可以让我们在地图上移动选址。就如下面这段GIF演示的一样:

    最终演示

  • 尽信书,不如无书---能学到什么?

    1、地图状态MapStatus类及监听setOnMapStatusChangeListener 2、定位LocationClient类 3、反地理编码GeoCoder类

  • 工欲善其事必先利其器---申请Key

    百度地图访问应用(AK)申请地址:http://lbsyun.baidu.com/apiconsole/key

    如果你是第一次申请的话可以参看我的另一篇教程:Android中级篇之百度地图SDK v3.5.0-申请密钥详解[AndroidStudio下获取SHA1]

  • 兵马未动,粮草先行---导入百度地图jar包

    1、 进入百度地图API-首页

    百度地图API-首页

    2、鼠标移动到 开发 标签页上,选择 Android地图SDK

    Android地图SDK

    3、选择 相关下载

    相关下载

    4、选择 全部下载 (此时这里会跳转到新的下载页面)

    全部下载

    5、选择 相对应的开发包(本教程大家选择和下图标注的一样即可)

    开发包

    6、导入jar包到工程

    如果你是第一次导入的话可以参看我另一篇教程:Android中级篇之百度地图SDK v3.5.0-配置环境及发布[图解AndroidStudio下配置.so文件] 这里呢就不再赘述了。

    导入jar包到工程

  • 权限及服务---AndroidManifest
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.scp"><!-- SDK2.1新增获取用户位置信息 --><uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /><uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /><uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission><!-- SDK1.5需要android.permission.GET_TASKS权限判断本程序是否为当前运行的应用? --><uses-permission android:name="android.permission.GET_TASKS" /><uses-permission android:name="android.permission.WRITE_SETTINGS" /><!-- 这个权限用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission><!-- 这个权限用于访问GPS定位--><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission><!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位--><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission><!-- 获取运营商信息,用于支持提供运营商信息相关的接口--><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission><!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位--><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission><!-- 用于读取手机当前的状态--><uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission><!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><!-- 访问网络,网络定位需要上网--><uses-permission android:name="android.permission.INTERNET" /><!-- SD卡读取权限,用户写入离线定位数据--><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission><!--允许应用读取低级别的系统日志文件 --><uses-permission android:name="android.permission.READ_LOGS"></uses-permission><!-- 定位所需的权限 --><uses-permission android:name="android.permission.VIBRATE" /><uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /><!--对于很高的分辨率,除采用相应的图片外,还需要加上如下配置,来更好的适配屏幕 --><supports-screensandroid:anyDensity="true"android:largeScreens="true"android:normalScreens="true"android:smallScreens="true" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme"><meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="你申请的百度地图KEY" /><activityandroid:name=".MainActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application><serviceandroid:name="com.baidu.location.f"android:enabled="true"android:process=":remote"><intent-filter><action android:name="com.baidu.location.service_v2.2"></action></intent-filter></service></manifest>

    AndroidManifest

  • 配置.so文件及其他---build.gradle
    apply plugin: 'com.android.application'android {compileSdkVersion 23buildToolsVersion "23.0.0"defaultConfig {applicationId "com.scp"minSdkVersion 14targetSdkVersion 23versionCode 1versionName "1.0"}buildTypes {release {//代码混淆minifyEnabled false//zip优化zipAlignEnabled true//移除无用的resource文件shrinkResources trueproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'}}sourceSets {main {jniLibs.srcDirs = ['libs']}}
    }dependencies {compile fileTree(include: ['*.jar'], dir: 'libs')compile 'com.android.support:appcompat-v7:23.0.0'compile files('libs/BaiduLBS_Android.jar')
    }

    build.gradle

  • 主布局---activity_main.xml

    首先我们先分析一下,整个布局结构上面是百度的 MapView (地图区域)下面是一个 ListView(选址列表区域) ,乍一看好像是如下图描述一样:

    布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><com.baidu.mapapi.map.MapViewandroid:id="@+id/main_bdmap"android:layout_width="match_parent"android:layout_height="250dp"android:onClick="true"></com.baidu.mapapi.map.MapView><ListViewandroid:id="@+id/main_pois"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"></ListView></LinearLayout>
    

    从布局中我们可以看到 MapView 占了250dp(大家自己可以随意给个值,不要太小即可)。下面的 ListView 则是填充了剩余的空间。

  • 第一步:基础地图
    public class MainActivity extends AppCompatActivity {private MapView mMapView;private BaiduMap mBaiduMap;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//在使用SDK各组件之前初始化context信息,传入ApplicationContext//注意该方法要再setContentView方法之前实现SDKInitializer.initialize(getApplicationContext());//requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);initView();}private void initView() {mMapView = (MapView) findViewById(R.id.main_bdmap);mBaiduMap = mMapView.getMap();}@Overrideprotected void onResume() {super.onResume();// activity 恢复时同时恢复地图控件mMapView.onResume();}@Overrideprotected void onPause() {super.onPause();// activity 暂停时同时暂停地图控件mMapView.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();// activity 销毁时同时销毁地图控件mMapView.onDestroy();mMapView = null;}}
    

    这里我们的 MainActivity 继承的是 AppCompatActivity,继承 Activity 也行。

    //在使用SDK各组件之前初始化context信息,传入ApplicationContext
    //注意该方法要再setContentView方法之前实现
    SDKInitializer.initialize(getApplicationContext());
    

    这段代码一段要放在 setContentView(R.layout.activity_main); 之前。继续往下看,其中有一句代码requestWindowFeature(Window.FEATURE_NO_TITLE);被注释掉了,需要去掉标题栏的朋友可以加上这句代码。下面呢还有另外一种方法去掉标题栏,打开我们的 style.xml 。

    没改之前

    改成 Theme.AppCompat.Light.NoActionBar

    改完之后

    • 运行效果图:

      基础地图

    • 第二步:定位

      继续书写我们的MainActivity里面的代码:

      public class MainActivity extends AppCompatActivity implements BDLocationListener, OnGetGeoCoderResultListener, BaiduMap.OnMapStatusChangeListener {private MapView mMapView;private BaiduMap mBaiduMap;private ListView poisLL;/*** 定位模式*/private MyLocationConfiguration.LocationMode mCurrentMode;/*** 定位端*/private LocationClient mLocClient;/*** 是否是第一次定位*/private boolean isFirstLoc = true;/*** 定位坐标*/private LatLng locationLatLng;/*** 定位城市*/private String city;/*** 反地理编码*/private GeoCoder geoCoder;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//在使用SDK各组件之前初始化context信息,传入ApplicationContext//注意该方法要再setContentView方法之前实现SDKInitializer.initialize(getApplicationContext());//requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);initView();}private void initView() {mMapView = (MapView) findViewById(R.id.main_bdmap);mBaiduMap = mMapView.getMap();poisLL = (ListView) findViewById(R.id.main_pois);//定义地图状态MapStatus mMapStatus = new MapStatus.Builder().zoom(18).build();MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);//改变地图状态mBaiduMap.setMapStatus(mMapStatusUpdate);//地图状态改变相关监听mBaiduMap.setOnMapStatusChangeListener(this);//开启定位图层mBaiduMap.setMyLocationEnabled(true);//定位图层显示方式mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;/*** 设置定位图层配置信息,只有先允许定位图层后设置定位图层配置信息才会生效* customMarker用户自定义定位图标* enableDirection是否允许显示方向信息* locationMode定位图层显示方式*/mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, null));//初始化定位mLocClient = new LocationClient(this);//注册定位监听mLocClient.registerLocationListener(this);//定位选项LocationClientOption option = new LocationClientOption();/*** coorType - 取值有3个:* 返回国测局经纬度坐标系:gcj02* 返回百度墨卡托坐标系 :bd09* 返回百度经纬度坐标系 :bd09ll*/option.setCoorType("bd09ll");//设置是否需要地址信息,默认为无地址option.setIsNeedAddress(true);//设置是否需要返回位置语义化信息,可以在BDLocation.getLocationDescribe()中得到数据,ex:"在天安门附近", 可以用作地址信息的补充option.setIsNeedLocationDescribe(true);//设置是否需要返回位置POI信息,可以在BDLocation.getPoiList()中得到数据option.setIsNeedLocationPoiList(true);/*** 设置定位模式* Battery_Saving* 低功耗模式* Device_Sensors* 仅设备(Gps)模式* Hight_Accuracy* 高精度模式*/option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//设置是否打开gps进行定位option.setOpenGps(true);//设置扫描间隔,单位是毫秒 当<1000(1s)时,定时定位无效option.setScanSpan(1000);//设置 LocationClientOptionmLocClient.setLocOption(option);//开始定位mLocClient.start();}/*** 定位监听** @param bdLocation*/@Overridepublic void onReceiveLocation(BDLocation bdLocation) {//如果bdLocation为空或mapView销毁后不再处理新数据接收的位置if (bdLocation == null || mBaiduMap == null) {return;}//定位数据MyLocationData data = new MyLocationData.Builder()//定位精度bdLocation.getRadius().accuracy(bdLocation.getRadius())//此处设置开发者获取到的方向信息,顺时针0-360.direction(bdLocation.getDirection())//经度.latitude(bdLocation.getLatitude())//纬度.longitude(bdLocation.getLongitude())//构建.build();//设置定位数据mBaiduMap.setMyLocationData(data);//是否是第一次定位if (isFirstLoc) {isFirstLoc = false;LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());MapStatusUpdate msu = MapStatusUpdateFactory.newLatLngZoom(ll, 18);mBaiduMap.animateMapStatus(msu);}//获取坐标,待会用于POI信息点与定位的距离locationLatLng = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());//获取城市,待会用于POISearchcity = bdLocation.getCity();//创建GeoCoder实例对象geoCoder = GeoCoder.newInstance();//发起反地理编码请求(经纬度->地址信息)ReverseGeoCodeOption reverseGeoCodeOption = new ReverseGeoCodeOption();//设置反地理编码位置坐标reverseGeoCodeOption.location(new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude()));geoCoder.reverseGeoCode(reverseGeoCodeOption);//设置查询结果监听者geoCoder.setOnGetGeoCodeResultListener(this);}//地理编码查询结果回调函数@Overridepublic void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {}//反地理编码查询结果回调函数@Overridepublic void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {List<PoiInfo> poiInfos = reverseGeoCodeResult.getPoiList();PoiAdapter poiAdapter = new PoiAdapter(MainActivity.this, poiInfos);poisLL.setAdapter(poiAdapter);}/*** 手势操作地图,设置地图状态等操作导致地图状态开始改变** @param mapStatus 地图状态改变开始时的地图状态*/@Overridepublic void onMapStatusChangeStart(MapStatus mapStatus) {}/*** 地图状态变化中** @param mapStatus 当前地图状态*/@Overridepublic void onMapStatusChange(MapStatus mapStatus) {}/*** 地图状态改变结束** @param mapStatus 地图状态改变结束后的地图状态*/@Overridepublic void onMapStatusChangeFinish(MapStatus mapStatus) {//地图操作的中心点LatLng cenpt = mapStatus.target;geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(cenpt));}//回退键@Overridepublic void onBackPressed() {finish();}@Overrideprotected void onResume() {super.onResume();// activity 恢复时同时恢复地图控件mMapView.onResume();}@Overrideprotected void onPause() {super.onPause();// activity 暂停时同时暂停地图控件mMapView.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();//退出时停止定位mLocClient.stop();//退出时关闭定位图层mBaiduMap.setMyLocationEnabled(false);// activity 销毁时同时销毁地图控件mMapView.onDestroy();//释放资源if (geoCoder != null) {geoCoder.destroy();}mMapView = null;}
      }

      代码分段分析:

      放大地图

      这里我们放大了地图,zoom(18)【地图缩放级别 3~20】,接下来对我们的定位选项做一个简单的说明:

      定位选项

      当我们定位完了之后,我们就可以对定位好的数据进行处理了,简单说明一下我们的定位监听做了哪些事情:

      定位监听

      定位好了之后我们进行过反地理编码,下面说明一下反地理编码监听里面做了哪些事情:

      反地理编码监听

    • PoiAdapter

      这里会用到一张图 baidumap_ico_poi_on.png 大家右键另存为就行了:

      baidumap_ico_poi_on

      适配器视图 locationpois.xml :

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:paddingLeft="5dp"><LinearLayoutandroid:id="@+id/locationpois_linearlayout"android:gravity="center_vertical"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:id="@+id/locationpois_name"android:layout_width="wrap_content"android:layout_height="wrap_content" /></LinearLayout><TextViewandroid:id="@+id/locationpois_address"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>
      

      布局简单说明:

      布局说明

      实现类 PoiAdapter :

      public class PoiAdapter extends BaseAdapter {private Context context;private List<PoiInfo> pois;private LinearLayout linearLayout;PoiAdapter(Context context, List<PoiInfo> pois) {this.context = context;this.pois = pois;}@Overridepublic int getCount() {return pois.size();}@Overridepublic Object getItem(int position) {return pois.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {convertView = LayoutInflater.from(context).inflate(R.layout.locationpois_item, null);linearLayout = (LinearLayout) convertView.findViewById(R.id.locationpois_linearlayout);holder = new ViewHolder(convertView);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}if (position == 0 && linearLayout.getChildCount() < 2) {ImageView imageView = new ImageView(context);ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(32, 32);imageView.setLayoutParams(params);imageView.setBackgroundColor(Color.TRANSPARENT);imageView.setImageResource(R.mipmap.baidumap_ico_poi_on);imageView.setScaleType(ImageView.ScaleType.FIT_XY);linearLayout.addView(imageView, 0, params);holder.locationpoi_name.setTextColor(Color.parseColor("#FF5722"));}PoiInfo poiInfo = pois.get(position);holder.locationpoi_name.setText(poiInfo.name);holder.locationpoi_address.setText(poiInfo.address);return convertView;}class ViewHolder {TextView locationpoi_name;TextView locationpoi_address;ViewHolder(View view) {locationpoi_name = (TextView) view.findViewById(R.id.locationpois_name);locationpoi_address = (TextView) view.findViewById(R.id.locationpois_address);}}
      }
      

      代码分段分析:

      poiAdapter具体实现

    • 地图状态变化---OnMapStatusChangeListener

      地图状态变化

      来看看我们现在运行是什么样子的:

      第一次运行

      大家移动一下地图试试。

    • 第三步:添加定位图标

      更改 activity_main.xml 布局文件:

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><RelativeLayoutandroid:id="@+id/main_top_RL"android:layout_width="match_parent"android:layout_height="250dp"><com.baidu.mapapi.map.MapViewandroid:id="@+id/main_bdmap"android:layout_width="match_parent"android:layout_height="match_parent"android:onClick="true"></com.baidu.mapapi.map.MapView><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:background="@android:color/transparent"android:src="@mipmap/baidumap_ico_poi_on" /></RelativeLayout><ListViewandroid:id="@+id/main_pois"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"></ListView></LinearLayout></LinearLayout>
      

      居中图标

      此次没有任何实现代码添加或者改动,运行看一下效果:

      第二次运行

      大家移动一下地图试试。

    • 输入关键字显示相关地址列表

      首先我们先更改 activity_main.xml :

      <?xml version="1.0" encoding="utf-8"?>
      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><RelativeLayoutandroid:id="@+id/main_top_RL"android:layout_width="match_parent"android:layout_height="250dp"><com.baidu.mapapi.map.MapViewandroid:id="@+id/main_bdmap"android:layout_width="match_parent"android:layout_height="match_parent"android:onClick="true"></com.baidu.mapapi.map.MapView><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:background="@android:color/transparent"android:src="@mipmap/baidumap_ico_poi_on" /></RelativeLayout><ListViewandroid:id="@+id/main_pois"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"></ListView></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="40dp"android:background="#ffcccccc"android:gravity="center"android:orientation="horizontal"><EditTextandroid:id="@+id/main_search_address"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/transparent"android:hint="请输入地址" /></LinearLayout><ListViewandroid:id="@+id/main_search_pois"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:background="#ffcccccc"android:visibility="gone"></ListView></LinearLayout></RelativeLayout>
      

      代码说明:

      主布局

      接下来书写适配器的item布局 poisearch_item.xml

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:id="@+id/poisearch_name"android:layout_width="match_parent"android:layout_height="wrap_content" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:id="@+id/poisearch_address"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1" /><TextViewandroid:id="@+id/poisearch_distance"android:layout_width="wrap_content"android:layout_height="wrap_content" /></LinearLayout></LinearLayout>
      

      代码说明:

      适配器说明

      最终更改我们的 MainActivity 里面的代码 (请结合下面代码说明来看) :

      public class MainActivity extends AppCompatActivity implements BDLocationListener, OnGetGeoCoderResultListener, BaiduMap.OnMapStatusChangeListener, TextWatcher {private MapView mMapView;private BaiduMap mBaiduMap;private ListView poisLL;/*** 定位模式*/private MyLocationConfiguration.LocationMode mCurrentMode;/*** 定位端*/private LocationClient mLocClient;/*** 是否是第一次定位*/private boolean isFirstLoc = true;/*** 定位坐标*/private LatLng locationLatLng;/*** 定位城市*/private String city;/*** 反地理编码*/private GeoCoder geoCoder;/*** 界面上方布局*/private RelativeLayout topRL;/*** 搜索地址输入框*/private EditText searchAddress;/*** 搜索输入框对应的ListView*/private ListView searchPois;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//在使用SDK各组件之前初始化context信息,传入ApplicationContext//注意该方法要再setContentView方法之前实现SDKInitializer.initialize(getApplicationContext());//requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);initView();}private void initView() {mMapView = (MapView) findViewById(R.id.main_bdmap);mBaiduMap = mMapView.getMap();poisLL = (ListView) findViewById(R.id.main_pois);topRL = (RelativeLayout) findViewById(R.id.main_top_RL);searchAddress = (EditText) findViewById(R.id.main_search_address);searchPois = (ListView) findViewById(R.id.main_search_pois);//定义地图状态MapStatus mMapStatus = new MapStatus.Builder().zoom(18).build();MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);//改变地图状态mBaiduMap.setMapStatus(mMapStatusUpdate);//地图状态改变相关监听mBaiduMap.setOnMapStatusChangeListener(this);//开启定位图层mBaiduMap.setMyLocationEnabled(true);//定位图层显示方式mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;/*** 设置定位图层配置信息,只有先允许定位图层后设置定位图层配置信息才会生效* customMarker用户自定义定位图标* enableDirection是否允许显示方向信息* locationMode定位图层显示方式*/mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(mCurrentMode, true, null));//初始化定位mLocClient = new LocationClient(this);//注册定位监听mLocClient.registerLocationListener(this);//定位选项LocationClientOption option = new LocationClientOption();/*** coorType - 取值有3个:* 返回国测局经纬度坐标系:gcj02* 返回百度墨卡托坐标系 :bd09* 返回百度经纬度坐标系 :bd09ll*/option.setCoorType("bd09ll");//设置是否需要地址信息,默认为无地址option.setIsNeedAddress(true);//设置是否需要返回位置语义化信息,可以在BDLocation.getLocationDescribe()中得到数据,ex:"在天安门附近", 可以用作地址信息的补充option.setIsNeedLocationDescribe(true);//设置是否需要返回位置POI信息,可以在BDLocation.getPoiList()中得到数据option.setIsNeedLocationPoiList(true);/*** 设置定位模式* Battery_Saving* 低功耗模式* Device_Sensors* 仅设备(Gps)模式* Hight_Accuracy* 高精度模式*/option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//设置是否打开gps进行定位option.setOpenGps(true);//设置扫描间隔,单位是毫秒 当<1000(1s)时,定时定位无效option.setScanSpan(1000);//设置 LocationClientOptionmLocClient.setLocOption(option);//开始定位mLocClient.start();}/*** 定位监听** @param bdLocation*/@Overridepublic void onReceiveLocation(BDLocation bdLocation) {//如果bdLocation为空或mapView销毁后不再处理新数据接收的位置if (bdLocation == null || mBaiduMap == null) {return;}//定位数据MyLocationData data = new MyLocationData.Builder()//定位精度bdLocation.getRadius().accuracy(bdLocation.getRadius())//此处设置开发者获取到的方向信息,顺时针0-360.direction(bdLocation.getDirection())//经度.latitude(bdLocation.getLatitude())//纬度.longitude(bdLocation.getLongitude())//构建.build();//设置定位数据mBaiduMap.setMyLocationData(data);//是否是第一次定位if (isFirstLoc) {isFirstLoc = false;LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());MapStatusUpdate msu = MapStatusUpdateFactory.newLatLngZoom(ll, 18);mBaiduMap.animateMapStatus(msu);}//获取坐标,待会用于POI信息点与定位的距离locationLatLng = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());//获取城市,待会用于POISearchcity = bdLocation.getCity();//文本输入框改变监听,必须在定位完成之后searchAddress.addTextChangedListener(this);//创建GeoCoder实例对象geoCoder = GeoCoder.newInstance();//发起反地理编码请求(经纬度->地址信息)ReverseGeoCodeOption reverseGeoCodeOption = new ReverseGeoCodeOption();//设置反地理编码位置坐标reverseGeoCodeOption.location(new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude()));geoCoder.reverseGeoCode(reverseGeoCodeOption);//设置查询结果监听者geoCoder.setOnGetGeoCodeResultListener(this);}//地理编码查询结果回调函数@Overridepublic void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {}//反地理编码查询结果回调函数@Overridepublic void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {List<PoiInfo> poiInfos = reverseGeoCodeResult.getPoiList();PoiAdapter poiAdapter = new PoiAdapter(MainActivity.this, poiInfos);poisLL.setAdapter(poiAdapter);}/*** 手势操作地图,设置地图状态等操作导致地图状态开始改变** @param mapStatus 地图状态改变开始时的地图状态*/@Overridepublic void onMapStatusChangeStart(MapStatus mapStatus) {}/*** 地图状态变化中** @param mapStatus 当前地图状态*/@Overridepublic void onMapStatusChange(MapStatus mapStatus) {}/*** 地图状态改变结束** @param mapStatus 地图状态改变结束后的地图状态*/@Overridepublic void onMapStatusChangeFinish(MapStatus mapStatus) {//地图操作的中心点LatLng cenpt = mapStatus.target;geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(cenpt));}/*** 输入框监听---输入之前** @param s     字符序列* @param start 开始* @param count 总计* @param after 之后*/@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}/*** 输入框监听---正在输入** @param s      字符序列* @param start  开始* @param before 之前* @param count  总计*/@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {}/*** 输入框监听---输入完毕** @param s*/@Overridepublic void afterTextChanged(Editable s) {if (s.length() == 0 || "".equals(s.toString())) {searchPois.setVisibility(View.GONE);} else {//创建PoiSearch实例PoiSearch poiSearch = PoiSearch.newInstance();//城市内检索PoiCitySearchOption poiCitySearchOption = new PoiCitySearchOption();//关键字poiCitySearchOption.keyword(s.toString());//城市poiCitySearchOption.city(city);//设置每页容量,默认为每页10条poiCitySearchOption.pageCapacity(10);//分页编号poiCitySearchOption.pageNum(1);poiSearch.searchInCity(poiCitySearchOption);//设置poi检索监听者poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {//poi 查询结果回调@Overridepublic void onGetPoiResult(PoiResult poiResult) {List<PoiInfo> poiInfos = poiResult.getAllPoi();PoiSearchAdapter poiSearchAdapter = new PoiSearchAdapter(MainActivity.this, poiInfos, locationLatLng);searchPois.setVisibility(View.VISIBLE);searchPois.setAdapter(poiSearchAdapter);}//poi 详情查询结果回调@Overridepublic void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {}});}}//回退键@Overridepublic void onBackPressed() {finish();}@Overrideprotected void onResume() {super.onResume();// activity 恢复时同时恢复地图控件mMapView.onResume();}@Overrideprotected void onPause() {super.onPause();// activity 暂停时同时暂停地图控件mMapView.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();//退出时停止定位mLocClient.stop();//退出时关闭定位图层mBaiduMap.setMyLocationEnabled(false);// activity 销毁时同时销毁地图控件mMapView.onDestroy();//释放资源if (geoCoder != null) {geoCoder.destroy();}mMapView = null;}}
      

      代码说明:

      最终说明

      最终运行效果与文章开篇展示效果一样,这里呢就不再重复贴图了。

      • GitHub

        最终项目GitHub地址:https://github.com/scp504677840/MoveMapLocation.git









这篇关于百度地图之定位+移动选址的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/963979

相关文章

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

我在移动打工的日志

客户:给我搞一下录音 我:不会。不在服务范围。 客户:是不想吧 我:笑嘻嘻(气笑) 客户:小姑娘明明会,却欺负老人 我:笑嘻嘻 客户:那我交话费 我:手机号 客户:给我搞录音 我:不会。不懂。没搞过。 客户:那我交话费 我:手机号。这是电信的啊!!我这是中国移动!! 客户:我不管,我要充话费,充话费是你们的 我:可是这是移动!!中国移动!! 客户:我这是手机号 我:那又如何,这是移动!你是电信!!

机试算法模拟题 服务中心选址

题目描述 一个快递公司希望在一条街道建立新的服务中心。公司统计了该街道中所有区域在地图上的位置,并希望能够以此为依据为新的服务中心选址:使服务中心到所有区域的距离的总和最小。 给你一个数组positions,其中positions[i] = [left, right] 表示第 i 个区域在街道上的位置,其中left代表区域的左侧的起点,right代表区域的右侧终点,假设服务中心的位置为loca

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

简单的角色响应鼠标而移动

actor类 //处理移动距离,核心是找到角色坐标在世界坐标的向量的投影(x,y,z),然后在世界坐标中合成,此CC是在地面行走,所以Y轴投影始终置为0; using UnityEngine; using System.Collections; public class actor : MonoBehaviour { public float speed=0.1f; CharacterCo

js定位navigator.geolocation

一、简介   html5为window.navigator提供了geolocation属性,用于获取基于浏览器的当前用户地理位置。   window.navigator.geolocation提供了3个方法分别是: void getCurrentPosition(onSuccess,onError,options);//获取用户当前位置int watchCurrentPosition(

全英文地图/天地图和谷歌瓦片地图杂交/设备分布和轨迹回放/无需翻墙离线使用

一、前言说明 随着风云局势的剧烈变化,对我们搞软件开发的人员来说,影响也是越发明显,比如之前对美对欧的软件居多,现在慢慢的变成了对大鹅和中东以及非洲的居多,这两年明显问有没有俄语或者阿拉伯语的输入法的增多,这要是放在2019年以前,一年也遇不到一个人问这种需求场景的。 地图应用这块也是,之前的应用主要在国内,现在慢慢的多了一些外国的应用场景,这就遇到一个大问题,我们平时主要开发用的都是国内的地

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位

flume系列之:记录一次flume agent进程被异常oom kill -9的原因定位 一、背景二、定位问题三、解决方法 一、背景 flume系列之:定位flume没有关闭某个时间点生成的tmp文件的原因,并制定解决方案在博主上面这篇文章的基础上,在机器内存、cpu资源、flume agent资源都足够的情况下,flume agent又出现了tmp文件无法关闭的情况 二、

物联网之流水LED灯、正常流水灯、反复流水灯、移动流水灯

MENU 硬件电路设计软件程序设计正常流水LED灯反复流水LED灯移动流水LED灯 硬件电路设计 材料名称数量直插式LED1kΩ电阻杜邦线(跳线)若干面包板1 每一个LED的正极与开发板一个GPIO引脚相连,并串联一个电阻,负极接GND。 当然也可以选择只使用一个电阻。 软件程序设计 正常流水LED灯 因为要用到多个GPIO引脚,所以最好把所有的GPI