其他文章:
安卓百度离线地图的下载以及使用
安卓百度地图(一)定位功能的实现、周边POI的检索
安卓百度地图(二)地图显示以及离线地图的下载使用
安卓百度地图(三)绘制点、线等图层信息
安卓百度地图(五)百度地图路线规划
安卓百度地图(六)鹰眼轨迹的上传,历史轨迹的显示
安卓百度地图(七)地理围栏的建立与使用
本文就百度地图的城市,周边,区域POI检索,进行整理
一 POI检索简介
POI(Point of Interest),中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。
百度地图SDK提供三种类型的POI检索:城市内检索、周边检索和区域检索(即矩形范围检索)。下面将以POI城市内检索、周边检索 和 区域检索为例,向大家介绍如何使用检索服务。
二 POI检索
2.1 创建POI检索实例
mPoiSearch = PoiSearch.newInstance();
2.2 设置POI检索监听者
mPoiSearch.setOnGetPoiSearchResultListener(poiListener);
2.3 创建POI检索监听
OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {
public void onGetPoiResult(PoiResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(PoiActivity.this, "未搜索到POI数据", Toast.LENGTH_SHORT).show();
}
if (result.error == SearchResult.ERRORNO.NO_ERROR) {
//获取POI检索结果
Toast.makeText(PoiActivity.this, "已搜索到POI数据", Toast.LENGTH_SHORT).show();
}
if (result.error == SearchResult.ERRORNO.AMBIGUOUS_KEYWORD) {
// 当输入关键字在本市没有找到,但在其他城市找到时,返回包含该关键字信息的城市列表
String strInfo = "在";
for (CityInfo cityInfo : result.getSuggestCityList()) {
strInfo += cityInfo.city;
strInfo += ",";
}
strInfo += "找到结果";
Toast.makeText(PoiActivity.this, strInfo, Toast.LENGTH_LONG).show();
}
}
2.4发起检索请求
2.4.1 城市内检索
输入城市名(city),以及物品(name),和页码(num)发起检索。
mPoiSearch.searchInCity((new PoiCitySearchOption())
.city(city)
.keyword(name)
.pageNum(num));
2.4.2 周边检索
周边搜索是一个圆形范围,适用于以某个位置为中心点,输入圆心(center)、自定义检索半径值(radius)和页码(num)发起检索。
mPoiSearch.searchNearby(new PoiNearbySearchOption()
.keyword("餐厅")
.sortType(PoiSortType.distance_from_near_to_far)
.location(center)
.radius(radius)
.pageNum(num));
2.4.2 区域检索(即矩形范围检索)
POI区域检索以“用户指定的左下角和右上角坐标的长方形区域”为检索范围的poi检索。
LatLng southwest = new LatLng( 39.92235, 116.380338 );
LatLng northeast = new LatLng( 39.947246, 116.414977);
LatLngBounds searchbound = new LatLngBounds.Builder()
.include(southwest)
.include(northeast)
.build();
mPoiSearch.searchInBound(new PoiBoundSearchOption()
.bound(searchbound)
.keyword("餐厅"));
2.5 热词建议检索
2.5.1 创建在线建议查询实例
mSuggestionSearch = SuggestionSearch.newInstance();
2.5.2 创建在线建议查询监听者
OnGetSuggestionResultListener listener = new OnGetSuggestionResultListener() {
public void onGetSuggestionResult(SuggestionResult res) {
if (res == null || res.getAllSuggestions() == null) {
return;
//未找到相关结果
}
//获取在线建议检索结果
}
};
2.5.3 设置在线建议查询监听者
mSuggestionSearch.setOnGetSuggestionResultListener(listener);
2.5.4 发起在线建议查询
// 使用建议搜索服务获取建议列表,结果在onSuggestionResult()中更新
mSuggestionSearch.requestSuggestion((new SuggestionSearchOption())
.keyword(“百度”)
.city(“北京”));
2.5.5 释放在线建议查询实例;
mSuggestionSearch.destroy();
2.6 释放POI检索实例;
mPoiSearch.destroy();
2.7 注意事项
- 在传入city检索无结果时,会扩大检索范围,在全国进行检索。如有检索结果,不会直接返回,但会提示哪些城市有结果。
- 在传入city检索时,返回的结果太多,涉及多个城市,可以将扩大检索的城市list罗列,让用户点击选择,再针对选定城市进行二次检索(如果只有一个城市,后端直接进行二次检索)。可以调用的接口在PoiResult类中:
public List<CityInfo> getSuggestCityList() //返回城市列表页的结果数
三 公交线路查询
3.1 线路名称查询
输入公交线路的名称,POI检索返回的POI结果中,epoitype字段表示POI类型,epoitype字段值为2表示公交路线,4表示地铁路线,把这两种类型的POI的uid传给公交信息检索接口,可以得到该POI所代表的路线的详细信息(如:该公交线有多少个站点,每个站点的名称,位置、参考票价和上下线行信息)。
3.1.1 发起POI检索,获取相应线路的UID;
//以城市内检索为例,详细方法请参考POI检索部分的相关介绍
mSearch.searchInCity((new PoiCitySearchOption())
.city(“北京”)
.keyword(“302”);
3.1.2 在POI检索结果中判断该POI类型是否为公交信息
public void onGetPoiResult(PoiResult result) {
if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
return;
}
//遍历所有POI,找到类型为公交线路的POI
for (PoiInfo poi : result.getAllPoi()) {
if (poi.type == PoiInfo.POITYPE.BUS_LINE ||poi.type == PoiInfo.POITYPE.SUBWAY_LINE) {
//说明该条POI为公交信息,获取该条POI的UID
busLineId = poi.uid;
break;
}
}
}
3.1.3定义并设置公交信息结果监听者(与POI类似),并发起公交详情检索
//如下代码为发起检索代码,定义监听者和设置监听器的方法与POI中的类似
mBusLineSearch.searchBusLine((new BusLineSearchOption()
.city(“北京”)
.uid(busLineId)));
//线路 ID 查询
获取公交线路的详细信息,可使用线路 ID 查询。结果返回线路信息有线路 ID、公交类型、线路名称、线路坐标、城市编码、首发站、末站、首班车时间、末班车时间、全程里程、起步价、全程票价、线路沿途坐标。
<pre>
四 地理编码
地理编码分:正向地图编码、反向地图编码
正向地理编码:将地址信息转换为坐标点
反向地理编码:将坐标点转换为地址信息
GeoCoder mSearch = GeoCoder.newInstance();//初始化地理编码
mSearch.setOnGetGeoCodeResultListener(listener);//设置回调监听
ReverseGeoCodeOption reverseGeoCodeOption = new ReverseGeoCodeOption();
reverseGeoCodeOption.location(new LatLng(36.897,127.9897));//设置坐标点
mSearch.reverseGeoCode(reverseGeoCodeOption);//将坐标点转换为地址信息
GeoCodeOption geoCodeOption = new GeoCodeOption();
geoCodeOption.address(addressStr);//设置地址
geoCodeOption.city(cityStr);//设置城市
mSearch.geocode(geoCodeOption);//将地址信息转换为坐标点
OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
//正向地理编码回调,注意geoCodeResult中错误码的处理
geoCodeResult.getLocation();//坐标点
geoCodeResult.getAddress();//地址信息
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
//反向地理编码回调
reverseGeoCodeResult.getAddress();//简要地址信息
reverseGeoCodeResult.getAddressDetail();//层次化地址信息
reverseGeoCodeResult.getBusinessCircle();//所属商圈名称
reverseGeoCodeResult.getPoiList();//周边POI信息集合
reverseGeoCodeResult.getSematicDescription();//描述信息
reverseGeoCodeResult.getLocation();//坐标点
}
});
五 行政区边界数据检索
根据省、市、县(区)级行政区划名称,查询行政区划的详细边界信息。
DistrictSearch mDistrictSearch = DistrictSearch.newInstance();//初始化行政区检索
mDistrictSearch.setOnDistrictSearchListener(listener );//设置回调监听
DistrictSearchOption districtSearchOption = new DistrictSearchOption();
districtSearchOption.cityName(cityStr);//检索城市名称
districtSearchOption.districtName(districtStr);//检索的区县名称
mDistrictSearch.searchDistrict(districtSearchOption);//请求行政区数据
OnGetDistricSearchResultListener listener = new OnGetDistricSearchResultListener() {
@Override
public void onGetDistrictResult(DistrictResult districtResult) {
districtResult.getCenterPt();//获取行政区中心坐标点
districtResult.getCityName();//获取行政区域名称
List<List<LatLng>> polyLines = districtResult.getPolylines();//获取行政区域边界坐标点
//边界就是坐标点的集合,在地图上画出来就是多边形图层。有的行政区可能有多个区域,所以会有多个点集合。
}
};
本文主要做于收集整理笔记使用,关于文章的源码,请移步我的GitHub