优定义网

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

朴子萱 发表于 2018-6-11 20:15:36 | 显示全部楼层 |阅读模式

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

1.jpg

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

最终效果

2.jpg

demo点击打开链接

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精华推荐
  • 一个人开始废掉的3种迹象

    一个人开始废掉的3种迹象

  • 从零到60秒的惬意冰镇啤酒

    从零到60秒的惬意冰镇啤酒

  • 马云、马化腾、王石都弃之不用的人,有一个共同点

    马云、马化腾、王石都弃之不用的人,有一个

  • 哥特式高迪凳子

    哥特式高迪凳子

  • 千亿小米,雷军逆袭

    千亿小米,雷军逆袭

  • 她一战赚了几十亿,她说:世界上最好的生意有三种

    她一战赚了几十亿,她说:世界上最好的生意有

  • 雷军:合伙人比制度更重要!

    雷军:合伙人比制度更重要!

  • 一个美美的令人喜欢的自行车铃

    一个美美的令人喜欢的自行车铃

QQ客服热线
QQ:1090281100 周一至周日:09:00 - 21:00
WeChat:dianlingkeji
Email:kaixin1069@vip.qq.com

优定义logo

勿要吝啬你无形资产,请为创新续源,知识、点子、灵感、经验、需求等均是创新源泉,你不经意的一句话将是另一个人的灵感。明天的明天,还有明天,我们应该把握今天,每一个今天,都有一个新的事物在出现,今天的漠视明天的落后,不浪费每一个学习的时刻,学习助力非凡。

技术支持 Discuz! X3.4 - 3.5 beta © 2001-2018 Comsenz Inc.

小黑屋|手机版|优定义 ( 粤ICP备16085288号-2 )|申请友链|网站地图

粤公网安备 44011102001144 号 GMT+8, 2018-6-20 19:28 , Processed in 0.093167 second(s), 29 queries .

快速回复 返回顶部 返回列表