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

原创 2015年11月17日 21:42:39

绪论

好久没写博客了,最近比较忙,闲下来写写博客,把小编最近用过的东西跟大家分享一下,记得上次写过一篇百度地图实现定位功能的博客,今天给大家分享一下定位之后获取周边地理位置的实现。
如果你还不知道怎么定位,看一下这里:
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">
    <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="@dimen/height_top_bar"
            android:background="@color/common_top_bar_dark"
            android:gravity="center_vertical">

        <Button
                android: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"
                />

        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:text="@string/location_message"
                style="@style/txt_titlebar_message"/>


        <Button
                android: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.MapView
            android:layout_weight="2"
            android:id="@+id/mapview_location"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:clickable="true" />

    <ListView
            android: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,设置是否使用gps
        option.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 {
        @Override
        public 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() {
                @Override
                public 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() {
            @Override
            public 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
     */
    @Override
    public 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() {
            @Override
            public 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);
                }
            }
        });

好了,很简单有用的一个小功能,会给用户带来很好的体验效果。

小编今天就写这么多,以后会更多的给大家分享的。

版权声明:本文为博主原创文章,转载请标明出处。

利用百度地图,实现移动端附近门店功能

利用百度地图,实现移动端附近门店功能
  • w263756314
  • w263756314
  • 2016年06月06日 16:02
  • 3804

Android 百度地图-实现POI的搜索(搜索周边)

首先贴出主要代码 Activity package cn.yhsh.maptest; import java.util.ArrayList; import utils.PoiOverlay; i...
  • xiayiye5
  • xiayiye5
  • 2016年03月24日 12:03
  • 2926

android 百度地图选择地址并再通过坐标获取地址

应用有考勤功能,但测试人员又总是在公司,测试不了考勤变化,于是为测试开发一个界面可以在测试时选择地址相当于定位。 查了一下百度API并未查到,但试了一下,结果在 MapStatusChangeLis...
  • chenlove1
  • chenlove1
  • 2017年12月21日 18:30
  • 84

Android 百度地图—反地理编码—获取当前位置附近的大厦楼宇

Android 百度地图——反地理编码——获取当前位置附近的大厦楼宇 类似添加收货地址选择所在位置或者附近的地点,效果图: 反地理编码就是将地理坐标转换成具体的地址信息,通过百度的坐标定...
  • a_ycmbc
  • a_ycmbc
  • 2016年05月20日 10:14
  • 3140

android 百度地图SDK 获取手机附近POI兴趣点列表 (过时)

文章内容已经过时~大家去百度官方api学习。 http://developer.baidu.com/map/ http://lbsyun.baidu.com/sdk/download ...
  • u014324292
  • u014324292
  • 2014年05月03日 22:22
  • 2108

百度地图开发(四)之POI检索

转载请注明出处: POI检索     POI~~~ Point of Interest,翻译过来就是“兴趣点”。我们在使用地图的时候,搜索周边的ktv,饭店,或者宾馆的时候,输入关键字,然后地图展示给...
  • crazy1235
  • crazy1235
  • 2015年03月01日 17:26
  • 90633

Android百度地图的搜索及附近地址的检索

下载地址:http://download.csdn.net/detail/xutaojxx/9891615 需要重新申请key
  • xutaojxx
  • xutaojxx
  • 2017年07月07日 13:41
  • 1404

百度地图开发(三)之地图控制 + 定位

转载请注明出处:     前两篇关于百度地图的blog写的是,一些基本图层的展示 和 覆盖物的添加+地理编码和反地理编码。     接下来,这篇blog主要说一些关于地图控制方面的内容和定位功能。  ...
  • crazy1235
  • crazy1235
  • 2015年02月21日 14:47
  • 73955

仿百度外卖3_7_1百度地图拖动定位,显示附近地址poi提示搜索

前页:这里用到的sdk包就不介绍了在百度api里面去下载就好了,然后就正式看对mapview的使用以及拖动地图控件时候对地图中间的红色箭头的处理。 1.先看下当前页面的布局文件:R.layout...
  • bryant_liu24
  • bryant_liu24
  • 2016年06月01日 14:46
  • 4782

调用百度地图接口获取位置,亲测可用

  • 2015年08月28日 09:34
  • 2KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 百度地图SDK 实现获取周边位置POI
举报原因:
原因补充:

(最多只允许输入30个字)