百度地图移动版API集成搜索服务包括
位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索
核心类: PoiSearch和OnGetPoiSearchResultListener
RoutePlanSearch和OnGetRoutePlanResultListener
实现思路
初始化PoiSearch类,通过setOnGetPoiSearchResultListener方法注册搜索结果的监听对象OnGetPoiSearchResultListener ,实现异步搜索服务。
通过自定义MySearchListener实现类,处理不同的回调方法,获得搜索结果。
注意, OnGetPoiSearchResultListener只支持一个,以最后一次设置为准
结合覆盖物展示搜索
本地搜索覆盖物:PoiOverlay
驾车路线覆盖物:DrivingRouteOverlay
步行路线覆盖物:WalkingRouteOverlay
周边搜索
城市内搜索
基类
列表,实现activity的跳转
位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索
核心类: PoiSearch和OnGetPoiSearchResultListener
RoutePlanSearch和OnGetRoutePlanResultListener
实现思路
初始化PoiSearch类,通过setOnGetPoiSearchResultListener方法注册搜索结果的监听对象OnGetPoiSearchResultListener ,实现异步搜索服务。
通过自定义MySearchListener实现类,处理不同的回调方法,获得搜索结果。
注意, OnGetPoiSearchResultListener只支持一个,以最后一次设置为准
结合覆盖物展示搜索
本地搜索覆盖物:PoiOverlay
驾车路线覆盖物:DrivingRouteOverlay
步行路线覆盖物:WalkingRouteOverlay
换乘路线覆盖物:TransitOverlay
POI(Point of Interest兴趣点)搜索有三种方式
根据范围和检索词发起范围检索searchInBound
周边检索searchNearby
城市poi检索searchInCity
poi详细信息检索 searchPoiDetail
结果的展示: PoiOverlay
查询加油站信息
多种查询方法,但结果的处理都在OnGetPoiSearchResultListener的onGetPoiResult方法中
处理步骤:
判断服务器结果返回
创建poi覆盖物
将服务器返回数据添加到poi覆盖物中
添加覆盖物到地图addToMap
缩放地图,使所有Overlay都在合适的视野内
范围内搜索
package com.ldw.zbqq;
import android.os.Bundle;
import android.widget.Toast;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.LatLngBounds;
import com.baidu.mapapi.overlayutil.PoiOverlay;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiBoundSearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
/*
* 范围内搜索
*/
public class PoiSearchInBoundsDemo extends BaseActivity {
private PoiSearch poiSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
search();
}
private void search() {
//实例化搜索的类,核心类关联
poiSearch = PoiSearch.newInstance();
poiSearch.setOnGetPoiSearchResultListener(new MyListener());
//PO范围搜索参数
PoiBoundSearchOption boundOption = new PoiBoundSearchOption();
//需要2个点,左下和右上2个点
LatLngBounds latlngBounds = new LatLngBounds.Builder()
.include(new LatLng(22.5669239, 113.9168738))// 东北的点
.include(new LatLng(22.5415192, 113.9050291))// 西南的点
.build();
boundOption.bound(latlngBounds);// 设置搜索范围
boundOption.keyword("超市");// 搜索关键字
poiSearch.searchInBound(boundOption);// 只是把范围能搜索到的坐标设置为 地图的中心,同时会搜索到范围外的坐标
}
//搜索的监听
class MyListener implements OnGetPoiSearchResultListener{
//返回详情
@Override
public void onGetPoiDetailResult(PoiDetailResult arg0) {
}
//返回所有的点
@Override
public void onGetPoiResult(PoiResult arg0) {
//判断搜索返回的结果
if(arg0==null||SearchResult.ERRORNO.RESULT_NOT_FOUND==arg0.error){
Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();
return;
}
//搜索类型的覆盖类
PoiOverlay overlay = new MyPoiOverlay(baiduMap);// 搜索poi的覆盖物
baiduMap.setOnMarkerClickListener(overlay);// 把事件分发给overlay,overlay才能处理点击事件
overlay.setData(arg0);
overlay.addToMap();// 把搜索的结果添加到地图中
overlay.zoomToSpan();// 缩放地图,使所有Overlay都在合适的视野内 注: 该方法只对Marker类型的overlay有效
}
//这样才能设置点击事件
class MyPoiOverlay extends PoiOverlay {
public MyPoiOverlay(BaiduMap arg0) {
super(arg0);
}
//点击事件
@Override
public boolean onPoiClick(int index) {
//获取到poi的数据
PoiResult poiResult = getPoiResult();
PoiInfo poiInfo = poiResult.getAllPoi().get(index);// 得到点击的那个poi信息
String text = poiInfo.name + "," + poiInfo.address;
Toast.makeText(getApplicationContext(), text, 0).show();
return super.onPoiClick(index);
}
}
}
}
周边搜索
package com.ldw.zbqq;
import android.os.Bundle;
import android.widget.Toast;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.LatLngBounds;
import com.baidu.mapapi.overlayutil.PoiOverlay;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiBoundSearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiDetailSearchOption;
import com.baidu.mapapi.search.poi.PoiNearbySearchOption;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
import com.ldw.zbqq.PoiSearchInBoundsDemo.MyListener;
import com.ldw.zbqq.PoiSearchInBoundsDemo.MyListener.MyPoiOverlay;
/*
* 周边搜索
*/
public class PoiSearchNearByDemo extends BaseActivity {
private PoiSearch poiSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
search();
}
private void search() {
//实例化搜索的类,核心类关联
poiSearch = PoiSearch.newInstance();
poiSearch.setOnGetPoiSearchResultListener(new MyListener());
PoiNearbySearchOption nearbyOption = new PoiNearbySearchOption();
nearbyOption.location(hmPos);// 设置中心点
nearbyOption.radius(1000);// 设置半径 单位是米
nearbyOption.keyword("超市");// 关键字
poiSearch.searchNearby(nearbyOption);
}
class MyListener implements OnGetPoiSearchResultListener{
//返回详情
@Override
public void onGetPoiDetailResult(PoiDetailResult arg0) {
//判断搜索返回的结果
if(arg0==null||SearchResult.ERRORNO.RESULT_NOT_FOUND==arg0.error){
Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();
return;
}
//返回的结果,地址,数量,评价
String text = arg0.getAddress()+ "::" + arg0.getCommentNum() + arg0.getEnvironmentRating();
Toast.makeText(getApplicationContext(), text, 0).show();
}
//返回所有的点
@Override
public void onGetPoiResult(PoiResult arg0) {
//判断搜索返回的结果
if(arg0==null||SearchResult.ERRORNO.RESULT_NOT_FOUND==arg0.error){
Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();
return;
}
//搜索类型的覆盖类
PoiOverlay overlay = new MyPoiOverlay(baiduMap);// 搜索poi的覆盖物
baiduMap.setOnMarkerClickListener(overlay);// 把事件分发给overlay,overlay才能处理点击事件
overlay.setData(arg0);
overlay.addToMap();// 把搜索的结果添加到地图中
overlay.zoomToSpan();// 缩放地图,使所有Overlay都在合适的视野内 注: 该方法只对Marker类型的overlay有效
}
//这样才能设置点击事件
class MyPoiOverlay extends PoiOverlay {
public MyPoiOverlay(BaiduMap arg0) {
super(arg0);
}
//点击事件
@Override
public boolean onPoiClick(int index) {
//获取到poi的数据
PoiResult poiResult = getPoiResult();
PoiInfo poiInfo = poiResult.getAllPoi().get(index);// 得到点击的那个poi信息
String text = poiInfo.name + "," + poiInfo.address;
Toast.makeText(getApplicationContext(), text, 0).show();
//搜索详情
PoiDetailSearchOption detailOption = new PoiDetailSearchOption();
detailOption.poiUid(poiInfo.uid);// 设置poi的uid
poiSearch.searchPoiDetail(detailOption);//请求发起
return super.onPoiClick(index);
}
}
}
}
城市内搜索
package com.ldw.zbqq;
import android.os.Bundle;
import android.widget.Toast;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.overlayutil.PoiOverlay;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiCitySearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
import android.view.KeyEvent;
/*
* 城市内搜索
*/
public class PoiSearchIncityDemo extends BaseActivity {
private PoiSearch poiSearch;
private int currentPageIndex = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
poiSearch = PoiSearch.newInstance();
poiSearch.setOnGetPoiSearchResultListener(new MyListener());
search();
}
private void search() {
//搜索的选项
PoiCitySearchOption cityOption = new PoiCitySearchOption();
cityOption.city("深圳");
cityOption.keyword("酒店");
cityOption.pageNum(currentPageIndex);
poiSearch.searchInCity(cityOption);
}
class MyListener implements OnGetPoiSearchResultListener {
@Override
public void onGetPoiDetailResult(PoiDetailResult arg0) {
// TODO Auto-generated method stub
}
@Override
public void onGetPoiResult(PoiResult arg0) {
if (arg0 == null
|| SearchResult.ERRORNO.RESULT_NOT_FOUND == arg0.error) {
Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();
return;
}
//搜索的结果
String text = "共" + arg0.getTotalPageNum() + "页,共"
+ arg0.getTotalPoiNum() + "条,当前第"
+ arg0.getCurrentPageNum() + "页,当前页"
+ arg0.getCurrentPageCapacity() + "条";
Toast.makeText(getApplicationContext(), text, 1).show();
baiduMap.clear();// 清空地图所有的 Overlay 覆盖物以及 InfoWindow,不添加的时候会显示上一页的内容
PoiOverlay overlay = new MyPoiOverlay(baiduMap);// 搜索poi的覆盖物
baiduMap.setOnMarkerClickListener(overlay);// 把事件分发给overlay,overlay才能处理点击事件
overlay.setData(arg0);// 设置结果
overlay.addToMap();// 把搜索的结果添加到地图中
overlay.zoomToSpan();// 缩放地图,使所有Overlay都在合适的视野内 注:
// 该方法只对Marker类型的overlay有效
}
}
//按1按键。加载下一页的数据
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_1){
currentPageIndex++;
search();
}
return super.onKeyDown(keyCode, event);
}
class MyPoiOverlay extends PoiOverlay {
public MyPoiOverlay(BaiduMap arg0) {
super(arg0);
}
@Override
public boolean onPoiClick(int index) {
PoiResult poiResult = getPoiResult();
PoiInfo poiInfo = poiResult.getAllPoi().get(index);// 得到点击的那个poi信息
String text = poiInfo.name + "," + poiInfo.address;
Toast.makeText(getApplicationContext(), text, 0).show();
return super.onPoiClick(index);
}
}
}
基类
package com.ldw.zbqq;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.model.LatLng;
import android.app.Activity;
import android.os.Bundle;
/*
* 基类,后面直接来继承
*/
public class BaseActivity extends Activity {
protected BaiduMap baiduMap;
protected MapView mapview;
protected double latitude = 22.5669239;// 纬度,
protected double longitude = 113.9168738;// 经度
protected LatLng hmPos = new LatLng(latitude, longitude);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initManager();
setContentView(R.layout.common);
init();
}
private void initManager() {
// SDKInitializer.initialize(getApplicationContext()); // 不能传递Activity,必须是全局Context
}
private void init() {
// 设置地图级别(V2.X 3-19 V1.X 3-18)
// ① 修改了文件的格式 优化了空间的使用(北京 110M 15M)
// ② 增加了级别 3D效果(18 19)
mapview = (MapView) findViewById(R.id.mapview);
baiduMap = mapview.getMap();
// BaiduMap: 管理具体的某一个MapView : 旋转,移动,缩放,事件。。
// 描述地图状态将要发生的变化 使用工厂类MapStatusUpdateFactory创建
MapStatusUpdate mapstatusUpdate = MapStatusUpdateFactory.zoomTo(15);// 默认的级别12
// 设置缩放级别
baiduMap.setMapStatus(mapstatusUpdate);
// LatLng latlng = new LatLng(arg0, arg1);// 坐标 经纬度 参数1 纬度 参数2 经度
MapStatusUpdate mapstatusUpdatePoint = MapStatusUpdateFactory
.newLatLng(hmPos);
// 设置中心点 默认是天安门
baiduMap.setMapStatus(mapstatusUpdatePoint);
// mapview.showZoomControls(false);// 默认是true 显示缩放按钮
//
// mapview.showScaleControl(false);// 默认是true 显示标尺
}
@Override
protected void onDestroy() {
mapview.onDestroy();
super.onDestroy();
}
@Override
protected void onResume() {
mapview.onResume();
super.onResume();
}
@Override
protected void onPause() {
mapview.onPause();
super.onPause();
}
}
列表,实现activity的跳转
package com.ldw.zbqq;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.baidu.mapapi.SDKInitializer;
public class MainActivity extends Activity {
private static String[] objects = new String[] { "hello world", "图层",
"圆形覆盖物", "展示文字", "marker覆盖物", "矩形范围内搜索", "圆形区域", "全城搜索", "驾车路线",
"步行路线", "公交换乘", "我的位置" };
private static Class[] clazzs = new Class[] { HelloWorld.class,
LayerDemo.class,CircleOptionsDemo.class,TextOptionsDemo.class,MarkerOptionsDemo.class,PoiSearchInBoundsDemo.class,
PoiSearchNearByDemo.class,PoiSearchIncityDemo.class};
private ListView list;
private ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = (ListView) findViewById(R.id.list);
adapter = new ArrayAdapter<String>(getApplicationContext(),
R.layout.item, objects);
list.setAdapter(adapter);
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent intent = new Intent(getApplicationContext(),
clazzs[position]);
startActivity(intent);
}
});
//注册代码,这个是异步的方法,列表一打开的时候就注册了,防止后面加载数据的时候还没有注册完
SDKInitializer.initialize(getApplicationContext()); // 不能传递Activity,必须是全局Context
}
}