废话
前后两千万,拍照更清晰。大家好,这里是OPPO R11独家冠名赞助播出的大型情感类电视连续剧《Android高德之旅》,我是主持人大公爵。这期节目,我们来讲一下厉害的POI。
简介
POI(Point of Interest,兴趣点),在地图表达中,一个 POI 可代表一栋大厦、一家商铺、一处景点等等。通过POI搜索,完成找餐馆、找景点、找厕所等等的功能。地图 SDK 的搜索功能提供多种获取 POI 数据的接口。
我们这里要讲的是四种:
- POI关键词搜索
- POI周边搜索
- POI ID搜索
- POI沿途搜索。
1、POI关键词搜索
所谓关键词搜索就是根据关键词搜索POI(等于没说),直接看代码吧。
PoiSearch.Query query = new PoiSearch.Query(关键词, POI类型, 城市名\城市编码\空串);
query.setPageSize(10);
query.setPageNum(pageNo);
PoiSearch poiSearch = new PoiSearch(this, query);
poiSearch.setOnPoiSearchListener(new PoiSearch.OnPoiSearchListener() {
@Override
public void onPoiSearched(PoiResult poiResult, int rCode) {
}
@Override
public void onPoiItemSearched(PoiItem poiItem, int rCode) {
}
});
poiSearch.searchPOIAsyn();
代码很简单。构建Query对象时,需要传三个参数,第一个是关键词,第二是POI类型,这两个参数只要传其一即可,第三个参数是城市名或城市编码,如果传空串,则会在全国范围内搜索。下面是设置分页查询的参数。
构建好Query对象后,就可以构建PoiSearch对象,调用searchPOIAsync方法搜索,搜索结果会通过onPoiSearched(PoiResult poiResult, int rCode)方法回调,我们拿到结果后,可以用前面的Marker技术展示在地图中。
poiSearch.setOnPoiSearchListener(new PoiSearch.OnPoiSearchListener() {
@Override
public void onPoiSearched(PoiResult poiResult, int rCode) {
ArrayList<PoiItem> pois = poiResult.getPois();
List<MultiPointItem> list = new ArrayList<>();
for (PoiItem item : pois) {
LatLonPoint latLonPoint = item.getLatLonPoint();
list.add(new MultiPointItem(new LatLng(latLonPoint.getLatitude(), latLonPoint.getLongitude())));
}
showResultOnMap(list);
}
@Override
public void onPoiItemSearched(PoiItem poiItem, int rCode) {
}
});
private void showResultOnMap(List<MultiPointItem> list) {
MultiPointOverlayOptions overlayOptions = new MultiPointOverlayOptions();
overlayOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_mdl));
overlayOptions.anchor(0.5f,0.5f);
multiPointOverlay = aMap.addMultiPointOverlay(overlayOptions);
multiPointOverlay.setItems(list);
aMap.setOnMultiPointClickListener(new AMap.OnMultiPointClickListener() {
@Override
public boolean onPointClick(MultiPointItem pointItem) {
return false;
}
});
}
2、POI周边搜索
所谓周边搜索就是搜索周边POI,仍然可以传关键词,直接看代码吧。
PoiSearch.Query query = new PoiSearch.Query(关键词, POI类型, "");
query.setPageSize(10);
query.setPageNum(pageNo);
poiSearch = new PoiSearch(this, query);
LatLonPoint latLon = new LatLonPoint(39.993743, 116.472995);
poiSearch.setBound(new PoiSearch.SearchBound(latLon, 5000, true));
poiSearch.setOnPoiSearchListener(new PoiSearch.OnPoiSearchListener() {
@Override
public void onPoiSearched(PoiResult poiResult, int rCode) {
}
@Override
public void onPoiItemSearched(PoiItem poiItem, int rCode) {
}
});
poiSearch.searchPOIAsyn();
因为是查询周边,所以就不要传城市名了,而是调用poiSearch.setBound()方法,设置你所在的地方。查询结果的展示和上面关键词搜索一样。
3、POI ID搜索
这个当时把我看蒙了,半天没明白这个ID是什么东西。其实这个ID就是用关键词或者周边搜索搜出来的POI的ID。比如下面这个回调,我们获得了一组PoiItem,如果你对某个PoiItem感兴趣,就可以记录一下它的id,将来直接用id就可以搜索之前感兴趣的PoiItem。
poiSearch.setOnPoiSearchListener(new PoiSearch.OnPoiSearchListener() {
@Override
public void onPoiSearched(PoiResult poiResult, int rCode) {
ArrayList<PoiItem> pois = poiResult.getPois();
for (PoiItem item : pois) {
if (感兴趣) {
save(item.getPoiId());
}
}
showResultOnMap(list);
}
@Override
public void onPoiItemSearched(PoiItem poiItem, int rCode) {
}
});
4、POI沿途搜索
这个稍微高大上一点,比如我要开车去北京朝阳区,但是我车子快没油了,于是我想搜索在我去朝阳区的沿途有哪些加油站,这就派上用场了,看代码。
(1)首先,我们要确定两个点:出发点,目的地
LatLonPoint mStartPoint = new LatLonPoint(39.742295, 116.235891);
LatLonPoint mEndPoint = new LatLonPoint(39.995576, 116.481288);
(2)为了看的更明显,我们为这两个点添加Marker
LatLng start = new LatLng(mStartPoint.getLatitude(), mStartPoint.getLongitude());
aMap.addMarker(new MarkerOptions()
.position(start)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.start)));
LatLng end = new LatLng(mEndPoint.getLatitude(), mEndPoint.getLongitude());
aMap.addMarker(new MarkerOptions()
.position(end)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.end)));
(3)显示出导航路径
为了凸显出POI的搜索结果是真正的“沿途”,我们要把导航路径显示出来。
private void searchRoute() {
mRouteSearch = new RouteSearch(this);
mRouteSearch.setRouteSearchListener(new RouteSearch.OnRouteSearchListener() {
@Override
public void onBusRouteSearched(BusRouteResult busRouteResult, int i) {
// 暂时不讲
}
@Override
public void onDriveRouteSearched(DriveRouteResult result, int errorCode) {
// 暂时不讲
}
@Override
public void onWalkRouteSearched(WalkRouteResult walkRouteResult, int i) {
// 暂时不讲
}
@Override
public void onRideRouteSearched(RideRouteResult rideRouteResult, int i) {
// 暂时不讲
}
});
final RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(
mStartPoint, mEndPoint);
RouteSearch.DriveRouteQuery query = new RouteSearch.DriveRouteQuery(
fromAndTo, //路径规划的起点和终点
RouteSearch.DrivingDefault, //驾车模式
null, //途经点
null, //示避让区域
null //避让道路
);
mRouteSearch.calculateDriveRouteAsyn(query);
}
(4)搜索沿途POI
准备工作做好了,下面要开始真正的搜索沿途的POI
private void searchRoutePOI() {
RoutePOISearchQuery query = new RoutePOISearchQuery(
mStartPoint ,mEndPoint, //起始点
RouteSearch.DrivingDefault, //搜索模式是驾车模式
RoutePOISearch.RoutePOISearchType.TypeGasStation, //搜索POI类型是加油站
250
);
routePOISearch = new RoutePOISearch(this, query);
routePOISearch.setPoiSearchListener(new RoutePOISearch.OnRoutePOISearchListener() {
@Override
public void onRoutePoiSearched(RoutePOISearchResult routePOISearchResult, int i) {
//同上
}
});
routePOISearch.searchRoutePOIAsyn();
}
(5)多类型
我们既然可以搜索加油站,当然也可以搜索其它类型的POI,这里演示一下搜索三种类型。
总结
OK,以上就是POI的全部内容了,本期节目就到这里,感谢大家收看,我们下期再见~