Android百度地图定位后获取周边位置的实现代码

本文实例讲解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、自动定位

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

 /**
   * 初始化组件
   */
  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中包含好多参数,相信总有一个对你有用的。

2、根据经纬度定位

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

 /*
  * 显示经纬度的位置
  * */
  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();
  }

3、获取周边地理位置

最后看一下怎么获取周边的地理位置,这里需要用到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这个接口,获取周边地理位置结果。

/**
   * 搜索周边地理位置
   */
  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);

  }

/*
* 接受周边地理位置结果
* @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了,最后再实现一个小小的功能,就是点击列表中的每个位置,显示位置的小图标根据位置的改变而改变

 /**
     * 周边地理位置列表点击事件
     */
    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);
        }
      }
    });

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

希望大家会喜欢这篇文章。

(0)

相关推荐

  • Android GridView实现滚动到指定位置的方法

    当一个列表项目很多,并且每个项目可以进入到其它Activity或者Fragment时,保存之前列表的位置是一个比较不错的功能, 今天研究了一下怎么保存浏览位置,发现GridView和它的父类中有4个相关的方法: 复制代码 代码如下: public void smoothScrollToPosition (int position) 滚动到position指定的位置,api level 11之下可用 *当你滚动完后,返回列表,能正常滚动,但是你再次从列表的项目返回后,滚动失效,就是只能滚动一次,我

  • 基于Android实现百度地图定位过程详解

    一.问题描述 LBS位置服务是android应用中重要的功能,应用越来越广泛,下面我们逐步学习和实现lbs相关的应用如定位.地图.导航等,首先我们看如何基于百度地图实现定位功能 二.配置环境 1.注册密钥:地址http://developer.baidu.com/map/ 2.下载定位SDK,并导入SDK如图所示: 三.编写MyApplication类 编写MyApplication类,为了使用方便我们可以将实现定位的方法封装的Application组件中 封装下列方法 1.  获取定位信息--

  • 在Android里完美实现基站和WIFI定位

    不过其实只要明白了基站/WIFI定位的原理,自己实现基站/WIFI定位其实不难.基站定位一般有几种,第一种是利用手机附近的三个基站进行三角定位,由于每个基站的位置是固定的,利用电磁波在这三个基站间中转所需要时间来算出手机所在的坐标:第二种则是利用获取最近的基站的信息,其中包括基站id,location area code.mobile country code.mobile network code和信号强度,将这些数据发送到google的定位web服务里,就能拿到当前所在的位置信息,误差一般在

  • Android实现GPS定位代码实例

    通过GPS取得的是一个Location类型的经纬度, 可以转换为两个Double 纬度和经度. 纬度: 23.223871812820435 纬度: 113.58986039161628 首先创建一个TextView和两个Button <TextView android:id="@+id/text" android:layout_width="fill_parent" android:layout_height="wrap_content"

  • Android基站定位原理及实现代码

    复制代码 代码如下: import java.io.BufferedReader; import java.io.InputStreamReader; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org

  • android 定位的4种方式介绍

    android 定位一般有四种方法,这四种方式分别是:GPS定位,WIFI定准,基站定位,AGPS定位,                               (1)Android GPS:需要GPS硬件支持,直接和卫星交互来获取当前经纬度,这种方式需要手机支持GPS模块(现在大部分的智能机应该都有了).通过GPS方式准确度是最高的,但是它的缺点也非常明显:1,比较耗电:2,绝大部分用户默认不开启GPS模块:3,从GPS模块启动到获取第一次定位数据,可能需要比较长的时间:4,室内几乎无法使

  • android通过gps获取定位的位置数据和gps经纬度

    复制代码 代码如下: package com.action.android_test;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.

  • Android实现地理定位功能

    最近试着写了一下Android的定位,代码在下面,比较简单 首先需要的权限有 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name=

  • 基于Android实现点击某个按钮让菜单选项从按钮周围指定位置弹出

    Android Material Design:PopupMenu Android Material Design 引入的PopupMenu类似过去的上下文菜单,但是更灵活. 如图所示: 现在给出实现上图PopupMenu的代码. 本例是一个普通的Button触发弹出PopupMenu. 测试的MainActivity.java : package zhangphil.materialdesign; import android.app.Activity; import android.os.B

  • Android GPS定位测试(附效果图和示例)

    今天因为工作需要,把以前编写的一个GPS测试程序拿出来重新修改了一下.这个程序说起来有些历史了,是我11年编写的,那时候学了Android开发没多久,算是一个实验性的作品.现在工作需要,重新拿出来修整.同时发现我对android的GPS服务了解并不深,所以今天特意阅读了有关GPS服务的一些资料,把相关知识点记录下来. 本人做了GPS相关的嵌入式软件已经几年了,所以说起要做个测试GPS定位模块的程序,第一反应就是串口读取GPS模块的数据,然后解析GPS的NMEA格式数据.NMEA是一种标准化数据格

随机推荐