您的位置:首页 > 其它

高德定位+poi搜索

2017-01-16 15:58 239 查看
先贴张图



不忙的时候自己研究了下可以实现上诉图片功能展示的实现。通过功能来分析,实现上述功能首先获取当前位置信息,这是先进行定位操做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的,写很精简哦!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: