绪论

好久没写博客了,最近比较忙,闲下来写写博客,把小编最近用过的东西跟大家分享一下,记得上次写过一篇百度地图实现定位功能的博客,今天给大家分享一下定位之后获取周边地理位置的实现。 
如果你还不知道怎么定位,看一下这里: 
Android 轻松实现百度地图定位 
好了先看一下实现效果怎么样吧? 

实现

1.布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="@dimen/height_top_bar"android:background="@color/common_top_bar_dark"android:gravity="center_vertical"><Buttonandroid:id="@+id/btn_location_back"android:layout_width="wrap_content"android:layout_height="match_parent"android:drawableLeft="@drawable/back"android:text="@string/top_back"style="@style/btn_title_bar"android:layout_alignParentLeft="true"android:onClick="back"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:text="@string/location_message"style="@style/txt_titlebar_message"/><Buttonandroid:id="@+id/btn_location_ok"android:layout_width="52dp"android:layout_height="match_parent"android:layout_alignParentRight="true"android:background="@drawable/common_tab_bg"android:text="@string/txt_queding"style="@style/btn_title_bar"/></RelativeLayout><com.baidu.mapapi.map.MapViewandroid:layout_weight="2"android:id="@+id/mapview_location"android:layout_width="fill_parent"android:layout_height="match_parent"android:clickable="true" /><ListViewandroid:layout_weight="3"android:id="@+id/lv_location_nearby"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout>

布局文件就是上面是一个百度地图的mapview,下面是一个显示周边位置的ListView,很简单。

自动定位

我们先看一下根据自己的地理位置实现定位 
1.首先初始化要用到的组件

 /*** 初始化组件* by黄海杰 at:2015-11-02 17:15:47*/private void initView() {btnLocationBack = (Button) findViewById(R.id.btn_location_back);btnLocationBack.setOnClickListener(this);btnLocationOk = (Button) findViewById(R.id.btn_location_ok);btnLocationOk.setOnClickListener(this);mapViewLocation = (MapView) findViewById(R.id.mapview_location);lvLocNear = (ListView) findViewById(R.id.lv_location_nearby);nearList = new ArrayList<PoiInfo>();adapter = new LocNearAddressAdapter(context, nearList, isSelected);lvLocNear.setAdapter(adapter);}

2.初始化LocationClient类,该类需要在主线程中声明

public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();public void onCreate() {mLocationClient = new LocationClient(getApplicationContext());     //声明LocationClient类mLocationClient.registerLocationListener( myListener );    //注册监听函数
}

3.配置定位SDK参数 
设置定位参数包括:定位模式(高精度定位模式,低功耗定位模式和仅用设备定位模式),返回坐标类型,是否打开GPS,是否返回地址信息、位置语义化信息、POI信息等等。 
LocationClientOption类,该类用来设置定位SDK的定位方式

private void initLocation(){LocationClientOption option = new LocationClientOption();option.setLocationMode(LocationMode.Hight_Accuracy
);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系int span=1000;option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要option.setOpenGps(true);//可选,默认false,设置是否使用gpsoption.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要mLocationClient.setLocOption(option);}

4.实现BDLocationListener接口

 /*** 监听函数,有新位置的时候,格式化成字符串,输出到屏幕中*/public class MyLocationListenner implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {if (location == null) {return;}Log.d("map", "On location change received:" + location);Log.d("map", "addr:" + location.getAddrStr());if (progressDialog != null) {progressDialog.dismiss();}if (lastLocation != null) {if (lastLocation.getLatitude() == location.getLatitude() && lastLocation.getLongitude() == location.getLongitude()) {Log.d("map", "same location, skip refresh");// mMapView.refresh(); //need this refresh?return;}}lastLocation = location;mBaiduMap.clear();mCurrentLantitude = lastLocation.getLatitude();mCurrentLongitude = lastLocation.getLongitude();Log.e(">>>>>>>", mCurrentLantitude + "," + mCurrentLongitude);LatLng llA = new LatLng(lastLocation.getLatitude(), lastLocation.getLongitude());CoordinateConverter converter = new CoordinateConverter();converter.coord(llA);converter.from(CoordinateConverter.CoordType.COMMON);LatLng convertLatLng = converter.convert();OverlayOptions ooA = new MarkerOptions().position(convertLatLng).icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_marka)).zIndex(4).draggable(true);mCurrentMarker = (Marker) mBaiduMap.addOverlay(ooA);MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(convertLatLng, 16.0f);mBaiduMap.animateMapStatus(u);new Thread(new Runnable() {@Overridepublic void run() {searchNeayBy();}}).start();}public void onReceivePoi(BDLocation poiLocation) {if (poiLocation == null) {return;}}}

的BDLocation中包含好多参数,相信总有一个对你有用的。

根据经纬度定位

这种方法不需要自动定位,就是根据经纬度来显示地图上的位置

  /** 显示经纬度的位置* by:hankkin at:2015-05-04* */private void showMap(double latitude, double longtitude, String address) {
//        sendButton.setVisibility(View.GONE);LatLng llA = new LatLng(latitude, longtitude);CoordinateConverter converter = new CoordinateConverter();converter.coord(llA);converter.from(CoordinateConverter.CoordType.COMMON);LatLng convertLatLng = converter.convert();OverlayOptions ooA = new MarkerOptions().position(convertLatLng).icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_marka)).zIndex(4).draggable(true);markerA = (Marker) (mBaiduMap.addOverlay(ooA));u = MapStatusUpdateFactory.newLatLngZoom(convertLatLng, 16.0f);mBaiduMap.animateMapStatus(u);new Thread(new Runnable() {@Overridepublic void run() {searchNeayBy();}}).start();}获取周边地理位置

最后看一下怎么获取周边的地理位置,这里需要用到SDK中的一个类PoiNearbySearchOption,我们可以看一下类参考:

PoiNearbySearchOption keyword(java.lang.String key) 
检索关键字 
PoiNearbySearchOption location(LatLng location) 
检索位置 
PoiNearbySearchOption pageCapacity(int pageCapacity) 
设置每页容量,默认为每页10条 
PoiNearbySearchOption pageNum(int pageNum) 
分页编号 
PoiNearbySearchOption radius(int radius) 
设置检索的半径范围 
PoiNearbySearchOption sortType(PoiSortType sortType) 
搜索结果排序规则,可选,默认

这里是它的一些方法,我们可以看到我们只需要设置一下关键字、周边位置半径、检索位置、排序规则、分页号、每页数量等。然后我们实现OnGetPoiSearchResultListener这个接口,获取周边地理位置结果。

/*** 搜索周边地理位置* by hankkin at:2015-11-01 22:54:49*/private void searchNeayBy() {PoiNearbySearchOption option = new PoiNearbySearchOption();option.keyword("写字楼");option.sortType(PoiSortType.distance_from_near_to_far);option.location(new LatLng(mCurrentLantitude, mCurrentLongitude));if (radius != 0) {option.radius(radius);} else {option.radius(1000);}option.pageCapacity(20);mPoiSearch.searchNearby(option);}/**
     * 接受周边地理位置结果* by hankkin at:2015-11-02 17:14:54** @param poiResult*/@Overridepublic void onGetPoiResult(PoiResult poiResult) {if (poiResult != null) {if (poiResult.getAllPoi()!=null&&poiResult.getAllPoi().size()>0){nearList.addAll(poiResult.getAllPoi());if (nearList != null && nearList.size() > 0) {for (int i = 0; i < nearList.size(); i++) {isSelected.put(i, false);}}Message msg = new Message();msg.what = 0;handler.sendMessage(msg);}}}获取完数据之后更新适配器显示周边位置就OK了,最后再实现一个小小的功能,就是点击列表中的每个位置,显示位置的小图标根据位置的改变而改变
 /*** 周边地理位置列表点击事件* by hankkin  at:2015-11-02 17:16:29*/lvLocNear.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {adapter.setSelected(i);adapter.notifyDataSetChanged();PoiInfo ad = (PoiInfo) adapter.getItem(i);u = MapStatusUpdateFactory.newLatLng(ad.location);mBaiduMap.animateMapStatus(u);if (!isLoc) {mCurrentMarker.setPosition(ad.location);} else {markerA.setPosition(ad.location);}}});
好了,很简单有用的一个小功能,会给用户带来很好的体验效果。

Android 百度地图SDK 实现获取周边位置POI详解相关推荐

  1. Android 百度地图SDK 实现获取周边位置POI

    绪论 好久没写博客了,最近比较忙,闲下来写写博客,把小编最近用过的东西跟大家分享一下,记得上次写过一篇百度地图实现定位功能的博客,今天给大家分享一下定位之后获取周边地理位置的实现. 如果你还不知道怎么 ...

  2. android获得图片的坐标,Android百度地图定位后获取周边位置的实现代码

    本文实例讲解Android百度地图定位后获取周边位置的实现代码,分享给大家供大家参考,具体内容如下 效果图: 具体代码: 1.布局文件 android:orientation="vertic ...

  3. android 百度地图 在线建议查询,Android 百度地图 SDK v3_3_0 (五) ---POI搜索和在线建议查询功能...

    目前百度地图SDK所集成的检索服务包括:POI检索.公交信息查询.线路规划.地理编码.在线建议查询.短串分享. 本篇博客将先介绍POI检索和在线建议查询(在地图地位功能基础上实现的,还不知道定位的童靴 ...

  4. [android] 百度地图开发 (三).定位当前位置及getLastKnownLocation获取location总为空问题

           前一篇百度地图开发讲述"(二).定位城市位置和城市POI搜索",主要通过监听对象MKSearchListener类实现城市兴趣点POI(Point of Intere ...

  5. Android百度地图——搜索服务之周边检索

    周边检索:根据检索词.中心点地理坐标和半径与发起周边检索. 实现场景:查找以上海市浦东新区为中心,半径为1000米内所有的"浦东发展银行"(搜周边). 实现步骤: 一.前提条件: ...

  6. Android 百度地图 SDK v3.0.0 (四) 引入离线地图功能

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37758097 一直觉得地图应用支持离线地图很重要啊,我等移动2G屌丝,流量不易, ...

  7. Android百度地图SDK:隐藏比例尺,隐藏百度LOGO,隐藏缩放控件

     Android百度地图SDK:隐藏(不显示)比例尺,隐藏(不显示)百度LOGO,隐藏(不显示)缩放控件 在自己的Android应用开发中使用百度地图SDK,百度会自动在MapView上添加百度的 ...

  8. Android百度地图SDK—地图标记

    Android百度地图SDK-地图标记 概述 正文 概述 记录Android百度地图开发过程中的一些细节 正文 /*** lat:圆心纬度* lng:圆心经度* radius:半径/米*/privat ...

  9. Android:使用百度地图SDK定位当前具体位置(类似QQ发表说说的选择地点功能)

    百度地图 Android SDK是一套基于Android 2.1及以上版本设备的应用程序接口. 可以使用该套 SDK开发适用于Android系统移动设备的地图应用,通过调用地图SDK接口,可以轻松访问 ...

最新文章

  1. 基于Redis的服务治理平台!
  2. 用C语言解“打印九九乘法表”题
  3. Linux 命令之 rsync -- 远程数据同步工具
  4. AliOS Things SIG BLE Mesh网络的介绍和搭建
  5. 液态渐变背景纹理,选择一个新潮的背景,为你的设计加分!
  6. 快速打开计算机磁盘的软件,怎样快速启动电脑
  7. CSS 盒子模型(Box Model)
  8. Android开发之旅-Fragment和Activity之间onCreateOptionsMenu的联系
  9. 掘金翻译计划 GitHub Star 破3千--终于等到你
  10. redis mysql原理_Canal(redis与mysql数据一致性)
  11. 计算机高速接口与嵌入式设计与实现,基于嵌入式双结构通信系统高速接口的设计与实现...
  12. Win11 Windows聚焦失效修复方法
  13. 淘宝上大量贩卖微信号,这些人买这么多微信号目的是
  14. c++:简单的运算符重载
  15. 堆漏洞挖掘中的malloc_consolidate与FASTBIN_CONSOLIDATION_THRESHOLD
  16. 芬斯狄娜内衣怎么样,文胸质量好不好吗
  17. 关于网络下载的记忆碎片
  18. Vue——创建待办事件列表
  19. 建模思路|彩色C4D人物元素设计灵感
  20. vue双向数据绑定原理学习

热门文章

  1. 如何最好手机硬件测试软件,手机硬件出现故障?简单几部教你自己动手检测! _手机资讯...
  2. Spire.Office NET 7.7.6 重大重量 Spire.Office 7.7.X JAVA
  3. JAVA八种基本数据类型+三种引用数据类型
  4. linux 查看snmp端口,linux下的snmp配置及获取信息测试
  5. HoloLens2开发使用模拟器的方法(中英文对照)
  6. 广成GCAN-IO模块介绍
  7. android图片引导页
  8. 用户输入一句话,查找“呵”的位置
  9. 大数据催生智慧园区_“大数据”催生智慧园区
  10. pip/conda/venv/virtualenv区别详解