`
lzfssyy
  • 浏览: 7158 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

百度地图API之POI周边搜索

阅读更多
本文主要讲解如何通过百度地图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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics