Android中使用百度地图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

<?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类

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) {
        }
    }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索百度地图 android
, 接口 百度地图 接口
, 地图
, poi
, 搜索
, 地图api
, bmapmanager
, append
, 百度地图api
, poi ppt background
, android百度地图
, alertdialog
, import
, result
搜索结果
,以便于您获取更多的相关知识。

时间: 2024-09-28 07:20:50

Android中使用百度地图API:城市POI搜索-获取所有结果的相关文章

Android中使用百度地图API:根据经纬度查询地址信息

百度地图移动版API不仅包含构建地图的基本接口,还集成了众多搜索服务,包括:位置检索.周边检索. 范围检索.公交检索.驾乘检索.步行检索.地址信息查询等. 百度地图移动版API提供的搜索服务主要是 通过初始化MKSearch类,注册搜索结果的监听对象MKSearchListener来实现异步搜索服务.首先需要自定义一 个MySearchListener类,它实现MKSearchListener接口,然后通过实现接口中不同的回调方法,来获得对应的 搜索结果.MySearchListener类的定义

Android中使用百度地图API:公交换乘方案搜索

这是我写的第3篇介绍调用百度地图API搜索服务的文章,所以对搜索前要做的其它工作不再介绍,再加上 代码中的注释也对相关的操作.方法做了尽可能详细的说明,所以直接看示例吧. 1)布局文件 res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro

Android中使用百度地图API:MyLocationOverlay

本篇文章主要讲解Baidu Map API中MyLocationOverlay的使用.故名思义,MyLocation中文释义为"我的 位置",而Overlay则是"图层"或"覆盖物"的意思,MyLocationOverlay的作用正是用于在地图上标注自己 所处的位置.它跟使用ItemizedOverlay非常相似,只不过MyLocationOverlay标记的只有一个点. 在地图 上标记用户当前所处位置其实是一个GPS定位应用.首先通过GPS定位

Android中使用百度地图API:ItemizedOverlay

Overlay简介 Overlay通常被译为"图层"或"覆盖物".那么对于地图而言,什么称之为覆盖物?"所 有叠加或覆盖到地图之上的内容,都被称之为地图覆盖物,如标注.矢量图形元素(包括:折线和多边形和圆) .定位图标等.覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动." 为了让大家 能够对Overlay有更进一步的认识,我们再通过下面的图形来直观的认识它. 图中标记的那些红色的图标 A,B,...,J正是Overlay的其中一

在Android应用中使用百度地图api

本篇通过一个简单的示例一步步介绍如何在Android应用中使用百度地图api. 1)下载百度地图移动版 API(Android)开发包 要在Android应用中使用百度地图API,就需要在工程中引用百度地图API开发包,这个 开发包包含两个文件:baidumapapi.jar和libBMapApiEngine.so.下载地址: http://dev.baidu.com/wiki/static/imap/files/BaiduMapApi_Lib_Android_1.0.zip 2)申请API K

javascript使用百度地图api和html5特性获取浏览器位置

 本文介绍了javascript使用百度地图api和html5特性获取浏览器位置的小功能,大家参考使用吧 代码如下: <!DOCTYPE html> <html> <body> <p id="demo">点击这个按钮,获得您的位置:</p> <button onclick="getLocation()">试一下</button> <script src="http:/

java调用百度地图API根据地理位置中文获取经纬度

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 百度地图api提供了很多地图相关的免费接口,有利于地理位置相关的开发,百度地图api首页:http://developer.baidu.com/map/. 博主使用过根据地理根据地理位置中文获取经纬度的api,下面提供Java调用百度api接口的代码,详情可参考百度地图api相关说明:http://developer.baidu.com/map/index.php?title=webapi/

javascript使用百度地图api和html5特性获取浏览器位置_javascript技巧

复制代码 代码如下: <!DOCTYPE html><html><body><p id="demo">点击这个按钮,获得您的位置:</p><button onclick="getLocation()">试一下</button><script src="http://api.map.baidu.com/api?v=1.4" type="text/ja

[android] 百度地图开发 (二).定位城市位置和城市POI搜索

一. 百度地图城市定位和POI搜索知识       上一篇文章"百度地图开发(一)"中讲述了如何申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述如何定位城市位置.定位自己的位置和进行城市兴趣点POI(Point of Interest)搜索.那么如何在百度地图上定位某一个位置呢?      通过类GeoPoint可以定义经纬度,它存放着纬度值和经度值,通过getLastKnownLocation()方法可以获取Location对象,再定位经纬度设置其为地图中心即可显示当前