欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

百度地图API之POI周边搜索 博客分类: Android androidapi百度周边搜索 

程序员文章站 2024-03-14 16:39:47
...
本文主要讲解如何通过百度地图API搜索得到一个城市里的所有POI。这里有必要对“所有”这个词进行强调一下,以便引起重视,之所以这样说,是因为在搜索POI时,默认仅返回一页的搜索结果10条,那么如何才能得到所有的搜索结果呢?其实baidu map api是提供了相关的方法,但我发现有相当多的网友都在问这个问题,所以有必要讲解演示一下。
      先讲一下什么称之为“城市POI搜索”?它与我们在上一篇文章([011] 百度地图API之POI搜索-发现你身边的兴趣点,如超市、餐厅、ATM...(Android))中了解到的POI搜索有什么区别呢?
      上一篇文章中所调用的是地图API的“周边POI搜索”服务,即检索周围多少米以内的POI;而本章所要调用的是地图API的“城市POI搜索”服务,即检索某个城市中所有的POI。如果你看完这两篇文章后,你会发现仅仅是调用的方法不同而以,搜索结果的处理方法是同一个方法,搜索结果的处理代码也是完全一样的。
      下面将给出城市POI搜索的一个完整示例,并且会讲解如何才能获取到所有的搜索结果。
1)布局文件res/layout/poi_city_search.xml
      view plaincopy to clipboardprint?<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <com.baidu.mapapi.MapView android:id="@+id/map_View" 
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent" 
        android:clickable="true" 
    /> 
    <LinearLayout 
        android:orientation="horizontal" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_alignTop="@id/map_View" 
        android:layout_alignLeft="@id/map_View" 
        android:layout_alignRight="@id/map_View" 
        android:background="@null" 
        android:padding="0dip" 
        > 
        <EditText android:id="@+id/keyword_edittext" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:layout_gravity="center_vertical" 
            android:layout_weight="20" /> 
        <Button android:id="@+id/query_button" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content" 
            android:layout_gravity="center_vertical" 
            android:layout_weight="1" 
            android:text="搜索" /> 
    </LinearLayout> 
</RelativeLayout> 
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<com.baidu.mapapi.MapView android:id="@+id/map_View"
android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true"
    />
    <LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignTop="@id/map_View"
    android:layout_alignLeft="@id/map_View"
    android:layout_alignRight="@id/map_View"
    android:background="@null"
    android:padding="0dip"
    >
    <EditText android:id="@+id/keyword_edittext"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:layout_weight="20" />
    <Button android:id="@+id/query_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical"
    android:layout_weight="1"
    android:text="搜索" />
    </LinearLayout>
</RelativeLayout>
2)继承了com.baidu.mapapi.MapActivity的Activity类
      view plaincopy to clipboardprint?package com.liufeng.baidumap; 
 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
 
import com.baidu.mapapi.BMapManager; 
import com.baidu.mapapi.MKAddrInfo; 
import com.baidu.mapapi.MKDrivingRouteResult; 
import com.baidu.mapapi.MKPoiInfo; 
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.PoiOverlay; 
 
public class PoiSearchInCityActivity extends MapActivity { 
    // 定义地图引擎管理类  
    private BMapManager mapManager; 
    // 定义搜索服务类  
    private MKSearch mMKSearch; 
 
    private MapView mapView; 
    private MapController mapController; 
    private EditText keyWordEditText; 
    private Button queryButton; 
    private static StringBuilder sb; 
     
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.poi_city_search); 
 
        // 初始化MapActivity  
        mapManager = new BMapManager(getApplication()); 
        // init方法的第一个参数需填入申请的API Key  
        mapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4", null); 
        super.initMapActivity(mapManager); 
 
        mapView = (MapView) findViewById(R.id.map_View); 
        // 设置地图模式为交通地图  
        mapView.setTraffic(true); 
        // 设置启用内置的缩放控件  
        mapView.setBuiltInZoomControls(true); 
 
        // 取得地图控制器对象,用于控制MapView  
        mapController = mapView.getController(); 
        // 设置地图默认的缩放级别  
        mapController.setZoom(10); 
 
        // 设置每页返回的POI数,默认为10,取值范围1-50  
        MKSearch.setPoiPageCapacity(10); 
        // 初始化MKSearch  
        mMKSearch = new MKSearch(); 
        mMKSearch.init(mapManager, new MySearchListener()); 
         
        keyWordEditText = (EditText) findViewById(R.id.keyword_edittext); 
        queryButton = (Button) findViewById(R.id.query_button); 
        queryButton.setOnClickListener(new OnClickListener() { 
            @Override 
            public void onClick(View v) { 
                //每次搜索前先前sb中的内容清空  
                sb = new StringBuilder(); 
 
                String keyWord = keyWordEditText.getText().toString().trim(); 
                // 搜索贵阳地区的沃尔玛  
                mMKSearch.poiSearchInCity("贵阳", keyWord); 
            } 
        }); 
    } 
 
    @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.stop(); 
        } 
        super.onPause(); 
    } 
 
    @Override 
    protected void onResume() { 
        if (mapManager != null) { 
            // 开启百度地图API  
            mapManager.start(); 
        } 
        super.onResume(); 
    } 
 
    /**
     * 实现MKSearchListener接口,用于实现异步搜索服务
     * 
     * @author liufeng
     */ 
    public class MySearchListener implements MKSearchListener { 
        /**
         * 根据经纬度搜索地址信息结果
         * 
         * @param result 搜索结果
         * @param iError 错误号(0表示正确返回)
         */ 
        @Override 
        public void onGetAddrResult(MKAddrInfo result, int iError) { 
        } 
 
        /**
         * 驾车路线搜索结果
         * 
         * @param result 搜索结果
         * @param iError 错误号(0表示正确返回)
         */ 
        @Override 
        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; 
            } 
            // 清除地图上已有的所有覆盖物  
            mapView.getOverlays().clear(); 
            // PoiOverlay是baidu map api提供的用于显示POI的Overlay  
            PoiOverlay poioverlay = new PoiOverlay(PoiSearchInCityActivity.this, mapView); 
            // 设置搜索到的POI数据  
            poioverlay.setData(result.getAllPoi()); 
            // 在地图上显示PoiOverlay(将搜索到的兴趣点标注在地图上)  
            mapView.getOverlays().add(poioverlay); 
 
            if(result.getNumPois() > 0) { 
                // 设置其中一个搜索结果所在地理坐标为地图的中心  
                MKPoiInfo poiInfo = result.getPoi(0); 
                mapController.setCenter(poiInfo.pt); 
            } 
             
            sb.append("共搜索到").append(result.getNumPois()).append("个POI/n"); 
            // 遍历当前页返回的POI(默认只返回10个)  
            for (MKPoiInfo poiInfo : result.getAllPoi()) { 
                sb.append("名称:").append(poiInfo.name).append("/n"); 
                //sb.append("地址:").append(poiInfo.address).append("/n");  
                //sb.append("经度:").append(poiInfo.pt.getLongitudeE6() / 1000000.0f).append("/n");  
                //sb.append("纬度:").append(poiInfo.pt.getLatitudeE6() / 1000000.0f).append("/n");  
            } 
 
            // 通过AlertDialog显示当前页搜索到的POI  
            new AlertDialog.Builder(PoiSearchInCityActivity.this) 
            .setTitle("搜索到的POI信息") 
            .setMessage(sb.toString()) 
            .setPositiveButton("关闭", new DialogInterface.OnClickListener() { 
                public void onClick(DialogInterface dialog, int whichButton) { 
                    dialog.dismiss(); 
                } 
            }).create().show(); 
        } 
 
        /**
         * 公交换乘路线搜索结果
         * 
         * @param result 搜索结果
         * @param iError 错误号(0表示正确返回)
         */ 
        @Override 
        public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) { 
        } 
 
        /**
         * 步行路线搜索结果
         * 
         * @param result 搜索结果
         * @param iError 错误号(0表示正确返回)
         */ 
        @Override 
        public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) { 
        } 
    } 

package com.liufeng.baidumap;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKAddrInfo;
import com.baidu.mapapi.MKDrivingRouteResult;
import com.baidu.mapapi.MKPoiInfo;
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.PoiOverlay;

public class PoiSearchInCityActivity extends MapActivity {
// 定义地图引擎管理类
private BMapManager mapManager;
// 定义搜索服务类
private MKSearch mMKSearch;

private MapView mapView;
private MapController mapController;
private EditText keyWordEditText;
private Button queryButton;
private static StringBuilder sb;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.poi_city_search);

// 初始化MapActivity
mapManager = new BMapManager(getApplication());
// init方法的第一个参数需填入申请的API Key
mapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4", null);
super.initMapActivity(mapManager);

mapView = (MapView) findViewById(R.id.map_View);
// 设置地图模式为交通地图
mapView.setTraffic(true);
// 设置启用内置的缩放控件
mapView.setBuiltInZoomControls(true);

// 取得地图控制器对象,用于控制MapView
mapController = mapView.getController();
// 设置地图默认的缩放级别
mapController.setZoom(10);

// 设置每页返回的POI数,默认为10,取值范围1-50
MKSearch.setPoiPageCapacity(10);
// 初始化MKSearch
mMKSearch = new MKSearch();
mMKSearch.init(mapManager, new MySearchListener());

keyWordEditText = (EditText) findViewById(R.id.keyword_edittext);
queryButton = (Button) findViewById(R.id.query_button);
queryButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//每次搜索前先前sb中的内容清空
sb = new StringBuilder();

String keyWord = keyWordEditText.getText().toString().trim();
// 搜索贵阳地区的沃尔玛
mMKSearch.poiSearchInCity("贵阳", keyWord);
}
});
}

@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.stop();
}
super.onPause();
}

@Override
protected void onResume() {
if (mapManager != null) {
// 开启百度地图API
mapManager.start();
}
super.onResume();
}

/**
* 实现MKSearchListener接口,用于实现异步搜索服务
*
* @author liufeng
*/
public class MySearchListener implements MKSearchListener {
/**
* 根据经纬度搜索地址信息结果
*
* @param result 搜索结果
* @param iError 错误号(0表示正确返回)
*/
@Override
public void onGetAddrResult(MKAddrInfo result, int iError) {
}

/**
* 驾车路线搜索结果
*
* @param result 搜索结果
* @param iError 错误号(0表示正确返回)
*/
@Override
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;
}
// 清除地图上已有的所有覆盖物
mapView.getOverlays().clear();
// PoiOverlay是baidu map api提供的用于显示POI的Overlay
PoiOverlay poioverlay = new PoiOverlay(PoiSearchInCityActivity.this, mapView);
// 设置搜索到的POI数据
poioverlay.setData(result.getAllPoi());
// 在地图上显示PoiOverlay(将搜索到的兴趣点标注在地图上)
mapView.getOverlays().add(poioverlay);

if(result.getNumPois() > 0) {
// 设置其中一个搜索结果所在地理坐标为地图的中心
MKPoiInfo poiInfo = result.getPoi(0);
mapController.setCenter(poiInfo.pt);
}

sb.append("共搜索到").append(result.getNumPois()).append("个POI/n");
// 遍历当前页返回的POI(默认只返回10个)
for (MKPoiInfo poiInfo : result.getAllPoi()) {
sb.append("名称:").append(poiInfo.name).append("/n");
//sb.append("地址:").append(poiInfo.address).append("/n");
//sb.append("经度:").append(poiInfo.pt.getLongitudeE6() / 1000000.0f).append("/n");
//sb.append("纬度:").append(poiInfo.pt.getLatitudeE6() / 1000000.0f).append("/n");
}

// 通过AlertDialog显示当前页搜索到的POI
new AlertDialog.Builder(PoiSearchInCityActivity.this)
.setTitle("搜索到的POI信息")
.setMessage(sb.toString())
.setPositiveButton("关闭", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.dismiss();
}
}).create().show();
}

/**
* 公交换乘路线搜索结果
*
* @param result 搜索结果
* @param iError 错误号(0表示正确返回)
*/
@Override
public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {
}

/**
* 步行路线搜索结果
*
* @param result 搜索结果
* @param iError 错误号(0表示正确返回)
*/
@Override
public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {
}
}
}
3)AndroidManifest.xml中的配置
      view plaincopy to clipboardprint?<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.liufeng.baidumap" 
      android:versionCode="1" 
      android:versionName="1.0"> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
        <activity android:name=".PoiSearchInCityActivity" android:label="@string/app_name"> 
            <intent-filter> 
                <action android:name="android.intent.action.MAIN" /> 
                <category android:name="android.intent.category.LAUNCHER" /> 
            </intent-filter> 
        </activity> 
    </application> 
    <uses-sdk android:minSdkVersion="4" /> 
 
    <!-- 访问网络的权限 --> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <!-- 访问精确位置的权限 --> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <!-- 访问网络状态的权限 --> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <!-- 访问WIFI网络状态的权限 --> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <!-- 改变WIFI网络状态的权限 --> 
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> 
    <!-- 读写存储卡的权限 --> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <!-- 读取电话状态的权限 --> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
</manifest>  
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.liufeng.baidumap"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".PoiSearchInCityActivity" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="4" />

    <!-- 访问网络的权限 -->
    <uses-permission android:name="android.permission.INTERNET" />
<!-- 访问精确位置的权限 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!-- 访问网络状态的权限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- 访问WIFI网络状态的权限 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- 改变WIFI网络状态的权限 -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <!-- 读写存储卡的权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 读取电话状态的权限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
</manifest> 
4)运行结果
        摘自:http://blog.csdn.net/lyq8479/article/details/6398630