在地图开发中,可能有这么一个需求:打开地图之后,立即显示当前位置附近的住宅区,效果如下
具体实现思路:
添加一个定位监听器
//设置定位监听
mlocationClient.setLocationListener(new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation amapLocation) {
if (mListener != null && amapLocation != null) {
if (amapLocation != null
&& amapLocation.getErrorCode() == 0) {
mListener.onLocationChanged(amapLocation);
double currentLat = amapLocation.getLatitude();//获取纬度
double currentLng = amapLocation.getLongitude();//获取经度
currentCityName = amapLocation.getCity();//城市信息
processSearch(currentLat,currentLng,currentCityName);
} else {
String errText = "定位失败," + amapLocation.getErrorCode()+ ": " + amapLocation.getErrorInfo();
}
}
}
});
当你定位成功之后,可以获得当前城市的名称,以及当前城市的经度,和纬度
接下来继续看processSearch()方法
private void processSearch(double currentLat, double currentLng, String cityCode) {
//搜索的工具类
query = new PoiSearch.Query("", "住宅区", cityCode);
//keyWord表示搜索字符串,
//第二个参数表示POI搜索类型,二者选填其一,选用POI搜索类型时建议填写类型代码,码表可以参考下方(而非文字)
//cityCode表示POI搜索区域,可以是城市编码也可以是城市名称,也可以传空字符串,空字符串代表全国在全国范围内进行搜索
/* query.setPageSize(10);// 设置每页最多返回多少条poiitem
query.setPageNum(1);//设置查询页码*/
poiSearch = new PoiSearch(activity, query);
//搜素中心点以地图的当前中心点为准,搜索半径是3公里
poiSearch.setBound(new PoiSearch.SearchBound(new LatLonPoint(currentLat,
currentLng), 3*1000));
poiSearch.setOnPoiSearchListener(new PoiSearch.OnPoiSearchListener() {
@Override
public void onPoiSearched(PoiResult poiResult, int resCode) {
/* getTitle();//海棠-小区的名字
getCityName() 成都市
getProvinceName() 四川省
getSnippet() 海昌南路87号
*/
if(resCode == 1000 ){//搜索成功
List<SearchPOIBean> res = new ArrayList<>();
ArrayList<PoiItem> pois = poiResult.getPois();
for(int i = 0;i<pois.size();i++){
PoiItem poiItem = pois.get(i);
SearchPOIBean searchBean = new SearchPOIBean();
searchBean.title = poiItem.getTitle();
searchBean.detail =poiItem.getProvinceName()+poiItem.getCityName()+poiItem.getSnippet();
res.add(searchBean);
}
showPOIList(res);
}else{//搜索失败
}
}
@Override
public void onPoiItemSearched(PoiItem poiItem, int i) {
}
});
poiSearch.searchPOIAsyn();
}
这里对以上部分代码进行说明
query = new PoiSearch.Query("", "住宅区", cityCode);
Query的第一个参数是要搜索的内容,因为我的需求是,首次进入地图就只展示附近的住宅区,所以搜索内容可以不填。
Query的第二个参数是要搜索内容的分类,这里我写的是住宅区,需要注意的是,分类的名称不能随便乱写,要写高德提供的分类名称,比如,我这里的住宅区,这个分类名称也是从POI编码表里查找的,如下
具体的POI分类码表,各位可以去如下去下载
https://lbs.amap.com/api/webservice/download
Query的第三个参数是城市名,这个把定位的城市名传递进来就行。
当搜索成功之后,会回调onPoiSearched,这时,只需在onPoiSearched中,将获取到的数据展示出来就行了。
现在继续增加一个新的小需求,就是移动地图之后,以地图的中心点为准,根据其附近的住宅区信息,效果如下
只需添加一个监听即可实现,代码如下
aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
}
@Override
public void onCameraChangeFinish(CameraPosition cameraPosition) {
if(TextUtils.isEmpty(currentCityName)){
return;
}
processSearch(cameraPosition.target.latitude,cameraPosition.target.longitude,currentCityName);
}
});
当你移动地图结束后,会导致onCameraChangeFinish被回调,因此你只需在这里重新去根据当前的位置信息,获取附近的数据即可。