Android 百度地图开发 POI搜索

新手开始学Android 开发和 Java 语言,主要是看百度地图提供的Demo,根据应用的需要做了一些改进。

这里主要实现了用户可以自定义 POI 搜索的城市、地点、兴趣点和搜索半径。


全部代码如下:

package baidumapsdk.demo;

import android.app.Activity;
import android.os.Bundle;
import android.os.SystemClock;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.EditText;
import android.widget.Toast;

import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.search.MKAddrInfo;
import com.baidu.mapapi.search.MKBusLineResult;
import com.baidu.mapapi.search.MKDrivingRouteResult;
import com.baidu.mapapi.search.MKPoiInfo;
import com.baidu.mapapi.search.MKPoiResult;
import com.baidu.mapapi.search.MKSearch;
import com.baidu.mapapi.search.MKSearchListener;
import com.baidu.mapapi.search.MKShareUrlResult;
import com.baidu.mapapi.search.MKSuggestionInfo;
import com.baidu.mapapi.search.MKSuggestionResult;
import com.baidu.mapapi.search.MKTransitRouteResult;
import com.baidu.mapapi.search.MKWalkingRouteResult;
import com.baidu.platform.comapi.basestruct.GeoPoint;


/**
 * 演示poi搜索功能 
 */
public class PoiSearchDemo extends Activity {
	
	private MapView mMapView = null;
	private MKSearch mSearch = null;   // 搜索模块,也可去掉地图模块独立使用
	/**
	 * 搜索关键字输入窗口
	 */
	private AutoCompleteTextView keyWorldsView = null;
	private ArrayAdapter<String> sugAdapter = null;
    private int load_Index;
	long starttime[];
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	
    	starttime[0] = SystemClock.uptimeMillis();
    	Log.d(null, Double.toString(starttime[0]));
    	 super.onCreate(savedInstanceState);
         DemoApplication app = (DemoApplication)this.getApplication();
         if (app.mBMapManager == null) {
             app.mBMapManager = new BMapManager(this);
             app.mBMapManager.init(DemoApplication.strKey,new DemoApplication.MyGeneralListener());
         }
         setContentView(R.layout.activity_poisearch);
        mMapView = (MapView)findViewById(R.id.bmapView);
		mMapView.getController().enableClick(true);
        mMapView.getController().setZoom(12);
        mMapView.setBuiltInZoomControls(true);   
              // 设置启用内置的缩放控件  

		
		// 初始化搜索模块,注册搜索事件监听
        mSearch = new MKSearch();
        mSearch.init(app.mBMapManager, new MKSearchListener(){
            //在此处理详情页结果
            @Override
            public void onGetPoiDetailSearchResult(int type, int error) {
                if (error != 0) {
                    Toast.makeText(PoiSearchDemo.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
                }
                else {
                    Toast.makeText(PoiSearchDemo.this, "成功,查看详情页面", Toast.LENGTH_SHORT).show();
                }
            }
            /**
             * 在此处理poi搜索结果
             */
          
            
            public void onGetPoiResult(MKPoiResult res, int type, int error) {
            	
            	starttime[1] = SystemClock.uptimeMillis();
            	
                // 错误号可参考MKEvent中的定义
                if (error != 0 || res == null) {
                    Toast.makeText(PoiSearchDemo.this, "抱歉,未找到结果", Toast.LENGTH_LONG).show();
                    return;
                }
                // 将地图移动到第一个POI中心点
                if (res.getCurrentNumPois() > 0) {
                    // 将poi结果显示到地图上
                    MyPoiOverlay poiOverlay = new MyPoiOverlay(PoiSearchDemo.this, mMapView, mSearch);
                    poiOverlay.setData(res.getAllPoi());
                    mMapView.getOverlays().clear();
                    mMapView.getOverlays().add(poiOverlay);
                    mMapView.refresh();
                    //当ePoiType为2(公交线路)或4(地铁线路)时, poi坐标为空
                    for( MKPoiInfo info : res.getAllPoi() ){
                    	if ( info.pt != null ){
                    		mMapView.getController().animateTo(info.pt);
                    		break;
                    	}
                    }
                } else if (res.getCityListNum() > 0) {
                	//当输入关键字在本市没有找到,但在其他城市找到时,返回包含该关键字信息的城市列表
                    String strInfo = "在";
                    for (int i = 0; i < res.getCityListNum(); i++) {
                        strInfo += res.getCityListInfo(i).city;
                        strInfo += ",";
                    }
                    strInfo += "找到结果";
                    Toast.makeText(PoiSearchDemo.this, strInfo, Toast.LENGTH_LONG).show();
                }
            }
            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) {
            	
            	starttime [2] =SystemClock.uptimeMillis();
            	
            	if (error != 0) {
					String str = String.format("错误号:%d", error);
					Toast.makeText(PoiSearchDemo.this, str, Toast.LENGTH_LONG).show();
					return;
				}
				//地图移动到该点
				mMapView.getController().animateTo(res.geoPt);	
				if (res.type == MKAddrInfo.MK_GEOCODE){
					//地理编码:通过地址检索坐标点
					GeoPoint position = new GeoPoint (res.geoPt.getLatitudeE6(),res.geoPt.getLongitudeE6());
					// mSearch.poiSearchNearBy("KFC", position, 5000);//可用
					EditText editSearchKey = (EditText)findViewById(R.id.searchkey);
					EditText editSearchDistance = (EditText)findViewById(R.id.distance);
					int dis =Integer.parseInt(editSearchDistance.getText().toString());
					 mSearch.poiSearchNearBy(editSearchKey.getText().toString(), position, dis);//
					//String strInfo = String.format("纬度:%f 经度:%f", res.geoPt.getLatitudeE6()/1e6, res.geoPt.getLongitudeE6()/1e6);
					//Toast.makeText(PoiSearchDemo.this, strInfo, Toast.LENGTH_LONG).show(); //这里注释了
					//mSearch.poiSearchNearBy("餐厅",new GeoPoint(res.geoPt.getLatitudeE6(), res.geoPt.getLongitudeE6()) , 5000);//
			
					//MyPoiOverlay poiOverlay = new MyPoiOverlay(GeoCoderDemo.this, mMapView, mSearch);

				}
            }
            
            public void onGetBusDetailResult(MKBusLineResult result, int iError) {
            }
            /**
             * 更新建议列表
             */
            @Override
            public void onGetSuggestionResult(MKSuggestionResult res, int arg1) {
            	if ( res == null || res.getAllSuggestions() == null){
            		return ;
            	}
            	sugAdapter.clear();
            	for ( MKSuggestionInfo info : res.getAllSuggestions()){
            		if ( info.key != null)
            		    sugAdapter.add(info.key);
            	}
            	sugAdapter.notifyDataSetChanged();
                
            }
			@Override
			public void onGetShareUrlResult(MKShareUrlResult result, int type,
					int error) {
				// TODO Auto-generated method stub
				
			}
        });
        
        keyWorldsView = (AutoCompleteTextView) findViewById(R.id.searchkey);
        sugAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_dropdown_item_1line);
        keyWorldsView.setAdapter(sugAdapter);
        
        /**
         * 当输入关键字变化时,动态更新建议列表
         */
        keyWorldsView.addTextChangedListener(new TextWatcher(){

			@Override
			public void afterTextChanged(Editable arg0) {
				
			}

			@Override
			public void beforeTextChanged(CharSequence arg0, int arg1,
					int arg2, int arg3) {
				
			}
			@Override
			public void onTextChanged(CharSequence cs, int arg1, int arg2,
					int arg3) {
				 if ( cs.length() <=0 ){
					 return ;
				 }
				 String city =  ((EditText)findViewById(R.id.city)).getText().toString();
				 /**
				  * 使用建议搜索服务获取建议列表,结果在onSuggestionResult()中更新
				  */
                 mSearch.suggestionSearch(cs.toString(), city);				
			}
        });
        
    }
    
    @Override
    protected void onPause() {
        mMapView.onPause();
        super.onPause();
    }
    
    @Override
    protected void onResume() {
        mMapView.onResume();
        super.onResume();
    }
    
    @Override
    protected void onDestroy(){
    	mMapView.destroy();
    	mSearch.destory();
    	super.onDestroy();
    	
    	starttime [4] = SystemClock.uptimeMillis();
    	
    }
    
    @Override
    protected void onSaveInstanceState(Bundle outState) {
    	super.onSaveInstanceState(outState);
    	mMapView.onSaveInstanceState(outState);
    	
    }
    
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
    	super.onRestoreInstanceState(savedInstanceState);
    	mMapView.onRestoreInstanceState(savedInstanceState);
    }
    
    private void initMapView() {
        mMapView.setLongClickable(true);
        mMapView.getController().setZoom(14);
        mMapView.getController().enableClick(true);
        mMapView.setBuiltInZoomControls(true);
    }
    /**
     * 影响搜索按钮点击事件
     * @param v
     */
    public void searchButtonProcess(View v) {
    	
    	starttime [3] =SystemClock.uptimeMillis();
    	
          EditText editCity = (EditText)findViewById(R.id.city);
          
          //从这里开始添加的
         // EditText editGeoCodeKey = (EditText)findViewById(R.id.geocodekey);
         // mBtnGeoCode.setOnClickListener(clickListener); //
          
          EditText editSearchKey = (EditText)findViewById(R.id.searchkey);
          EditText editGeoCodeKey = (EditText)findViewById(R.id.geocodekey);
          mSearch.geocode(editGeoCodeKey.getText().toString(), editCity.getText().toString());
         // mSearch.poiSearchNearBy("KFC", new GeoPoint((int) (39.920 * 1E6), (int) (116.410 * 1E6)), 5000);//
         // mSearch.poiSearchNearBy("KFC", position, 5000);//
          //mSearch.poiSearchInCity(editCity.getText().toString(), 
                 // editSearchKey.getText().toString());
    }
   public void goToNextPage(View v) {
        //搜索下一组poi
        int flag = mSearch.goToPoiPage(++load_Index);
        if (flag != 0) {
            Toast.makeText(PoiSearchDemo.this, "先搜索开始,然后再搜索下一组数据", Toast.LENGTH_SHORT).show();
       // Log.
        }
    }

}




XML 配置文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <LinearLayout
        
        android:layout_width="fill_parent"
        android:layout_height="50dip"
        android:orientation="horizontal" >

       <!--   <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="在" >
        </TextView>  -->

        <EditText
            android:id="@+id/city"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:text="北京" />
        <EditText
		android:id="@+id/geocodekey"
	    android:layout_width="wrap_content" 
	    android:layout_height="wrap_content" 
	    android:text="微软大厦" />
          <EditText
		android:id="@+id/distance"
	    android:layout_width="wrap_content" 
	    android:layout_height="wrap_content" 
	    android:text="1000" />
        

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="找" >
        </TextView>

        <AutoCompleteTextView
            android:id="@+id/searchkey"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0.88"
            android:text="餐厅" />
    </LinearLayout>
      
      <LinearLayout
      
        android:layout_width="fill_parent"
        android:layout_height="50dip"
        android:orientation="horizontal" >
        <Button
            android:id="@+id/search"
            android:layout_height="wrap_content"
             android:layout_width="fill_parent"
            android:layout_weight="12"
            android:padding="10dip"
            android:background="@drawable/button_style"
            android:onClick="searchButtonProcess"
            android:text="开始" />

       <!--  <Button
            android:id="@+id/map_next_data"
             android:layout_width="fill_parent"
            android:layout_weight="12"
            android:layout_height="wrap_content"
            android:padding="10dip"
            android:background="@drawable/button_style"
            android:onClick="goToNextPage"
            android:text="下一组数据" /> -->
    </LinearLayout>
 
<com.baidu.mapapi.map.MapView android:id="@+id/bmapView"
    android:layout_width="fill_parent" android:layout_height="fill_parent" 
    android:clickable="true"     
/>
</LinearLayout>


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值