223.map5-百度地图搜索

百度地图移动版API集成搜索服务包括
位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索
核心类: 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
}
    
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值