高德定位+poi搜索

先贴张图


不忙的时候自己研究了下可以实现上诉图片功能展示的实现。通过功能来分析,实现上述功能首先获取当前位置信息,这是先进行定位操做mLocationClient.startLocation();定位成功后调用onLocationChanged(AMapLocation amapLocation)方法,通过ampLocation实例可以获取当前定位点的信息,如地理 位置信息经纬度等。
再根据获取的当前位置经纬度进行poi查询。通过对PoiSearch.Query  对象的设置可以自定义查询关键字“keyword”,查询类型、查询地点范围、查询结果每页多少条数据等条件。

package com.amap.map2d.demo.location;


import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.widget.ListView;
import android.widget.RadioGroup;
import android.widget.TextView;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps2d.AMap;
import com.amap.api.maps2d.CameraUpdateFactory;
import com.amap.api.maps2d.LocationSource;
import com.amap.api.maps2d.MapView;
import com.amap.api.maps2d.model.BitmapDescriptorFactory;
import com.amap.api.maps2d.model.MyLocationStyle;
import com.amap.api.services.core.AMapException;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.core.PoiItem;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch;
import com.amap.map2d.demo.R;
import com.amap.map2d.demo.adapter.CustomLocationAdapter;

import java.util.ArrayList;
import java.util.List;

/**
 * AMapV2地图中介绍自定义定位小蓝点+搜索周边商务住宅
 */
public class CustomLocationActivity extends Activity implements LocationSource,
        AMapLocationListener {
    private AMap aMap;
    private MapView mapView;
    private OnLocationChangedListener mListener;
    private AMapLocationClient mlocationClient;
    private AMapLocationClientOption mLocationOption;
    private RadioGroup mGPSModeGroup;

    private TextView mLocationErrText;
    private static final int STROKE_COLOR = Color.argb(180, 3, 145, 255);
    private static final int FILL_COLOR = Color.argb(10, 0, 0, 180);
    private ListView lv_listaddress;
    private CustomLocationAdapter madapter;
    private List
   
   
    
     list;
    private PoiSearch.Query query;
    private int currentPage = 0;
    private LatLonPoint lp;//当前位置
    private PoiSearch poiSearch;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.e("onCreate", "onCreate++++++");
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);// 不显示程序的标题栏
        setContentView(R.layout.locationsource_activity);
        mapView = (MapView) findViewById(R.id.map);
        mapView.onCreate(savedInstanceState);// 此方法必须重写
        init();
        initlv();
    }

    private void initlv() {
        list = new ArrayList<>();
        lv_listaddress = (ListView) findViewById(R.id.lv_listaddress);

    }

    /**
     * 初始化
     */
    private void init() {
        Log.e("init", "init++++++");

        if (aMap == null) {
            aMap = mapView.getMap();
            setUpMap();
        }

        mLocationErrText = (TextView) findViewById(R.id.location_errInfo_text);
        mLocationErrText.setVisibility(View.GONE);
    }

    /**
     * 设置一些amap的属性
     */
    private void setUpMap() {
        Log.e("setUpMap", "setUpMap++++++");
        aMap.setLocationSource(this);// 设置定位监听
        aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示
        aMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
        setupLocationStyle();
    }

    private void setupLocationStyle() {
        Log.e("setupLocationStyle", "setupLocationStyle++++++");

        // 自定义系统定位蓝点
        MyLocationStyle myLocationStyle = new MyLocationStyle();
        // 自定义定位蓝点图标
        myLocationStyle.myLocationIcon(BitmapDescriptorFactory.
                fromResource(R.drawable.gps_point));
        // 自定义精度范围的圆形边框颜色
        myLocationStyle.strokeColor(STROKE_COLOR);
        //自定义精度范围的圆形边框宽度
        myLocationStyle.strokeWidth(5);
        // 设置圆形的填充颜色
        myLocationStyle.radiusFillColor(FILL_COLOR);
        // 将自定义的 myLocationStyle 对象添加到地图上
        aMap.setMyLocationStyle(myLocationStyle);
    }

    /**
     * 方法必须重写
     */
    @Override
    protected void onResume() {
        Log.e("onResume", "onResume++++++");

        super.onResume();
        mapView.onResume();
    }

    /**
     * 方法必须重写
     */
    @Override
    protected void onPause() {
        Log.e("onPause", "onPause++++++");

        super.onPause();
        mapView.onPause();
        deactivate();
    }

    /**
     * 方法必须重写
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        Log.e("onSaveInstanceState", "onSaveInstanceState++++++");

        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }

    /**
     * 方法必须重写
     */
    @Override
    protected void onDestroy() {
        Log.e("onDestroy", "onDestroy++++++");

        super.onDestroy();
        mapView.onDestroy();
        if (null != mlocationClient) {
            mlocationClient.onDestroy();
        }
    }

    /**
     * 定位成功后回调函数
     */
    @Override
    public void onLocationChanged(AMapLocation amapLocation) {
        Log.e("onLocationChanged", "onLocationChanged++++++");

        if (mListener != null && amapLocation != null) {
            if (amapLocation != null
                    && amapLocation.getErrorCode() == 0) {
                mLocationErrText.setVisibility(View.GONE);
                mListener.onLocationChanged(amapLocation);// 显示系统小蓝点
                Log.e("current+address", amapLocation.getAddress());
                Log.e("current+address", amapLocation.getPoiName());
                //自定义小蓝点外部圆的范围
                aMap.moveCamera(CameraUpdateFactory.zoomTo(30));
                queryPoi(amapLocation);
//                aMap.moveCamera(CameraUpdateFactory.zoomTo(18));
                Log.e("经纬度", "经度" + amapLocation.getLatitude() + "纬度=====" + amapLocation.getLongitude());
            } else {
                String errText = "定位失败," + amapLocation.getErrorCode() + ": " + amapLocation.getErrorInfo();
                Log.e("AmapErr", errText);
                mLocationErrText.setVisibility(View.VISIBLE);
                mLocationErrText.setText(errText);
            }
        }
    }

    /**
     * 查询附近地址
     */
    private void queryPoi(AMapLocation amapLocation) {

        String keyword = "";
        query = new PoiSearch.Query(keyword, "商务住宅", amapLocation.getProvince());// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
        query.setPageSize(100);// 设置每页最多返回多少条poiitem
        query.setPageNum(currentPage);// 设置查第一页
        lp = new LatLonPoint(amapLocation.getLatitude(), amapLocation.getLongitude());
        if (lp != null) {
            poiSearch = new PoiSearch(this, query);
            poiSearch.setOnPoiSearchListener(new PoiSearch.OnPoiSearchListener() {
                @Override
                public void onPoiSearched(PoiResult poiResult, int i) {
                    if (i == AMapException.CODE_AMAP_SUCCESS) {
                        if (poiResult != null && poiResult.getQuery() != null) {// 搜索poi的结果
                            if (poiResult.getQuery().equals(query)) {// 是否是同一条
                                list = poiResult.getPois();
                                if (list != null && list.size() > 0) {
                                    if (madapter == null) {
                                        madapter = new CustomLocationAdapter(CustomLocationActivity.this, list);
                                        lv_listaddress.setAdapter(madapter);
                                    }
                                    madapter.notifyDataSetChanged();
                                }
                            }
                        }
                    } else {
                        Log.e("error", "失败");
                    }
                }

                @Override
                public void onPoiItemSearched(PoiItem poiItem, int i) {

                }
            });
            poiSearch.setBound(new PoiSearch.SearchBound(lp, 3000, true));//
            // 设置搜索区域为以lp点为圆心,其周围3000米范围
            poiSearch.searchPOIAsyn();// 异步搜索
        }
    }

    /**
     * 激活定位
     */
    @Override
    public void activate(OnLocationChangedListener listener) {
        Log.e("activate", "activate++++++");

        mListener = listener;
        if (mlocationClient == null) {
            mlocationClient = new AMapLocationClient(this);
            mLocationOption = new AMapLocationClientOption();
            //设置定位监听
            mlocationClient.setLocationListener(this);

            //设置定位模式为高精度模式,Battery_Saving 为低功耗模式,Device_Sensors是仅设备模式
            mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
            //设置是否犯规地址信息)默认返回)
            mLocationOption.setNeedAddress(true);
            //设置是否只定位一次
            mLocationOption.setOnceLocation(true);
            if (mLocationOption.isOnceLocationLatest()) {
                //设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。
                //如果设置其为true,setOnceLocation(boolean b)接口也会被设置为true,反之不会。
                mLocationOption.setOnceLocationLatest(true);
            }
            //设置是否强制刷新wify,默认为强制
            mLocationOption.setWifiActiveScan(true);
            //设置是否允许模拟位置 ,默认为FALSE不允许
            mLocationOption.setMockEnable(false);
            //设置定位间隔 单位毫秒,默认为2000ms
            mLocationOption.setInterval(2000);
            //给定位客户端设置参数
            mlocationClient.setLocationOption(mLocationOption);
            // 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
            // 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求
            // 在定位结束后,在合适的生命周期调用onDestroy()方法
            // 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
            mlocationClient.startLocation();
        }
    }

    /**
     * 停止定位
     */
    @Override
    public void deactivate() {
        Log.e("deactivate", "deactivate++++++");

        mListener = null;
        if (mlocationClient != null) {
            mlocationClient.stopLocation();
            mlocationClient.onDestroy();
        }
        mlocationClient = null;
    }


}

   
   
我是在高德的demo基础上更改的哦,我自己还是挺喜欢高德的demo的,写很精简哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值