編輯:Android開發教程
本文主要講解如何通過百度地圖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) { } } }
ORM即Object-Relational Mapping,對象關系映射。簡單理解就是把我們Java的對象與數據庫裡面的記錄進行映射,可以把實體對象持久化到數據庫中,也能
一、動畫類型Android的animation由四種類型組成:alpha、scale、translate、rotateXML配置文件中二、 Android動畫模式Anim
本系列文章都會以一個程序的實例開發為主線來進行講解,以求達到一個循序漸進的學習效果,這樣更能 加深大家對於程序為什麼要這樣寫的用意,理論加上實際的應用才能達到事半功倍的
1.1.1 VSync信號的處理經過上一小節的分析,現在我們已經明白了系統是如何通過硬件設備或者軟件模擬來產生VSync信號的,也明白了它的流轉過程。VSync最終會被E