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

jopen 13年前

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;     @Override   public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);       getInitLoc();// 程序打开时候获取当前位置 显示地图上    mapManager = new BMapManager(getApplication());      // init方法的第一个参数需填入申请的APIKey    mapManager.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() {//点击按钮定位需要去的地方       @Override     public 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() {       @Override     public void onClick(View v) {              mSearch.poiSearchNearBy(areaText.getText().toString(),// 搜索XX附近5000米范围的XXX        geoPoint, 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);      } else       Log.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    }   }     @Override   protected boolean isRouteDisplayed() {    return false;   }     @Override   protected void onDestroy() {    if (mapManager != null) {     // 程序退出前需调用此方法     mapManager.destroy();     mapManager = null;    }    super.onDestroy();   }     @Override   protected void onPause() {    if (mapManager != null) {     // 终止百度地图API     mapManager.getLocationManager().removeUpdates(mLocationListener);     mLocationOverlay.disableMyLocation();     mLocationOverlay.disableCompass(); // 关闭指南针     mapManager.stop();    }    super.onPause();   }     @Override   protected 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表示正确返回)     */    @Override    public void onGetPoiResult(MKPoiResult result, int type, int iError) {     if (result == null) {      return;     }     // PoiOverlay是baidu map api提供的用于显示POI的Overlay     PoiOverlay 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;      @Override    public void draw(Canvas canvas, MapView gmapView, boolean arg2) {     super.draw(canvas, mapView, arg2);     if (geo == null) {      return;     }     Log.i("11111111111111111111", arg2 + "-------draw--");    }      @Override    public 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);   }     @Override   public boolean onOptionsItemSelected(MenuItem item) {    switch (item.getItemId()) {    case 0:     mSearch.poiSearchNearBy("KTV", geoPoint, 5000);//搜索ktv     break;    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);   }    }