您的位置:首页 > 其它

【“零起点”--百度地图手机SDK】如何进行三种POI搜索?

2012-06-05 15:27 225 查看
摘要:POI即关键兴趣点,比如人民大学、新世界华联、306医院、沙县小吃、百度大厦,这些都是POI点。百度地图SDK查询POI有三种接口,分别是城市内搜索poiSearchInCity、周边搜索poiSearchNearBy、范围搜索poiSearchInbounds。其中周边和范围搜索还分别有多关键搜索,支持1-10个多关键词。

----------------------------------------------------------------------

系列阅读:
1、【百度地图-安卓SDK】从头开始写android程序
/article/4782469.html
2、【“零起点”--百度地图手机SDK】如何创建一张地图
/article/4782485.html
3、【“零起点”--百度地图手机SDK】如何使用离线地图?
/article/4782487.html

4、【“零起点”--百度地图手机SDK】如何添加地图图层+按钮事件+水平垂直布局?

/article/4782488.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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: