百度地图-实现POI的搜索(搜索周边)

来源:互联网 发布:耳机品牌 知乎 编辑:程序博客网 时间:2024/04/30 23:29
package com.lbsproject;import java.util.ArrayList;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Point;import android.graphics.drawable.Drawable;import android.location.Criteria;import android.location.Location;import android.location.LocationManager;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.MenuItem;import android.view.MotionEvent;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;import com.baidu.mapapi.BMapManager;import com.baidu.mapapi.GeoPoint;import com.baidu.mapapi.LocationListener;import com.baidu.mapapi.MKAddrInfo;import com.baidu.mapapi.MKDrivingRouteResult;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.PoiOverlay;import com.baidu.mapapi.Projection;import com.lbsproject.LBSProjectActivity.GetOverlay;public class LBSProjectActivity extends MapActivity {protected static final String TAG = null;private BMapManager mapManager;private MapView mapView;private MapController mapController;private MKSearch mSearch = null; private GeoPoint geoPoint = new GeoPoint(122084095, 37422006);;LocationListener mLocationListener = null;MyLocationOverlay mLocationOverlay = null; private EditText editCity;private EditText editGeoCodeKey;private EditText areaText;private GetOverlay getOverlay;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);getInitLoc();// 程序打开时候获取当前位置 显示地图上mapManager = new BMapManager(getApplication());// init方法的第一个参数需填入申请的APIKeymapManager.init("2150650BE0DCF874994B845CEC7B60A0518E6AFE", null);super.initMapActivity(mapManager);mapView = (MapView) findViewById(R.id.mapView);mapView.setBuiltInZoomControls(true);mapView.setDrawOverlayWhenZooming(true);// 添加定位图层mLocationOverlay = new MyLocationOverlay(this, mapView);mapView.getOverlays().add(mLocationOverlay);getOverlay = new GetOverlay();mapView.getOverlays().add(getOverlay);gotoLocate();Button buttonGetPos = (Button) findViewById(R.id.buttonGetPos);//获取"我的位置的方法"buttonGetPos.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {getInitLoc();gotoLocate();}});editCity = (EditText) findViewById(R.id.editTextCity);editGeoCodeKey = (EditText) findViewById(R.id.editTextAera);Button buttonSearchCity = (Button) findViewById(R.id.buttonSearchCity);buttonSearchCity.setOnClickListener(new View.OnClickListener() {//点击按钮定位需要去的地方@Overridepublic void onClick(View v) {mSearch.geocode(editGeoCodeKey.getText().toString(), editCity.getText().toString());// mapView.getOverlays().add(getOverlay);}});areaText = (EditText) findViewById(R.id.searchKeywords);Button buttonSearchArea = (Button) findViewById(R.id.buttonSearchArea);buttonSearchArea.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mSearch.poiSearchNearBy(areaText.getText().toString(),// 搜索XX附近5000米范围的XXXgeoPoint, 5000);}});// 注册定位事件mLocationListener = new LocationListener() {public void onLocationChanged(Location location) {if (location != null) {Log.i(TAG, "" + location.getLatitude());Log.i(TAG, "" + location.getLongitude());geoPoint = new GeoPoint((int) (location.getLatitude() * 1e6),(int) (location.getLongitude() * 1e6));gotoLocate();}}};mSearch = new MKSearch();//搜索服务类mSearch.init(mapManager, new MKSearchListener() {public void onGetAddrResult(MKAddrInfo res, int error) {if (error != 0) {String str = String.format("错误号:%d", error);Toast.makeText(LBSProjectActivity.this, str,Toast.LENGTH_LONG).show();return;}mapView.getController().animateTo(res.geoPt);//String strInfo = String.format("纬度:%f 经度:%f\r\n",//res.geoPt.getLatitudeE6() / 1e6,//res.geoPt.getLongitudeE6() / 1e6);geoPoint = res.geoPt;// Toast.makeText(LBSProjectActivity.this, strInfo,// Toast.LENGTH_LONG).show();Drawable marker = getResources().getDrawable(R.drawable.iconmarka); // 得到需要标在地图上的资源marker.setBounds(0, 0, marker.getIntrinsicWidth(),marker.getIntrinsicHeight()); // 为maker定义位置和边界mapView.getOverlays().clear();mapView.getOverlays().add(getOverlay);mapView.getOverlays().add(new OverItemT(marker, LBSProjectActivity.this,res.geoPt, res.strAddr));}public void onGetPoiResult(MKPoiResult res, int type, int error) {if (res == null) {Log.d("onGetPoiResult", "the onGetPoiResult res is " + type+ "__" + error);} elseLog.d("onGetPoiResult","the onGetPoiResult res is "+ res.getCurrentNumPois() + "__"+ res.getNumPages() + "__"+ res.getNumPois() + "__" + type + "__"+ error);// 错误号可参考MKEvent中的定义if (error != 0 || res == null) {Log.d("onGetPoiResult", "the onGetPoiResult res 0 ");Toast.makeText(LBSProjectActivity.this, "抱歉,未找到结果",Toast.LENGTH_LONG).show();return;}ArrayList<MKPoiResult> poiResult = res.getMultiPoiResult();if (poiResult != null)Log.d("onGetPoiResult", "the onGetPoiResult res 1__"+ poiResult.size());// 将地图移动到第一个POI中心点if (res.getCurrentNumPois() > 0) {Log.d("onGetPoiResult", "the onGetPoiResult res 2");// 将poi结果显示到地图上PoiOverlay poiOverlay = new PoiOverlay(LBSProjectActivity.this, mapView);poiOverlay.setData(res.getAllPoi());mapView.getOverlays().clear();mapView.getOverlays().add(getOverlay);mapView.getOverlays().add(poiOverlay);mapView.invalidate();mapView.getController().animateTo(res.getPoi(0).pt);} else if (res.getCityListNum() > 0) {Log.d("onGetPoiResult", "the onGetPoiResult res 3");String strInfo = "在";for (int i = 0; i < res.getCityListNum(); i++) {strInfo += res.getCityListInfo(i).city;strInfo += ",";}strInfo += "找到结果";Toast.makeText(LBSProjectActivity.this, strInfo,Toast.LENGTH_LONG).show();}Log.d("onGetPoiResult", "the onGetPoiResult res 4");}public void onGetDrivingRouteResult(MKDrivingRouteResult res,int error) {}public void onGetTransitRouteResult(MKTransitRouteResult res,int error) {}public void onGetWalkingRouteResult(MKWalkingRouteResult res,int error) {}});}private void gotoLocate() {// 获取所在位置Drawable marker = getResources().getDrawable(R.drawable.iconmarka); // 得到需要标在地图上的资源marker.setBounds(0, 0, marker.getIntrinsicWidth(),marker.getIntrinsicHeight()); // 为maker定义位置和边界mapView.getOverlays().clear();mapView.getOverlays().add(getOverlay);mapView.getOverlays().add(new OverItemT(marker, LBSProjectActivity.this, geoPoint, ""));mapView.getController().animateTo(geoPoint);mapController = mapView.getController();// 设置地图的中心mapController.setCenter(geoPoint);// 设置地图默认的缩放级别mapController.setZoom(16);}private void getInitLoc() {// 初始化时候获取坐标try {LocationManager locationManager;String context = Context.LOCATION_SERVICE;locationManager = (LocationManager) getSystemService(context);// String provider = LocationManager.GPS_PROVIDER;Criteria criteria = new Criteria();criteria.setAccuracy(Criteria.ACCURACY_FINE);criteria.setAltitudeRequired(false);criteria.setBearingRequired(false);criteria.setCostAllowed(true);criteria.setPowerRequirement(Criteria.POWER_LOW);String provider = locationManager.getBestProvider(criteria, true);Location location = locationManager.getLastKnownLocation(provider);geoPoint = new GeoPoint((int) (location.getLatitude() * 1e6),(int) (location.getLongitude() * 1e6));} catch (Exception e) {// TODO: handle exception}}@Overrideprotected boolean isRouteDisplayed() {return false;}@Overrideprotected void onDestroy() {if (mapManager != null) {// 程序退出前需调用此方法mapManager.destroy();mapManager = null;}super.onDestroy();}@Overrideprotected void onPause() {if (mapManager != null) {// 终止百度地图APImapManager.getLocationManager().removeUpdates(mLocationListener);mLocationOverlay.disableMyLocation();mLocationOverlay.disableCompass(); // 关闭指南针mapManager.stop();}super.onPause();}@Overrideprotected void onResume() {if (mapManager != null) {// 开启百度地图API// 注册定位事件,定位后将地图移动到定位点mapManager.getLocationManager().requestLocationUpdates(mLocationListener);mLocationOverlay.enableMyLocation();mLocationOverlay.enableCompass(); // 打开指南针mapManager.start();}super.onResume();}/** * * 实现MKSearchListener接口,用于实现异步搜索服务 * @author liufeng */public class MySearchListener implements MKSearchListener {public void onGetAddrResult(MKAddrInfo result, int iError) {}public void onGetDrivingRouteResult(MKDrivingRouteResult result,int iError) {}/** * * POI搜索结果(范围检索、城市POI检索、周边检索) * * @param result 搜索结果 * @param type * 返回结果类型(11,12,21:poi列表 7:城市列表) * @param iError 错误号(0表示正确返回) */@Overridepublic void onGetPoiResult(MKPoiResult result, int type, int iError) {if (result == null) {return;}// PoiOverlay是baidu map api提供的用于显示POI的OverlayPoiOverlay poioverlay = new PoiOverlay(LBSProjectActivity.this,mapView);// 设置搜索到的POI数据poioverlay.setData(result.getAllPoi());// 在地图上显示PoiOverlay(将搜索到的兴趣点标注在地图上)mapView.getOverlays().add(poioverlay);}public void onGetTransitRouteResult(MKTransitRouteResult result,int iError) {}public void onGetWalkingRouteResult(MKWalkingRouteResult result,int iError) {}}class GetOverlay extends Overlay {GeoPoint geo;@Overridepublic void draw(Canvas canvas, MapView gmapView, boolean arg2) {super.draw(canvas, mapView, arg2);if (geo == null) {return;}Log.i("11111111111111111111", arg2 + "-------draw--");}@Overridepublic boolean onTap(GeoPoint geo, MapView arg1) {geoPoint = geo;Drawable marker = getResources().getDrawable(R.drawable.iconmarka); // 得到需要标在地图上的资源marker.setBounds(0, 0, marker.getIntrinsicWidth(),marker.getIntrinsicHeight()); // 为maker定义位置和边界mapView.getOverlays().clear();mapView.getOverlays().add(getOverlay);mapView.getOverlays().add(new OverItemT(marker, LBSProjectActivity.this,geoPoint, ""));Log.i("11111111111111111111", geo.getLongitudeE6() / 1E6+ "----------" + geo.getLatitudeE6() / 1E6);return super.onTap(geo, arg1);}}private static final int TOOLBAR0 = 0;private static final int TOOLBAR1 = 1;private static final int TOOLBAR2 = 2;private static final int TOOLBAR3 = 3;public boolean onCreateOptionsMenu(Menu menu) {menu.add(0, TOOLBAR0, 1, "KTV").setIcon(android.R.drawable.ic_btn_speak_now);menu.add(0, TOOLBAR1, 2, "学校").setIcon(android.R.drawable.ic_menu_myplaces);menu.add(0, TOOLBAR2, 3, "餐厅").setIcon(android.R.drawable.ic_menu_my_calendar);menu.add(0, TOOLBAR3, 4, "公园").setIcon(android.R.drawable.ic_menu_gallery);return super.onCreateOptionsMenu(menu);}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case 0:mSearch.poiSearchNearBy("KTV", geoPoint, 5000);//搜索ktvbreak;case 1:mSearch.poiSearchNearBy("学校", geoPoint, 5000);//.搜索学校break;case 2:mSearch.poiSearchNearBy("餐厅", geoPoint, 5000);//搜索餐厅break;case 3:mSearch.poiSearchNearBy("公园", geoPoint, 5000);//搜索公园break;}return super.onOptionsItemSelected(item);}}


原创粉丝点击