上篇我们讲到了动态路线规划,我们给定固定的起始坐标,我们这片再延伸一点,我们通过在屏幕中实时获取某个坐标点来获取目的地坐标。效果图如下
我们在上面的图片中可以看到通过拖拽地图可以选择指定的位置,实时的位置信息会在下方绿色字体显示出来。下面我们就来看具体的显示过程。
1、初始化地图,并且为地图添加setOnCameraChangeListener 监听,还获取Camera变化的监听。
if (aMap == null) {
aMap = rallyMap.getMap();
}
//设置地图缩放
aMap.moveCamera(CameraUpdateFactory.zoomTo(16));
//设置缩放按钮不显示
aMap.getUiSettings().setZoomControlsEnabled(false);
//设置自定义信息窗口
aMap.setInfoWindowAdapter(this);
aMap.setOnCameraChangeListener(mapChangedListener);
2、我们来实现mapChangedListener 监听的方法,通过方法来获取Camera变化过程中和变化结束的事件。
private AMap.OnCameraChangeListener mapChangedListener = new AMap.OnCameraChangeListener() {
//Camera实时变化的方法
@Override
public void onCameraChange(CameraPosition cameraPosition) {
rallyLatLng = cameraPosition.target;
//添加蓝色大头针marker
addRallyPoint();
}
//Camera 变化结束的方法
@Override
public void onCameraChangeFinish(CameraPosition cameraPosition) {
LatLonPoint point = new LatLonPoint(cameraPosition.target.latitude,cameraPosition.target.longitude);
rallyPoint = point;
doSearch();
}
};
我们在Camera实时变化的时候,动态的进行大头针的设置。就是动态添加marker,不动的可以看我之前对应自定义marker的讲述,这里不多说,直接代码。
private MarkerOptions mMarkerOption;
/**
* 设置集合点marker
*/
private void addRallyPoint(){
// 添加当前坐标覆盖物
if (mMarkerOption == null) {
mMarkerOption = new MarkerOptions()
.icon(BitmapDescriptorFactory.fromResource(R.drawable.collection_site_positioning))
.position(userLatLng)
.draggable(true);
marker = aMap.addMarker(mMarkerOption);
} else {
//如果marker存在,我们就直接更新位置
marker.setPosition(rallyLatLng);
}
}
在Camera移动结果之后,我们调用doSearch()的方法,来通过坐标点调取周边poi搜索,如果是进行路线规划,我们可以直接拿到onCameraChangeFinish()方法里面的坐标点进行路线查询,这里我们进行周边的poi查询。
public void doSearch(){
query = new PoiSearch.Query("", "", "");
//keyWord表示搜索字符串,
//第二个参数表示POI搜索类型,二者选填其一,选用POI搜索类型时建议填写类型代码,码表可以参考下方(而非文字)
//cityCode表示POI搜索区域,可以是城市编码也可以是城市名称,也可以传空字符串,空字符串代表全国在全国范围内进行搜索
// 设置每页最多返回多少条poiItem
query.setPageSize(20);
//设置查询页码
query.setPageNum(1);
poiSearch = new PoiSearch(this, query);
poiSearch.setOnPoiSearchListener(this);
//设置周边搜索的中心点以及半径
poiSearch.setBound(new PoiSearch.SearchBound(rallyPoint, 1000));
poiSearch.searchPOIAsyn();
}
这里我们调用一步查询需要添加PoiSearch.OnPoiSearchListener的监听。实现方法
@Override
public void onPoiSearched(PoiResult poiResult, int i) {
List<PoiItem> poiLists = poiResult.getPois();
if(poiLists.size() > 0){
tvRallyPoint.setText(Html.fromHtml("<u>"+poiLists.get(0).getTitle()+"</u>"));
rallyLatLng = new LatLng(poiLists.get(0).getLatLonPoint().getLatitude(),poiLists.get(0).getLatLonPoint().getLongitude());
addRallyPoint();
}
}
@Override
public void onPoiItemSearched(PoiItem poiItem, int i) {
}
我们将获取的列表的第一个点作为周边poi选择后的点,再次调用addRallyPoint()更改大头针的位置。设置准确的位置,确定选中的位置点一定有实际意义。
学艺不精,如有问题,欢迎留言,谢谢