摘要:POI即关键兴趣点,比如人民大学、新世界华联、306医院、沙县小吃、百度大厦,这些都是POI点。百度地图SDK查询POI有三种接口,分别是城市内搜索poiSearchInCity、周边搜索poiSearchNearBy、范围搜索poiSearchInbounds。其中周边和范围搜索还分别有多关键搜索,支持1-10个多关键词。
----------------------------------------------------------------------
系列阅读:
1、【百度地图-安卓SDK】从头开始写android程序
http://www.cnblogs.com/milkmap/archive/2011/11/25/2263475.html
2、【“零起点”--百度地图手机SDK】如何创建一张地图
http://www.cnblogs.com/milkmap/archive/2012/05/11/2496526.html
3、【“零起点”--百度地图手机SDK】如何使用离线地图?
http://www.cnblogs.com/milkmap/archive/2012/05/21/2511928.html
4、【“零起点”--百度地图手机SDK】如何添加地图图层+按钮事件+水平垂直布局?
http://www.cnblogs.com/milkmap/archive/2012/05/25/2518454.html
-----------------------------------------------------------------------
一、选择一个POI搜索接口
官网的类参考上有全部接口的说明:http://dev.baidu.com/wiki/imap/index.php?title=Android%E5%B9%B3%E5%8F%B0/%E7%B1%BB%E5%8F%82%E8%80%83/MKSearch
以范围检索为例,我们查询一个矩形范围内的味多美有多少。
第一个参数是关键词,这里写的是味多美。
第二个参数,是矩形的左下角坐标。第三个参数,是矩形右上角坐标。
取坐标的可视化工具:http://dev.baidu.com/wiki/static/map/API/tool/getPoint/
myMKSearch.poiSearchInbounds("味多美",new GeoPoint((int) (39.863116 * 1E6), (int) (116.199024 * 1E6)),new GeoPoint((int) (39.90298 * 1E6), (int) (116.338728 * 1E6)));
二、初始化
需要申明变量,然后初始化搜索接口。
/** 写在activity里面顶部 **/MKSearch myMKSearch = null; //POI搜索变量申明/** 写在oncreate里面 **/myMKSearch = new MKSearch(); //初始化。
三、设置回调函数
onGetPoiResult是POI搜索的回调函数。 在里面设置了,如果查询到结果,就将结果添加到地图上。
myMKSearch.init(mBMapMan, new MKSearchListener(){ @Override public void onGetPoiResult(MKPoiResult result, int type, int iError) { if (result == null) { return; } PoiOverlay poioverlay = new PoiOverlay(SearchPOIActivity.this, mMapView); poioverlay.setData(result.getAllPoi()); mMapView.getOverlays().add(poioverlay); } @Override ...... }
不过,觉得百度地图SDK在这里有个很奇怪的地方。我明明只使用POI搜索啊,可是在回调函数里,必须要写出公交、驾车等的回调函数,即使是空的,也必须写,不然就会报错。如下图:
1、把驾车回调函数注释了,就报错
2、必须要将其他回调函数代码补齐,才不报错。(总觉得,这个有点儿不合理……)
四、效果图
五、其他POI搜索接口
以下三个接口,选一个写就可以了。
//1、城市poi检索 myMKSearch.poiSearchInCity("北京", "德庄火锅"); //2、根据范围和检索词发起范围检索|多关键词poiMultiSearchInbounds myMKSearch.poiSearchInbounds("味多美",new GeoPoint((int) (39.863116 * 1E6), (int) (116.199024 * 1E6)),new GeoPoint((int) (39.90298 * 1E6), (int) (116.338728 * 1E6))); //3、中心点5000米内的KFC有多少|多关键词poiMultiSearchNearBy myMKSearch.poiSearchNearBy("KFC", new GeoPoint((int) (39.920 * 1E6), (int) (116.410 * 1E6)), 5000);
六、关于布局
这个教程的布局和上一个教程保持不变,我就把按钮的layout注释了。
布局的详细代码可以参见上一个教程~
七、全部源代码
package com.baidu.searchpoi; import android.app.Activity; import android.os.Bundle; /** 引入类 **/ import java.util.ArrayList; import java.util.List; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Point; import android.graphics.drawable.Drawable; import android.location.Location; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.GeoPoint; import com.baidu.mapapi.ItemizedOverlay; import com.baidu.mapapi.LocationListener; import com.baidu.mapapi.MKAddrInfo; import com.baidu.mapapi.MKBusLineResult; import com.baidu.mapapi.MKDrivingRouteResult; import com.baidu.mapapi.MKGeneralListener; import com.baidu.mapapi.MKLocationManager; import com.baidu.mapapi.MKOLUpdateElement; import com.baidu.mapapi.MKOfflineMap; import com.baidu.mapapi.MKOfflineMapListener; import com.baidu.mapapi.MKPlanNode; import com.baidu.mapapi.MKPoiResult; import com.baidu.mapapi.MKSearch; import com.baidu.mapapi.MKSearchListener; import com.baidu.mapapi.MKTransitRouteResult; import com.baidu.mapapi.MKWalkingRouteResult; import com.baidu.mapapi.MapActivity; import com.baidu.mapapi.MapController; import com.baidu.mapapi.MapView; import com.baidu.mapapi.MyLocationOverlay; import com.baidu.mapapi.Overlay; import com.baidu.mapapi.OverlayItem; import com.baidu.mapapi.PoiOverlay; import com.baidu.mapapi.RouteOverlay; import com.baidu.mapapi.TransitOverlay; /** activity **/ public class SearchPOIActivity extends MapActivity { //申明变量 BMapManager mBMapMan = null; MapView mMapView = null; MKOfflineMap mOffline = null; //离线地图变量 MapController mMapController = null; //缩放平移地图 MKSearch myMKSearch = null; //POI搜索 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mBMapMan = new BMapManager(getApplication()); mBMapMan.init("4AA2949E616E069C37CDC3152E8C401A05A0035D", null); super.initMapActivity(mBMapMan); mMapView = (MapView) findViewById(R.id.bmapsView); mMapView.setBuiltInZoomControls(true); //设置启用内置的缩放控件 mMapController = mMapView.getController(); // 得到mMapView的控制权,可以用它控制和驱动平移和缩放 //GeoPoint point = new GeoPoint((int) (39.93 * 1E6),(int) (116.42 * 1E6)); //用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6) GeoPoint point = new GeoPoint((int) (30.670007 * 1E6),(int) (104.092569 * 1E6)); mMapController.setCenter(point); //设置地图中心点 mMapController.setZoom(13); //设置地图zoom级别 //mMapView.getOverlays().add(new MyOverlay()); //添加覆盖物 /** 离线地图初始化 **/ mOffline = new MKOfflineMap(); mOffline.init(mBMapMan, new MKOfflineMapListener() { public void onGetOfflineMapState(int type, int state) { switch (type) { case MKOfflineMap.TYPE_DOWNLOAD_UPDATE: { MKOLUpdateElement update = mOffline.getUpdateInfo(state); //mText.setText(String.format("%s : %d%%", update.cityName, update.ratio)); } break; case MKOfflineMap.TYPE_NEW_OFFLINE: Log.d("OfflineDemo", String.format("add offlinemap num:%d", state)); break; case MKOfflineMap.TYPE_VER_UPDATE: Log.d("OfflineDemo", String.format("new offlinemap ver")); break; } } } ); /** 离线地图导入离线包 **/ int num = mOffline.scan(); //if (num != 0) mText.setText(String.format("已安装%d个离线包", num)); /** POI搜索 **/ myMKSearch = new MKSearch(); /** 回调函数 **/ myMKSearch.init(mBMapMan, new MKSearchListener(){ @Override public void onGetPoiResult(MKPoiResult result, int type, int iError) { if (result == null) { return; } PoiOverlay poioverlay = new PoiOverlay(SearchPOIActivity.this, mMapView); poioverlay.setData(result.getAllPoi()); mMapView.getOverlays().add(poioverlay); mMapView.getController().animateTo(result.getPoi(0).pt); //手动设定地图的中心点 mMapView.invalidate(); //手动刷新地图 //疑问1,如果是外省,如何设置覆盖物的最佳显示区域?无viewport接口 //疑问2,为何不能直接显示搜索结果,要先点击一下地图?刷新地图 } public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { } public void onGetTransitRouteResult(MKTransitRouteResult res, int error) { } public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { } public void onGetAddrResult(MKAddrInfo res, int error) { } public void onGetBusDetailResult(MKBusLineResult result, int iError) { } }); //1、城市poi检索 //myMKSearch.poiSearchInCity("成都", "红星路"); //2、根据范围和检索词发起范围检索|多关键词poiMultiSearchInbounds myMKSearch.poiSearchInbounds("味多美",new GeoPoint((int) (39.863116 * 1E6), (int) (116.199024 * 1E6)),new GeoPoint((int) (39.90298 * 1E6), (int) (116.338728 * 1E6))); //3、中心点5000米内的KFC有多少|多关键词poiMultiSearchNearBy //myMKSearch.poiSearchNearBy("KFC", new GeoPoint((int) (39.920 * 1E6), (int) (116.410 * 1E6)), 5000); } @Override protected boolean isRouteDisplayed() { return false; } @Override protected void onDestroy() { if (mBMapMan != null) { mBMapMan.destroy(); mBMapMan = null; } super.onDestroy(); } @Override protected void onPause() { if (mBMapMan != null) { mBMapMan.stop(); } super.onPause(); } @Override protected void onResume() { if (mBMapMan != null) { mBMapMan.start(); } super.onResume(); }