本文主要讲解如何通过百度地图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
搜索结果
,以便于您获取更多的相关知识。