利用高德地图的API做了一个类似微信发送位置界面地址选择,界面就3个,一个选择地址(周边搜索),一个搜索界面(关键字搜索),最后将选择的地址信息返回主界面,效果图如下:
对于详细地址选择,在项目中难免会遇到,比如电商app,旅游app等等,下面简单讲解如何实现:
一、注册高德开发者账号,创建应用,获取AppId
1.创建应用过程
红色※为必填项
确认随后得到appid
2.下载高德SDK:
二、地址位置选择
1.地址选择界面首先需要定位
private void InitLocation() {
//初始化client
locationClient = new AMapLocationClient(this.getApplicationContext());
//设置定位参数
locationClient.setLocationOption(getDefaultOption());
// 设置定位监听
locationClient.setLocationListener(locationListener);
locationClient.startLocation();
}
2.定位结果回调
/**
* 定位监听
*/
AMapLocationListener locationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation loc) {
if (null != loc) {
//解析定位结果
String city = loc.getCity();
Log.e("yufs","當前经度"+loc.getLongitude()+"当前维度:"+loc.getLatitude());
mLoc=loc;
lp.setLongitude(loc.getLongitude());
lp.setLatitude(loc.getLatitude());
//得到定位信息
Log.e("yufs","定位详细信息:"+loc.toString());
mLatitude=loc.getLatitude();
mLongitude=loc.getLongitude();
//初始化地图对象
initMap(loc);
//查询周边
doSearchQuery(loc.getCity(),loc.getLatitude(),loc.getLongitude());
} else {
Toast.makeText(LocationSelectActivity.this, "定位失败,请打开位置权限", Toast.LENGTH_SHORT).show();
}
}
};
3.定位成功回调中进行周边搜索
/**
* 开始进行poi搜索
*/
protected void doSearchQuery(String city,double latitude,double longitude) {
String mType="汽车服务|汽车销售|汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|体育休闲服务|医疗保健服务|住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务|交通设施服务|金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施";
query = new PoiSearch.Query("", mType, city);// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
query.setPageSize(20);// 设置每页最多返回多少条poiitem
query.setPageNum(currentPage);// 设置查第一页
if (lp != null) {
poiSearch = new PoiSearch(this, query);
poiSearch.setOnPoiSearchListener(this);
//以当前定位的经纬度为准搜索周围5000米范围
// 设置搜索区域为以lp点为圆心,其周围5000米范围
poiSearch.setBound(new PoiSearch.SearchBound(new LatLonPoint(latitude,longitude), 1000, true));//
poiSearch.searchPOIAsyn();// 异步搜索
}
}
PoiSearch.SearchBound对象以某一中心点半径5000米的圆搜索结果,PoiSearch.Query()的如果第二个参数未填写会 默认返回“餐饮服务”、“商务住宅”、“生活服务”这三种类别的POI,代码中基本上把高德所有的搜索类型都返回了,你可以根据自己情况而定填写搜索类型
4.poi搜索结果回调监听,获取数据显示
PoiSearch.OnPoiSearchListener onPoiSearchListener = new PoiSearch.OnPoiSearchListener() {
@Override
public void onPoiSearched(PoiResult result, int rCode) {
if (rCode == 1000) {
if (result != null && result.getQuery() != null) {// 搜索poi的结果
if (result.getQuery().equals(poiQuery)) {// 是否是同一条
lv_list.onLoadComplete();
List<PoiItem> poiItems = result.getPois();// 取得第一页的poiitem数据,页数从数字0开始
List<PoiBean> tem=new ArrayList<>();
if (poiItems != null && poiItems.size() > 0) {
for (int i = 0; i < poiItems.size(); i++) {
PoiItem poiItem = poiItems.get(i);
PoiBean bean=new PoiBean();
bean.setTitleName(poiItem.getTitle());
bean.setCityName(poiItem.getCityName());
bean.setAd(poiItem.getAdName());
bean.setSnippet(poiItem.getSnippet());
bean.setPoint(poiItem.getLatLonPoint());
Log.e("yufs",""+poiItem.getTitle()+","+poiItem.getProvinceName()+","
+poiItem.getCityName()+","
+poiItem.getAdName()+","//区
+poiItem.getSnippet()+","
+poiItem.getLatLonPoint()+"\n");
tem.add(bean);
}
poiData.addAll(tem);
mAdapter.notifyDataSetChanged();
/* if (isSearch){
moveMapCamera(poiItems.get(0).getLatLonPoint().getLatitude(),poiItems.get(0).getLatLonPoint().getLongitude());
}*/
}
}
}
}
}
@Override
public void onPoiItemSearched(PoiItem poiItem, int i) {
}
};
其中PoiItem对象为高德提供的一个poi实体类,可以查看返回的数据结构如下:
然后你也可以选择其中有用的信息封装自己的bean,比如我的PoiBean,获取有用的数据之后显示在列表上,到此第一页搞定
三、关键字搜索
protected void doSearchQuery(String keyWord) {
if(currentPage==0) {
savePoiItem.clear();
ll_loading.setVisibility(View.VISIBLE);// 显示进度框
lv_list.setVisibility(View.GONE);
}
query = new PoiSearch.Query(keyWord, "", "");// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
query.setPageSize(10);// 设置每页最多返回多少条poiitem
query.setPageNum(currentPage);// 设置查第一页
query.setCityLimit(true);
poiSearch = new PoiSearch(this, query);
poiSearch.setOnPoiSearchListener(this);
poiSearch.searchPOIAsyn();
}
同样调用刚才的搜索接口,只不过加上了关键字,去掉了搜索范围的限制,搜索回调接口同上,将搜索结果显示出来,然后搜索页面搞定(提醒:demo中使用自己在高德申请的Appkey,然后就可查看效果了)