公交POI检索
文章只是为了记录自己的学习,方便以后查看
此次只记录城市检索功能的实现,关于百度地图秘钥的申请等操作这里不做说明。
一.城市公交的检索需要在城市检索的基础上实现,首先首先前往百度SDK下载开源代码。
https://mapopen-pub-androidsdk.cdn.bcebos.com/map/BaiduMap_AndroidSDK_v6.0.0_Sample.zip
下载解压后,找到BaiduMap_AndroidSDK_v6.0.0_Sample.zip\BaiduMap_AndroidSDK_v6.0.0_Sample\BaiduMapsApiASDemo\app\src\main\java\com\baidu\mapapi\overlayutil
中的所有java类复制,如果不知道需要哪些类,最好全部复制。如图所示:
将所有类复制到你的项目中与你的MainActivity.java在同一目录下。
二.编写布局界面,使用两个文本框和一个Button按钮,两个文本框用来输入城市名和公交线路,在Button按钮的监听事件中进行检索事件的开启。
以下是我布局界面的主要部分
<LinearLayout
android:layout_margin="5dp"
android:id="@+id/top"
android:layout_width="match_parent"
android:layout_height="50dp">
<EditText
android:id="@+id/a"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:hint="城市名"
android:layout_marginRight="5dp"
/>
<EditText
android:id="@+id/b"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_weight="2"
android:hint="公交线路"
/>
<Button
android:id="@+id/btn"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="查找"/>
</LinearLayout>
三.在MainAcyivity.java中编写POI城市公交检索的操作。
- 首先定义变量
private List<String> buslineIdList;// 存储公交线路的uid
private int buslineIndex = 0;// 标记路线
buslineIdList = new ArrayList<String>();
- 在Button的监听事件中:
1.创建POI检索实例
2.设置POI检索监听者
3.发起检索请求
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPoiSearch = PoiSearch.newInstance();//城市检索实例
mPoiSearch.setOnGetPoiSearchResultListener(listener);//城市POI检索监听者
busLineSearch = BusLineSearch.newInstance();//公交检索实例
busLineSearch.setOnGetBusLineSearchResultListener(busLineSearchResultListener);//公交POI检索监听者
PoiCitySearchOption citySearchOption =
new PoiCitySearchOption();
citySearchOption.city(a.getText().toString());//城市名
citySearchOption.keyword(b.getText().toString());//公交线路名
citySearchOption.scope(2);
//发起检索请求
mPoiSearch.searchInCity(citySearchOption);
});
- 对POI城市检索结果的显示。
OnGetPoiSearchResultListener listener = new OnGetPoiSearchResultListener() {
@Override
public void onGetPoiResult(PoiResult poiResult) {
//获取POI检索结果
if (poiResult == null
|| poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {// 没有找到检索结果
Toast.makeText(MainActivity.this, "未找到结果",
Toast.LENGTH_LONG).show();
return;
}
//遍历所有POI,找到类型为公交线路的POI
buslineIdList.clear();
for (PoiInfo poi : poiResult.getAllPoi()) {
buslineIdList.add(poi.uid);
}
searchBusline();
mPoiSearch.destroy();
}
@Override
public void onGetPoiDetailResult(PoiDetailSearchResult poiDetailSearchResult) {
}
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
}
@Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
}
};
private void searchBusline() {
if (buslineIndex >= buslineIdList.size()) {
buslineIndex = 0;
}
if (buslineIndex >= 0 && buslineIdList.size() > 0) {
boolean flag = busLineSearch
.searchBusLine((new BusLineSearchOption().city(a.getText().toString())
.uid(buslineIdList.get(buslineIndex))));
if (flag) {
Toast.makeText(MainActivity.this, "检索成功", Toast.LENGTH_LONG)
.show();
} else {
Toast.makeText(MainActivity.this, "检索失败", Toast.LENGTH_LONG)
.show();
}
} else {
Toast.makeText(MainActivity.this, "错误", Toast.LENGTH_LONG).show();
}
buslineIndex++;
}
- 对POI公交检索结果的显示。
OnGetBusLineSearchResultListener busLineSearchResultListener = new OnGetBusLineSearchResultListener() {
@Override
public void onGetBusLineResult(BusLineResult busLineResult) {
if (busLineResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "抱歉,未找到结果",
Toast.LENGTH_SHORT).show();
} else {
baiduMap.clear();
BusLineOverlay overlay = new MainActivity.MyBuslineOverlay(baiduMap);// 用于显示一条公交详情结果的Overlay
overlay.setData(busLineResult);
overlay.addToMap();
overlay.zoomToSpan();
baiduMap.setOnMarkerClickListener(overlay);
// 公交线路名称
Toast.makeText(MainActivity.this,
busLineResult.getBusLineName(), Toast.LENGTH_SHORT) .show();
}
};
};
四.创建MyBuslineOverlay继承自BusLineOverlay
public class MyBuslineOverlay extends BusLineOverlay {
public MyBuslineOverlay(BaiduMap baiduMap) {
super(baiduMap);
}
@Override
public boolean onBusStationClick(int arg0) {
MarkerOptions options =
(MarkerOptions) getOverlayOptions().get(arg0);
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(options.getPosition()));
return true;
}
}
五.如果你没有标注站点的图片,在运行时会报错,需要修改BusLineOverlay类中的代码,找到下图所示的代码段
List<OverlayOptions> overlayOptionses = new ArrayList<OverlayOptions>();
for (BusLineResult.BusStation station : mBusLineResult.getStations()) {
overlayOptionses.add(new MarkerOptions()
.position(station.getLocation())
.zIndex(10)
.anchor(0.5f, 0.5f)
.icon(BitmapDescriptorFactory
//.fromAssetWithDpi("Icon_bus_station.png")));
.fromResource(R.drawable.icon_markg)));
}
- 将图中的
// .fromAssetWithDpi("Icon_bus_station.png")));
- 注释掉,添加下面一行的
.fromResource(R.drawable.icon_markg)));//原位置新添加的
- 这里的
R.drawable.icon_markg
- 是你自己项目里边的图片。
- 自此POI城市检索完成,项目运行后的结果为: