百度地图:加强篇(范围+点检索)

    xiaoxiao2021-12-14  24

    核心类: MKSearch和MKSearchListener MKSearch用于位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索

    int busLineSearch(String city, String busLineUid) 公交路线详细信息搜索 异步函数,返回结果在MKSearchListener里的onGetBusDetailResult方法通知 int drivingSearch(String startCity, MKPlanNode start, String endCity, MKPlanNode end) 驾乘路线搜索. int drivingSearch(String startCity, MKPlanNode start, String endCity, MKPlanNode end, ArrayList<MKWpNode> wpNodes) 驾车路线搜索,可设置途经点 异步函数,返回结果在MKSearchListener里的onGetDrivingRouteResult方法通知 int geocode(String strAddr, String city) 根据地址名获取地址信息 异步函数,返回结果在MKSearchListener里的onGetAddrResult方法通知 static int getPoiPageCapacity() 返回每页容量 int goToPoiPage(int num) 获取指定页的的poi结果. boolean init(BMapManager bmapMan, MKSearchListener listener) 初使化 int poiDetailSearch(String uid) poi详细信息检索 int poiMultiSearchInbounds(String[] keys, GeoPoint ptLB, GeoPoint ptRT) 根据范围和检索词发起范围检索. int poiMultiSearchNearBy(String[] keys, GeoPoint pt, int radius) 根据中心点、半径与检索词发起周边检索. int poiSearchInbounds(String key, GeoPoint ptLB, GeoPoint ptRT) 根据范围和检索词发起范围检索. int poiSearchInCity(String city, String key) 城市poi检索. int poiSearchNearBy(String key, GeoPoint pt, int radius) 根据中心点、半径与检索词发起周边检索. int reverseGeocode(GeoPoint pt) 根据地理坐标点获取地址信息 异步函数,返回结果在MKSearchListener里的onGetAddrResult方法通知 int setDrivingPolicy(int policy) 设置驾车路线规划策略. static void setPoiPageCapacity(int num) 设置每页容量. int setTransitPolicy(int policy) 设置路线规划策略. int suggestionSearch(String key, String city) 联想词检索,根据模糊的不完备的检索词返回精确的建议搜索词 异步函数,返回结果在MKSearchListener里的onGetSuggestionResult方法通知 int transitSearch(String city, MKPlanNode start, MKPlanNode end) 公交路线搜索. int walkingSearch(String startCity, MKPlanNode start, String endCity, MKPlanNode end) 步行路线搜索.

    实现思路 初始化MKSearch类,通过init方法注册搜索结果的监听对象MKSearchListener,实现异步搜索服务。 通过自定义MySearchListener实现类,获得搜索结果。 注意,MKSearchListener只支持一个,以最后一次设置为准 1、实现目的:矩形区域加油站搜索 实现过程: 1、新建MKSearch的对象,然后用到public int poiSearchInbounds(String key, GeoPoint ptLB, GeoPoint ptRT)方法来进行对ptLB-ptRT矩形范围内key的搜索。返回结果在MKSearchListener里的onGetPoiResult方法通知。 2、由于MKSearchListener是一个接口,如果我们实现了这个接口就需要实现它里面的很多方法,这样影响代码修改的性能,我们新建了一个基类(BaseAdapter)来实现这个接口,然后新建一个MySearchListener来继承该类,仅实现我们需要的方法即可,此处需要用到onGetPoiResult方法来获的搜索结果。 3、对搜索结果进行展示:新建了一个PoiOverlay对象,然后给这个对象设置数据,并且将这个对象添加到overlays集合里面,然后刷新mapView。 4、为了使得我们点击poi有响应,我们设置了controller.enableClick(true); // 让地图上的兴趣点可以被点击 5、设置Mainfest.xml的内容 注意: poi检索结果每页容量默认情况下为10,可以通过setPoiPageCapacity设置,支持1-50(10) 翻页功能通过MKSearch类的goToPoiPage实现,该方法是异步函数,搜索成功后会调用注册的事件处理函数onGetPoiResult 返回查询页的结果。 支持分类搜索,例如mSearch.poiSearchInCity(“北京”, “娱乐”)

    实现结果: 点击某个点,弹出吐司显示相应加油站名称。 BaseActivity .java

    package huaxa.it.map; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.MKGeneralListener; import com.baidu.mapapi.map.MKEvent; import com.baidu.mapapi.map.MapController; import com.baidu.mapapi.map.MapView; import com.baidu.platform.comapi.basestruct.GeoPoint; import android.app.Activity; import android.os.Bundle; import android.widget.Toast; /** * @项目名: BaiduMap * @包名: huaxa.it.map * @类名: GraphicsOverlayDemo * @创建者: 黄夏莲 * @创建时间: 2016年11月30日 ,下午11:13:13 * * @描述: TODO */ public class BaseActivity extends Activity { public BMapManager manager; public MapController controller; public MapView mapView; public int latitude = (int) (23.039 * 1E6); // 纬度 public int longitude = (int) (113.404 * 1E6); // 经度 public GeoPoint geoPoint = new GeoPoint(latitude, longitude); @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); // KEY的校验 initManager(); setContentView(R.layout.common); init(); } private void init() { // 地图的缩放级别(版本V2.X:3-19,V1.X:3-18级放大) // V2.X与V1.X的主要区别: // ①修改了地图文件的格式(节省了空间) // ②放大级别,增加3D(18、19)的特效 // MapController管理某个具体的MapView,缩放、旋转、移动 mapView = (MapView) findViewById(R.id.MapView); controller = mapView.getController(); controller.setZoom(12);// 设置地图的缩放级别。 这个值的取值范围是[3,19]。 mapView.setBuiltInZoomControls(true);// 设置是否启用内置的缩放控件。 // 如果启用,MapView将自动显示这些缩放控件。 controller.setCenter(geoPoint);// 设置地图中心点 // 让地图上的兴趣点可以被点击 controller.enableClick(true); } /** * 初始化地图引擎 */ private void initManager() { manager = new BMapManager(getApplicationContext()); /** * public boolean init(String strKey, MKGeneralListener listener) 参数: * strKey - 申请的授权验证码 listener - * 注册回调事件,该接口返回网络状态,授权验证等结果,用户需要实现该接口以处理相应事件 */ // KEY的校验 manager.init(CanstantValue.KEY, new MKGeneralListener() { // MKEvent存放常量 @Override public void onGetPermissionState(int iError) { // TODO 授权验证 if (iError == MKEvent.ERROR_PERMISSION_DENIED) { Toast.makeText(getApplicationContext(), "授权验证失败" + MKEvent.ERROR_PERMISSION_DENIED, Toast.LENGTH_SHORT).show(); } } @Override public void onGetNetworkState(int iError) { // TODO 网络状态 if (iError == MKEvent.ERROR_NETWORK_CONNECT) { Toast.makeText(getApplicationContext(), "网络无连接", Toast.LENGTH_SHORT).show(); } } }); } @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); mapView.onResume(); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); mapView.onPause(); } @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); mapView.destroy(); } }

    BaseAdapter.java

    package huaxa.it.map; import com.baidu.mapapi.search.MKAddrInfo; import com.baidu.mapapi.search.MKBusLineResult; import com.baidu.mapapi.search.MKDrivingRouteResult; import com.baidu.mapapi.search.MKPoiResult; import com.baidu.mapapi.search.MKSearchListener; import com.baidu.mapapi.search.MKSuggestionResult; import com.baidu.mapapi.search.MKTransitRouteResult; import com.baidu.mapapi.search.MKWalkingRouteResult; /** * @项目名: BaiduMap * @包名: huaxa.it.map * @类名: BaseAdapter * @创建者: 黄夏莲 * @创建时间: 2016年12月2日 ,下午5:09:41 * * @描述: 基类监听器 */ /* * onGetAddrResult(MKAddrInfo result, int iError) 返回地址信息搜索结果 * onGetBusDetailResult(MKBusLineResult result, int iError) 返回公交车详情信息搜索结果 * onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) 返回驾乘路线搜索结果 * onGetPoiDetailSearchResult(int type, int iError) 返回poi相信信息搜索的结果 * onGetPoiResult(MKPoiResult result, int type, int iError) 返回poi搜索结果 * onGetSuggestionResult(MKSuggestionResult result, int iError) 返回联想词信息搜索结果 * onGetTransitRouteResult(MKTransitRouteResult result, int iError) 返回公交搜索结果 * onGetWalkingRouteResult(MKWalkingRouteResult result, int iError)返回步行路线搜索结果 */ public class BaseAdapter implements MKSearchListener{ @Override public void onGetAddrResult(MKAddrInfo result, int iError) { // TODO Auto-generated method stub } @Override public void onGetBusDetailResult(MKBusLineResult result, int iError) { // TODO Auto-generated method stub } @Override public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) { // TODO Auto-generated method stub } @Override public void onGetPoiDetailSearchResult(int result, int iError) { // TODO Auto-generated method stub } @Override public void onGetPoiResult(MKPoiResult result, int type, int iError) { // TODO Auto-generated method stub } @Override public void onGetSuggestionResult(MKSuggestionResult result, int iError) { // TODO Auto-generated method stub } @Override public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) { // TODO Auto-generated method stub } @Override public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) { // TODO Auto-generated method stub } }

    PoiSearchInboundsDemo.java

    package huaxa.it.map; import com.baidu.mapapi.map.PoiOverlay; import com.baidu.mapapi.search.MKPoiResult; import com.baidu.mapapi.search.MKSearch; import com.baidu.platform.comapi.basestruct.GeoPoint; import android.os.Bundle; import android.widget.Toast; /** * @项目名: BaiduMap * @包名: huaxa.it.map * @类名: PoiSearchInboundsDemo * @创建者: 黄夏莲 * @创建时间: 2016年12月2日 ,下午4:59:23 * * @描述: 在矩形区域内搜索兴趣点(加油站) */ public class PoiSearchInboundsDemo extends BaseActivity { private MKSearch search; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); Search(); } private void Search() { search = new MKSearch(); MySearchListener mkSearchListener = new MySearchListener(); search.init(manager, mkSearchListener); // 发起矩形搜索 // poiSearchInbounds(String key, GeoPoint ptLB, GeoPoint ptRT) // 根据范围和检索词发起范围检索. // 异步函数,返回结果在MKSearchListener里的onGetPoiResult方法通知 // 参数: // keys - 关键词列表,必须大于1个,小于等于10个。 // ptLB - 地理坐标,范围的左下角 // ptRT - 地理坐标,范围的右上角 // 返回: // 成功返回0,否则返回-1 GeoPoint ptLB = new GeoPoint((int) (23 * 1E6), (int) (113 * 1E6)); GeoPoint ptRT = new GeoPoint((int) (24 * 1E6), (int) (114 * 1E6)); search.poiSearchInbounds("加油站", ptLB, ptRT); } class MySearchListener extends BaseAdapter { @Override public void onGetPoiResult(MKPoiResult result, int type, int iError) { // XXXActivity.this返回的当前Activity的实例,getApplicationContext()返回的是application的实例 if (result != null && iError == 0) { // public PoiOverlay(Activity activity,MapView mapView) PoiOverlay overlay = new PoiOverlay(PoiSearchInboundsDemo.this, mapView); overlay.setData(result.getAllPoi()); mapView.getOverlays().add(overlay); mapView.refresh(); } else { Toast.makeText(getApplicationContext(), "未搜索到结果", Toast.LENGTH_LONG).show(); } super.onGetPoiResult(result, type, iError); } } }

    2、实现目的:实现圆形搜索 略 3、实现目的:实现全城搜索 实现过程:需要实现数据分页处理,即对result数据进行处理。 以下是MKPoiResult result的方法:

    方法摘要 ArrayList<MKPoiInfo> getAllPoi() MKCityListInfo getCityListInfo(int index) 获取第index个城市信息,index0开始 int getCityListNum() 返回城市列表页的结果数 int getCurrentNumPois() 获取当前页的poi结果数 ArrayList<MKPoiResult> getMultiPoiResult() int getNumPages() 获取本次poi搜索的总页数 int getNumPois() 获取本次poi搜索的总结果数 int getPageIndex() 返回当前页的索引 MKPoiInfo getPoi(int index) 获取第index个poi信息

    此处我们主要是用到a = getPageIndex() 方法来得到当前页的索引,并可以通过MKSearch.goToPoiPage(++a)跳转到下一页。 在add(overlay)之前需要对之前的overlays集合进行clear();操作,否则会点的显示会混乱。 实现效果:

    PoiSearchInCityDemo.java

    package huaxa.it.map; import com.baidu.mapapi.map.PoiOverlay; import com.baidu.mapapi.search.MKPoiResult; import com.baidu.mapapi.search.MKSearch; import android.os.Bundle; import android.view.KeyEvent; import android.widget.Toast; /** * @项目名: BaiduMap * @包名: huaxa.it.map * @类名: PoiSearchInCityDemo * @创建者: 黄夏莲 * @创建时间: 2016年12月2日 ,下午7:44:07 * * @描述: 全城检索 */ public class PoiSearchInCityDemo extends BaseActivity { private MKSearch search; private int pageIndex; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); Search(); } private void Search() { search = new MKSearch(); MySearchListener mkSearchListener = new MySearchListener(); search.init(manager, mkSearchListener); // 发起全城检索 // public int poiSearchInCity(String city,String key) // 城市poi检索. // 异步函数,返回结果在MKSearchListener里的onGetPoiResult方法通知 // // 参数: // city - 城市名 // key - 关键词 // 返回: // 成功返回0,否则返回-1 search.poiSearchInCity("广州", "加油站"); } class MySearchListener extends BaseAdapter { @Override public void onGetPoiResult(MKPoiResult result, int type, int iError) { // XXXActivity.this返回的当前Activity的实例,getApplicationContext()返回的是application的实例 if (result != null && iError == 0) { /* * ArrayList<MKPoiInfo> getAllPoi() * * MKCityListInfo getCityListInfo(int index) * 获取第index个城市信息,index从0开始 int getCityListNum() 返回城市列表页的结果数 int * getCurrentNumPois() 获取当前页的poi结果数 ArrayList<MKPoiResult> * getMultiPoiResult() * * int getNumPages() 获取本次poi搜索的总页数 int getNumPois() * 获取本次poi搜索的总结果数 int getPageIndex() 返回当前页的索引 MKPoiInfo * getPoi(int index) 获取第index个poi信息 */ pageIndex = result.getPageIndex(); String info = "第" + result.getPageIndex() + "页,共" + result.getNumPages() + "页条目数" + "每页条目:" + result.getCurrentNumPois(); Toast.makeText(getApplicationContext(), info, Toast.LENGTH_LONG) .show(); // public PoiOverlay(Activity activity,MapView mapView) PoiOverlay overlay = new PoiOverlay(PoiSearchInCityDemo.this, mapView); // public void setData(ArrayList<MKPoiInfo> data) // 设置poi 数据 // 参数: // data - : poi 信息集合 overlay.setData(result.getAllPoi());// 当前页全部内容 mapView.getOverlays().clear(); mapView.getOverlays().add(overlay); mapView.refresh(); } else { Toast.makeText(getApplicationContext(), "未搜索到结果", Toast.LENGTH_LONG).show(); } super.onGetPoiResult(result, type, iError); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_1) { pageIndex++; search.goToPoiPage(pageIndex); } return super.onKeyDown(keyCode, event); } }
    转载请注明原文地址: https://ju.6miu.com/read-965376.html

    最新回复(0)