码迷,mamicode.com
首页 > 其他好文 > 详细

百度地图进阶【POI数据检索】

时间:2015-05-02 23:28:52      阅读:744      评论:0      收藏:0      [点我收藏+]

标签:风飞雪未扬   百度地图搜索   poi搜索   

前面学习百度地图的一些基本的用法,这次我们一起来看一看百度地图的检索功能吧 

poi检索api的基本用法

百度地图的POI类中共有如下几个方法

PoiBoundSearchOption
POI范围内检索参数
PoiCitySearchOption
poi城市内检索参数
PoiDetailResult
详情检索结果
PoiDetailSearchOption
poi 详情检索参数
PoiNearbySearchOption
附近检索参数
PoiResult
poi搜索结果。
PoiSearch
POI检索接口

我们现在先看下PoiSearch中的内容

void destroy()
释放检索对象
static PoiSearch newInstance()
创建PoiSearch实例
boolean searchInBound(PoiBoundSearchOption option)
范围内检索
boolean searchInCity(PoiCitySearchOption option)
城市内检索
boolean searchNearby(PoiNearbySearchOption option)
周边检索
boolean searchPoiDetail(PoiDetailSearchOption option)
POI 详情检索
void setOnGetPoiSearchResultListener(OnGetPoiSearchResultListener listener)
设置poi检索监听者
从api中我们不难看出,百度的poi检索主要有范围检索(指定坐标范围)、城市检索(指定某一城市)周边检索(根据自身位置周边)和poi详情检索


2.指定坐标范围搜索

无论是什么搜索基本步骤都是不变的
<span style="color:#ff6666;"> // 第一步,创建POI检索实例</span>
    poiSearch = PoiSearch.newInstance();
 <span style="color:#ff6666;"> // 第二步,创建POI检索监听者;</span>
  OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {

    public void onGetPoiResult(PoiResult result) {
      // 获取POI检索结果
      if (result == null || result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
        Toast.makeText(POISearchMapActivity.this, "未找到结果", Toast.LENGTH_LONG).show();
        return;
      }
      if (result.error == SearchResult.ERRORNO.NO_ERROR) {
        List<PoiInfo> allPoi = result.getAllPoi();
        totalpages = result.getTotalPageNum();

        String[] datas = new String[10];
        for (int i = 0; i < 10; i++) {
          datas[i] = allPoi.get(i).name;
        }

        adapter = new ArrayAdapter<String>(POISearchMapActivity.this, android.R.layout.simple_list_item_1, datas);
        listView.setAdapter(adapter);

        return;
      }
      if (result.error == SearchResult.ERRORNO.AMBIGUOUS_KEYWORD) {

        // 当输入关键字在本市没有找到,但在其他城市找到时,返回包含该关键字信息的城市列表
        String strInfo = "在";
        for (CityInfo cityInfo : result.getSuggestCityList()) {
          strInfo += cityInfo.city;
          strInfo += ",";
        }
        strInfo += "找到结果";
        Toast.makeText(POISearchMapActivity.this, strInfo, Toast.LENGTH_LONG).show();
      }
    }

    public void onGetPoiDetailResult(PoiDetailResult result) {
      // 获取Place详情页检索结果

    }
  };

<span style="color:#ff6666;">// 第三步,设置POI检索监听者;</span>
    poiSearch.setOnGetPoiSearchResultListener(poiListener);

  // 这是范围
        LatLngBounds.Builder b = new LatLngBounds.Builder();
        b.include(new LatLng(39.976446, 116.320331));
        b.include(new LatLng(39.900766, 116.32838));
        b.include(new LatLng(39.910065, 116.491081));
        b.include(new LatLng(39.976004, 116.475558));
        LatLngBounds build = b.build();<pre name="code" class="java">获得LatLngBounds
// 第四步,发起检索请求; poiSearch.searchInBound(new PoiBoundSearchOption().bound(build).keyword("美食").pageNum(currentPage));

下面使用一个简单的例子来进行说明
xml文件
里面只有一个简单的listview
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".IndexActivity" >
	
    <ListView
        android:id="@+id/mylistView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>


在activity中实现对数据的获取和展示工作,在例子中为了方便演示,监听了onKeyDown方法,修改了meun按键的相应操作,修改为按下menu键显示数据再次点击显示下页数据。这里仅展示“美食”搜索结果仅展示“美食名”。
package com.flyou.hellomap;

import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.LatLngBounds;
import com.baidu.mapapi.search.core.CityInfo;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiBoundSearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;

public class POISearchMapActivity extends Activity {
  private int totalpages = 0;
  private ListView listView = null;
  private PoiSearch poiSearch;
  private int currentPage = 0;
  ArrayAdapter<String> adapter = null;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 在使用SDK各组件之前初始化context信息,传入ApplicationContext
    // 注意该方法要再setContentView方法之前实现
    SDKInitializer.initialize(getApplicationContext());

    setContentView(R.layout.activity_index);

    listView = (ListView) findViewById(R.id.mylistView);

    // 第一步,创建POI检索实例
    poiSearch = PoiSearch.newInstance();
    // 第三步,设置POI检索监听者;
    poiSearch.setOnGetPoiSearchResultListener(poiListener);

  }

  // 第二步,创建POI检索监听者;
  OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {

    public void onGetPoiResult(PoiResult result) {
      // 获取POI检索结果
      if (result == null || result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
        Toast.makeText(POISearchMapActivity.this, "未找到结果", Toast.LENGTH_LONG).show();
        return;
      }
      if (result.error == SearchResult.ERRORNO.NO_ERROR) {
        List<PoiInfo> allPoi = result.getAllPoi();
        totalpages = result.getTotalPageNum();

        String[] datas = new String[10];
        for (int i = 0; i < 10; i++) {
          datas[i] = allPoi.get(i).name;
        }
        Toast.makeText(POISearchMapActivity.this, "当前第"+currentPage+"页,共"+result.getTotalPageNum()+"页", 0).show();
        adapter = new ArrayAdapter<String>(POISearchMapActivity.this, android.R.layout.simple_list_item_1, datas);
        listView.setAdapter(adapter);

        return;
      }
      if (result.error == SearchResult.ERRORNO.AMBIGUOUS_KEYWORD) {

        // 当输入关键字在本市没有找到,但在其他城市找到时,返回包含该关键字信息的城市列表
        String strInfo = "在";
        for (CityInfo cityInfo : result.getSuggestCityList()) {
          strInfo += cityInfo.city;
          strInfo += ",";
        }
        strInfo += "找到结果";
        Toast.makeText(POISearchMapActivity.this, strInfo, Toast.LENGTH_LONG).show();
      }
    }

    public void onGetPoiDetailResult(PoiDetailResult result) {
      // 获取Place详情页检索结果

    }
  };

  @Override
  protected void onDestroy() {
    super.onDestroy();
    // 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
    poiSearch.destroy();
  }

  @Override
  protected void onResume() {
    super.onResume();
    // 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理

  }

  @Override
  protected void onPause() {
    super.onPause();
    // 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理

  }

  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {

    switch (keyCode) {
      case KeyEvent.KEYCODE_MENU:
        
        // 这是范围
        LatLngBounds.Builder b = new LatLngBounds.Builder();
        b.include(new LatLng(39.976446, 116.320331));
        b.include(new LatLng(39.900766, 116.32838));
        b.include(new LatLng(39.910065, 116.491081));
        b.include(new LatLng(39.976004, 116.475558));
        LatLngBounds build = b.build();
        // 第四步,发起检索请求;
        poiSearch.searchInBound(new PoiBoundSearchOption().bound(build).keyword("美食").pageNum(currentPage));
        // poiSearch.searchInCity((new
        // PoiCitySearchOption()).city("开封").keyword("美食").pageNum(currentPage));

        currentPage++;
        if (currentPage == totalpages) {
          currentPage = 0;
        }
        break;

    }
    return super.onKeyDown(keyCode, event);
  }
}

技术分享

3.城市搜索

核心代码
  poiSearch.searchInCity((new
         PoiCitySearchOption()).city("开封").keyword("美食").pageNum(currentPage));


4.周边搜索


PoiNearbySearchOption keyword(java.lang.String key)
检索关键字
PoiNearbySearchOption location(LatLng location)
检索位置
PoiNearbySearchOption pageCapacity(int pageCapacity)
设置每页容量,默认为每页10条
PoiNearbySearchOption pageNum(int pageNum)
分页编号
PoiNearbySearchOption radius(int radius)
设置检索的半径范围----------单位为米

技术分享


poiSearch.searchNearby(new PoiNearbySearchOption()
        .keyword("大学")
        .location(new LatLng(34.82336,114.31496))
        .radius(3000)
            );//可以为定位的坐标也可自己制定



百度地图进阶【POI数据检索】

标签:风飞雪未扬   百度地图搜索   poi搜索   

原文地址:http://blog.csdn.net/u013616976/article/details/45442279

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!