百度地图点击地图显示所选位置与自定义回到定位按钮

原文链接: https://blog.csdn.net/but455/article/details/72772317

第一篇博客,,近期遇到一个关于地图选点显示地理位置与自定义回到定位按钮的需求,  以前做过,也是参考大神们的经验,之所以写出来就是为了把遇到的坑写一下,文笔不好,请谅解


百度地图api 貌似是没有显示这个定位按钮的,只能自己写,


布局

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:top= "http://schemas.android.com/apk/res-auto"
  3. android:layout_width= "match_parent"
  4. android:layout_height= "match_parent"
  5. android:orientation= "vertical" >
  6. <LinearLayout
  7. android:layout_width= "match_parent"
  8. android:layout_height= "wrap_content"
  9. android:orientation= "horizontal" >
  10. <TextView
  11. android:text= "城市:"
  12. android:layout_width= "wrap_content"
  13. android:layout_height= "wrap_content" />
  14. <TextView
  15. android:text= "佛山市"
  16. android:id= "@+id/city_tv"
  17. android:layout_width= "wrap_content"
  18. android:layout_height= "wrap_content"
  19. />
  20. </LinearLayout>
  21. <LinearLayout
  22. android:layout_width= "match_parent"
  23. android:layout_height= "wrap_content"
  24. android:orientation= "horizontal" >
  25. <TextView
  26. android:text= "地址:"
  27. android:layout_width= "wrap_content"
  28. android:layout_height= "wrap_content" />
  29. <TextView
  30. android:text= "佛山市南海桂城镇"
  31. android:id= "@+id/address_tv"
  32. android:layout_width= "wrap_content"
  33. android:layout_height= "wrap_content"
  34. />
  35. </LinearLayout>
  36. <RelativeLayout
  37. android:layout_width= "match_parent"
  38. android:layout_height= "match_parent" >
  39. <com.baidu.mapapi.map.MapView
  40. android:id= "@+id/bmapView"
  41. android:layout_width= "fill_parent"
  42. android:layout_height= "fill_parent"
  43. android:clickable= "true" />
  44. <Button
  45. android:text= "定位"
  46. android:id= "@+id/dw_bt"
  47. android:layout_width= "wrap_content"
  48. android:layout_height= "wrap_content"
  49. android:layout_alignParentLeft= "true"
  50. android:layout_alignParentBottom= "true"
  51. android:layout_marginLeft= "25dp"
  52. android:layout_marginBottom= "10dip" />
  53. </RelativeLayout>
  54. </LinearLayout>


废话不说,自己看代码


  1. package com.example.baidumaptest;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.view.View.OnClickListener;
  6. import android.widget.Button;
  7. import android.widget.TextView;
  8. import com.baidu.location.BDLocation;
  9. import com.baidu.location.BDLocationListener;
  10. import com.baidu.location.LocationClient;
  11. import com.baidu.location.LocationClientOption;
  12. import com.baidu.mapapi.SDKInitializer;
  13. import com.baidu.mapapi.map.BaiduMap;
  14. import com.baidu.mapapi.map.BaiduMap.OnMapClickListener;
  15. import com.baidu.mapapi.map.BitmapDescriptor;
  16. import com.baidu.mapapi.map.BitmapDescriptorFactory;
  17. import com.baidu.mapapi.map.MapPoi;
  18. import com.baidu.mapapi.map.MapStatus;
  19. import com.baidu.mapapi.map.MapStatusUpdateFactory;
  20. import com.baidu.mapapi.map.MapView;
  21. import com.baidu.mapapi.map.MarkerOptions;
  22. import com.baidu.mapapi.model.LatLng;
  23. import com.baidu.mapapi.search.geocode.GeoCodeResult;
  24. import com.baidu.mapapi.search.geocode.GeoCoder;
  25. import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
  26. import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
  27. import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
  28. public class BaiduTestActivity extends Activity {
  29. private MapView mMapView = null;
  30. private BaiduMap mBaiduMap;
  31. private BitmapDescriptor bitmap;
  32. private String address = "";
  33. private double mCurrentLat = 0.0;
  34. private double mCurrentLon = 0.0;
  35. public MyLocationListenner myListener = new MyLocationListenner();
  36. private LocationClient mLocClient;
  37. private TextView city_tv, address_tv;
  38. private Button dw_bt;
  39. @Override
  40. protected void onCreate(Bundle savedInstanceState) {
  41. super.onCreate(savedInstanceState);
  42. // 在使用SDK各组件之前初始化context信息,传入ApplicationContext
  43. // 注意该方法要再setContentView方法之前实现
  44. SDKInitializer.initialize(getApplicationContext());
  45. setContentView(R.layout.activity_bdtest);
  46. city_tv = (TextView) findViewById(R.id.city_tv);
  47. address_tv = (TextView) findViewById(R.id.address_tv);
  48. dw_bt=(Button)findViewById(R.id.dw_bt);
  49. // 获取地图控件引用
  50. mMapView = (MapView) findViewById(R.id.bmapView);
  51. mBaiduMap = mMapView.getMap();
  52. // 设置是否显示比例尺控件
  53. mMapView.showScaleControl(false);
  54. // 设置是否显示缩放控件
  55. mMapView.showZoomControls(true);
  56. // 设置是否显示定位按钮
  57. // 删除百度地图LoGo
  58. mMapView.removeViewAt(1);
  59. // 设置marker图标
  60. bitmap = BitmapDescriptorFactory
  61. .fromResource(R.drawable.ssdk_oks_ptr_ptr);
  62. mBaiduMap.setOnMapClickListener(new OnMapClickListener() {
  63. @Override
  64. public boolean onMapPoiClick(MapPoi arg0) {
  65. // TODO Auto-generated method stub
  66. return false;
  67. }
  68. // 此方法就是点击地图监听
  69. @Override
  70. public void onMapClick(LatLng latLng) {
  71. // 获取经纬度
  72. mCurrentLat = latLng.latitude;
  73. mCurrentLon = latLng.longitude;
  74. // 先清除图层
  75. mBaiduMap.clear();
  76. // 定义Maker坐标点
  77. LatLng point = new LatLng(mCurrentLat, mCurrentLon);
  78. // 构建MarkerOption,用于在地图上添加Marker
  79. MarkerOptions options = new MarkerOptions().position(point)
  80. .icon(bitmap);
  81. // 在地图上添加Marker,并显示
  82. mBaiduMap.addOverlay(options);
  83. // 实例化一个地理编码查询对象
  84. GeoCoder geoCoder = GeoCoder.newInstance();
  85. // 设置反地理编码位置坐标
  86. ReverseGeoCodeOption op = new ReverseGeoCodeOption();
  87. op.location(latLng);
  88. // 发起反地理编码请求(经纬度->地址信息)
  89. geoCoder.reverseGeoCode(op);
  90. geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
  91. @Override
  92. public void onGetReverseGeoCodeResult(
  93. ReverseGeoCodeResult arg0) {
  94. // 获取点击的坐标地址
  95. address = arg0.getAddress();
  96. city_tv.setText(arg0.getAddressDetail().city);
  97. address_tv.setText(address);
  98. }
  99. @Override
  100. public void onGetGeoCodeResult(GeoCodeResult arg0) {
  101. }
  102. });
  103. }
  104. });
  105. // 开启定位图层
  106. mBaiduMap.setMyLocationEnabled(true);
  107. // 定位初始化
  108. mLocClient = new LocationClient(this);
  109. mLocClient.registerLocationListener(myListener);
  110. LocationClientOption option = new LocationClientOption();
  111. option.setOpenGps(true); // 打开gps
  112. option.setCoorType("bd09ll"); // 设置坐标类型
  113. option.setScanSpan(1000);
  114. mLocClient.setLocOption(option);
  115. mLocClient.start();
  116. //点击定位按钮重新定位
  117. dw_bt.setOnClickListener(new OnClickListener() {
  118. @Override
  119. public void onClick(View v) {
  120. // TODO Auto-generated method stub
  121. mBaiduMap.setMyLocationEnabled(true);
  122. mLocClient.start();
  123. }
  124. });
  125. }
  126. /**
  127. * 定位SDK监听函数
  128. */
  129. public class MyLocationListenner implements BDLocationListener {
  130. @Override
  131. public void onReceiveLocation(BDLocation location) {
  132. // TODO Auto-generated method stub
  133. // map view 销毁后不在处理新接收的位置
  134. if (location == null || mMapView == null) {
  135. return;
  136. }
  137. // 获取经纬度
  138. mCurrentLat = location.getLatitude();
  139. mCurrentLon = location.getLongitude();
  140. // 先清除图层
  141. mBaiduMap.clear();
  142. // 定义Maker坐标点
  143. LatLng point = new LatLng(mCurrentLat, mCurrentLon);
  144. // 构建MarkerOption,用于在地图上添加Marker
  145. MarkerOptions options = new MarkerOptions().position(point).icon(
  146. bitmap);
  147. // 在地图上添加Marker,并显示
  148. mBaiduMap.addOverlay(options);
  149. LatLng ll = new LatLng(location.getLatitude(),
  150. location.getLongitude());
  151. MapStatus.Builder builder = new MapStatus.Builder();
  152. builder.target(ll).zoom(18.0f);
  153. mBaiduMap.animateMapStatus(MapStatusUpdateFactory
  154. .newMapStatus(builder.build()));
  155. // 实例化一个地理编码查询对象
  156. GeoCoder geoCoder = GeoCoder.newInstance();
  157. // 设置反地理编码位置坐标
  158. ReverseGeoCodeOption op = new ReverseGeoCodeOption();
  159. op.location(point);
  160. // 发起反地理编码请求(经纬度->地址信息)
  161. geoCoder.reverseGeoCode(op);
  162. geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
  163. @Override
  164. public void onGetReverseGeoCodeResult(ReverseGeoCodeResult arg0) {
  165. // 获取点击的坐标地址
  166. address = arg0.getAddress();
  167. city_tv.setText(arg0.getAddressDetail().city);
  168. address_tv.setText(address);
  169. // 定位成功后就停止
  170. mBaiduMap.setMyLocationEnabled(false);
  171. if (mLocClient.isStarted()) {
  172. mLocClient.stop();
  173. };
  174. }
  175. @Override
  176. public void onGetGeoCodeResult(GeoCodeResult arg0) {
  177. }
  178. });
  179. }
  180. }
  181. @Override
  182. protected void onDestroy() {
  183. super.onDestroy();
  184. mLocClient.stop();
  185. // 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
  186. mMapView.onDestroy();
  187. }
  188. @Override
  189. protected void onResume() {
  190. super.onResume();
  191. // 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
  192. mMapView.onResume();
  193. }
  194. @Override
  195. protected void onPause() {
  196. super.onPause();
  197. // 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
  198. mMapView.onPause();
  199. }
  200. }

   <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="你的百度key" />


 <service
                android:name="com.baidu.location.f"
                android:enabled="true"
                android:process=":remote" >
        </service>

上面的service一定要记得写,不然无法实现返回自己位置的功能

最终效果



demo点击打开链接



猜你喜欢

转载自blog.csdn.net/chenhuakang/article/details/80909652