1. 程式人生 > >百度地圖從零學起(七)百度提供給開發者的服務

百度地圖從零學起(七)百度提供給開發者的服務

搜尋服務

百度地圖移動版API整合搜尋服務包括:位置檢索、周邊檢索、範圍檢索、公交檢索、駕乘檢索、步行檢索,通過初始化MKSearch類,註冊搜尋結果的監聽物件MKSearchListener,實現非同步搜尋服務。首先自定義MySearchListener實現MKSearchListener介面,通過不同的回撥方法,獲得搜尋結果:

  1. public class MySearchListener implements MKSearchListener {
  2. @Override
  3. public void onGetAddrResult(MKAddrInfo result, int iError)
    {
  4. }
  5. @Override
  6. public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {
  7. }
  8. @Override
  9. public void onGetPoiResult(MKPoiResult result, int type, int iError) {
  10. }
  11. @Override
  12. public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {
  13. }
  14. @Override
  15. public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {
  16. }
  17. @Override
  18. public void onGetBusDetailResult(MKBusLineResult result, int iError) {
  19. }
  20. @Override
  21. public void onGetSuggestionResult(MKSuggestionResult result, int iError) {
  22. }
  23. }

然後初始化MKSearch類:

  1. mMKSearch =
    new MKSearch();
  2. mMKSearch.init(mBMapMan, new MySearchListener());//注意,MKSearchListener只支援一個,以最後一次設定為準

POI搜尋及PoiOverlay

POI搜尋有三種方式,根據範圍和檢索詞發起範圍檢索poiSearchInbounds,城市poi檢索poiSearchInCity,周邊檢索poiSearchNearBy,以下以周邊檢索為例介紹如何進行檢索並顯示覆蓋物PoiOverlay:

檢索天安門周邊5000米之內的KFC餐廳:

  1. mMKSearch.poiSearchNearBy("KFC", new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6)), 5000);

實現MySearchListener的onGetPoiResult,並展示檢索結果:

  1. @Override
  2. public void onGetPoiResult(MKPoiResult result, int type, int iError) {
  3. if (result == null) {
  4. return;
  5. }
  6. PoiOverlay poioverlay = new PoiOverlay(MyMapActivity.this, mMapView);
  7. poioverlay.setData(result.getAllPoi());
  8. mMapView.getOverlays().add(poioverlay);
  9. mMapView.invalidate(); //重新整理地圖
  10. }

執行結果如下:app_poioverlay.png

place詳情頁面使用方法

當執行完poi檢索後,我們會得到一個poi的列表,每個poi節點都有個uid屬性,我們可以根據這個uid獲取關於這個poi的一些更詳細的資訊.比如:評論、圖片、商戶描述等。

在AndroidManifest.xml中設定如下資訊:

<activity android:name="com.baidu.mapapi.PlaceCaterActivity"
          android:configChanges="orientation|keyboardHidden"
          android:theme="@android:style/Theme.NoTitleBar"> </activity>

發起請求:

mSearch.poiDetailSearch(poi.uid);

詳情頁執行結果:place詳情頁面使用方法

具體實現詳見相關下載提供的Demo(PoiSearch.java)

駕車路線搜尋及RouteOverlay

檢索從天安門到百度大廈的駕車路線:

  1. MKPlanNode start = new MKPlanNode();
  2. start.pt = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));
  3. MKPlanNode end = new MKPlanNode();
  4. end.pt = new GeoPoint(40057031, 116307852);
  5. // 設定駕車路線搜尋策略,時間優先、費用最少或距離最短
  6. mMKSearch.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST);
  7. mMKSearch.drivingSearch(null, start, null, end);

實現MySearchListener的onGetDrivingRouteResult,並展示檢索結果:

  1. @Override
  2. public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {
  3. if (result == null) {
  4. return;
  5. }
  6. RouteOverlay routeOverlay = new RouteOverlay(MyMapActivity.this, mMapView);
  7. // 此處僅展示一個方案作為示例
  8. routeOverlay.setData(result.getPlan(0).getRoute(0));
  9. mMapView.getOverlays().add(routeOverlay);
  10. }

執行結果如下:app_routeoverlay_drive.png

步行路線搜尋及RouteOverlay

方式與駕車路線搜尋類似,只需將mMKSearch.drivingSearch(null, start, null, end)修改為mMKSearch.walkingSearch(null, start, null, end),實現的方法改為onGetWalkingRouteResult即可,不再贅述。

公交換乘路線搜尋及TransitOverlay

檢索從天安門到百度大廈的公交換乘路線:

  1. MKPlanNode start = new MKPlanNode();
  2. start.pt = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));
  3. MKPlanNode end = new MKPlanNode();
  4. end.pt = new GeoPoint(40057031, 116307852);
  5. // 設定乘車路線搜尋策略,時間優先、最少換乘、最少步行距離或不含地鐵
  6. mMKSearch.setTransitPolicy(MKSearch.EBUS_TRANSFER_FIRST);
  7. mMKSearch.transitSearch("北京", start, end); // 必須設定城市名

實現MySearchListener的onGetTransitRouteResult(MKTransitRouteResult, int),並展示檢索結果:

  1. @Override
  2. public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {
  3. if (result == null) {
  4. return;
  5. }
  6. TransitOverlay transitOverlay = new TransitOverlay(MyMapActivity.this, mMapView);
  7. // 此處僅展示一個方案作為示例
  8. transitOverlay.setData(result.getPlan(0));
  9. mMapView.getOverlays().add(transitOverlay);
  10. mMapView.invalidate(); //重新整理地圖
  11. }

公交路線詳情搜尋

檢索北京市公交路線717的poi,獲取公交路線的uid:

  1. mSearch.poiSearchInCity("北京", "717");

實現MySearchListener的onGetPoiResult (MKPoiResult res, int type, int error),獲得公交線路poi的uid,並根據此uid發起公交線路詳情的檢索:

  1. @Override
  2. public void onGetPoiResult(MKPoiResult res, int type, int error) {
  3. // 錯誤號可參考MKEvent中的定義
  4. if (error != 0 || res == null) {
  5. Toast.makeText(BusLineSearch.this, "抱歉,未找到結果", Toast.LENGTH_LONG).show();
  6. return;
  7. }
  8. // 找到公交路線poi node
  9. MKPoiInfo curPoi = null;
  10. int totalPoiNum = res.getNumPois();
  11. for( int idx = 0; idx < totalPoiNum; idx++ ) {
  12. curPoi = res.getPoi(idx);
  13. if ( 2 == curPoi.ePoiType ) {
  14. break;
  15. }
  16. }
  17. mSearch.busLineSearch(mCityName, curPoi.uid);
  18. }

實現MySearchListener的onGetBusDetailResult(MKBusLineResult result, int iError),並展示搜尋結果:

  1. public void onGetBusDetailResult(MKBusLineResult result, int iError) {
  2. if (iError != 0 || result == null) {
  3. Toast.makeText(BusLineSearch.this, "抱歉,未找到結果", Toast.LENGTH_LONG).show();
  4. return;
  5. }
  6. RouteOverlay routeOverlay = new RouteOverlay(BusLineSearch.this, mMapView);
  7. // 此處僅展示一個方案作為示例
  8. routeOverlay.setData(result.getBusRoute());
  9. mMapView.getOverlays().clear();
  10. mMapView.getOverlays().add(routeOverlay);
  11. mMapView.invalidate();
  12. mMapView.getController().animateTo(result.getBusRoute().getStart());
  13. }

執行結果如下:app_buslineoverlay.png

地址資訊查詢

根據地理座標查詢地址資訊:

  1. mMKSearch.reverseGeocode(new GeoPoint(40057031, 116307852)); //逆地址解析
  2. mMKSearch.geocode(key, city);//地址解析

geocode返回結果在MKSearchListener裡的onGetAddrResult方法。

reverseGeocode返回結果在MKSearchListener裡的onGetPoiResult方法。

  1. public void onGetAddrResult(MKAddrInfo res, int error) {
  2. if (error != 0) {
  3. String str = String.format("錯誤號:%d", error);
  4. Toast.makeText(GeoCoder.this, str, Toast.LENGTH_LONG).show();
  5. return;
  6. }
  7. mMapView.getController().animateTo(res.geoPt);
  8. String strInfo = String.format("緯度:%f 經度:%f\r\n", res.geoPt.getLatitudeE6()/1e6,res.geoPt.getLongitudeE6()/1e6);
  9. Toast.makeText(GeoCoder.this, strInfo, Toast.LENGTH_LONG).show();
  10. Drawable marker = getResources().getDrawable(R.drawable.iconmarka); //得到需要標在地圖上的資源
  11. marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight()); //為maker定義位置和邊界
  12. mMapView.getOverlays().clear();
  13. mMapView.getOverlays().add(new OverItemT(marker, GeoCoder.this, res.geoPt, res.strAddr));
  14. }
  1. public void onGetPoiResult(MKPoiResult res, int type, int error) {
  2. if (error != 0 || res == null) {
  3. Toast.makeText(GeoCoder.this, "解析失敗", Toast.LENGTH_LONG).show();
  4. return;
  5. }
  6. if (res != null && res.getCurrentNumPois() > 0) {
  7. GeoPoint ptGeo = res.getAllPoi().get(0).pt;
  8. // 移動地圖到該點:
  9. mMapView.getController().animateTo(ptGeo);
  10. String strInfo = String.format("緯度:%f 經度:%f\r\n", ptGeo.getLatitudeE6()/1e6,ptGeo.getLongitudeE6()/1e6);
  11. strInfo += "\r\n附近有:";
  12. for (int i = 0; i < res.getAllPoi().size(); i++) {
  13. strInfo += (res.getAllPoi().get(i).name + ";");
  14. }
  15. Toast.makeText(GeoCoder.this, strInfo, Toast.LENGTH_LONG).show();
  16. }
  17. }

線上建議查詢

根據關鍵詞查詢線上建議詞:

  1. mMKSearch.suggestionSearch("天安門"); //輸入關鍵詞

實現MySearchListener的onGetSuggestionResult,得到查詢結果:

  1. ListView mSuggestionList = (ListView) findViewById(R.id.listView1);
  2. @Override
  3. public void onGetSuggestionResult(MKSuggestionResult res, int iError)
  4. {
  5. if (iError!= 0 || res == null) {
  6. Toast.makeText(PoiSearch.this, "抱歉,未找到結果", Toast.LENGTH_LONG).show();
  7. return;
  8. }
  9. int nSize = res.getSuggestionNum();
  10. String[] mStrSuggestions = new String[nSize];
  11. for (int i = 0; i < nSize; i++)
  12. {
  13. mStrSuggestions[i] = res.getSuggestion(i).city + res.getSuggestion(i).key;
  14. }
  15. ArrayAdapter<String> suggestionString = new ArrayAdapter<String>(PoiSearch.this, android.R.layout.simple_list_item_1,mStrSuggestions);
  16. mSuggestionList.setAdapter(suggestionString);
  17. }

雲檢索模組的使用

首先例項化GeoSearchListener介面:

  1. @Override
  2. public void onGetGeoDetailsResult(DetailResult result, int type, int iError)
  3. {
  4. if (result != null) {
  5. if (result.content != null) {
  6. Toast.makeText(CloudSearchDemo.this, result.content.name, Toast.LENGTH_LONG).show();
  7. }
  8. else {
  9. Toast.makeText(CloudSearchDemo.this, "status:" + result.status, Toast.LENGTH_SHORT).show();
  10. }
  11. }
  12. }
  13. @Override
  14. public void onGetGeoResult(GeoSearchResult result, int type, int iError)
  15. {
  16. if (result != null && result.poiList != null && result.poiList.size() > 0) {
  17. CloudOverlay poiOverlay = new CloudOverlay(this);
  18. poiOverlay.setData(result.poiList);
  19. mMapView.getOverlays().clear();
  20. mMapView.getOverlays().add(poiOverlay);
  21. mMapView.invalidate();
  22. mMapView.getController().animateTo(new GeoPoint((int)(result.poiList.get(0).latitude * 1e6), (int)(result.poiList.get(0).longitude * 1e6)));
  23. }
  24. }

發起雲檢索請求:

  1. BoundsSearchInfo r = new BoundsSearchInfo();
  2. r.queryWords = "五中";
  3. r.ak = "輸入你的ak";
  4. r.bounds = new Bounds(39843895, 116402214, 40956948, 116431457);
  5. r.filter.put("databox", 848);
  6. r.scope = 2;
  7. GeoSearchManager.getInstance().searchBounds(r);
  8. // 當請求成功時,會回撥onGetGeoResult函式,執行打點操作。
  9. CloudOverlay poiOverlay = new CloudOverlay(this);
  10. poiOverlay.setData(result.poiList);
  11. mMapView.getOverlays().clear();
  12. mMapView.getOverlays().add(poiOverlay);
  13. mMapView.invalidate();

執行結果如下:雲檢索模組的使用

相關推薦

地圖提供開發者服務

搜尋服務 百度地圖移動版API整合搜尋服務包括:位置檢索、周邊檢索、範圍檢索、公交檢索、駕乘檢索、步行檢索,通過初始化MKSearch類,註冊搜尋結果的監聽物件MKSearchListener,實現非同步搜尋服務。首先自定義MySearchListener實現MKSearc

地圖離線地圖包的安裝使用

初始化 //寫在繼承MapActivity裡 MKOfflineMap mOffline = null; //申明變數 //寫在onCreate函式裡 mOffline = new MKOfflineMap();

地圖地圖覆蓋物

地圖覆蓋物概述 所有疊加或覆蓋到地圖的內容,我們統稱為地圖覆蓋物。如標註、向量圖形元素(包括:折線和多邊形和圓)、定點陣圖標等。覆蓋物擁有自己的地理座標,當您拖動或縮放地圖時,它們會相應的移動。 地圖API提供瞭如下幾種覆蓋物: Overlay:覆蓋物的抽象基類,所有的覆蓋

地圖搭建地圖開發環境

如何把API 新增到我的Android工程中? 首先在工程裡新建libs資料夾,並API開發包裡的baidumapapi.jar拷貝到libs根目錄下,將libBMapApiEngine.so拷貝到libs\armeabi目錄下。官網demo裡已有這兩個檔案,如果要整合到自

Unity_2D遊戲例項2——手遊開場動畫的實現

一個酷炫的開場動畫多多少少可以讓遊戲高大上起來(對於外行來說…)不管怎麼說,我們發現基本上任何一款遊戲都有自己獨特的開場動畫用來顯示自己的品牌logo。所以 接著我們上次教程,開始和大家分享如何製作出手遊的開場動畫。主要有以下內容: a.安卓Apk檔案的釋出生成 b.如何在

Android、Activity頁面的跳轉

在前面的學習中,我們已經建立好了一個擁有一個文字域和一個按鈕的Activity。今天的學習任務就是在MyActivity中加入一些程式碼,當用戶點選按鈕的時候跳轉到另外一個Activity頁面。 按鈕的響應事件 要實現上面的功能,我們首先需要做的就是學習怎麼去響應按鈕的點

學習springboot--整合線上swagger文件之常用註解

1、@Api含義:標識一個模組的描述,一般用於restful介面的類註解常用屬性:1)value:用於介面模組的標題描述,似乎1.5版本後不可用2)tags:用於介面模組的標題描述3)description:描述介面類的詳細資訊,副標題,雖然起作用,但是後面可能會被廢棄4)p

IT界的新方向-大數據?讓我來告訴你如何

大數據學習+Java大數據行業目前炒的很是火爆,但是大數據的發展依然並不是很成熟,尤其是對於一些小白。了解系統的學習大數據的方法將更有利於自己更加快速有效的去學習大數據。分享一下零基礎如何學習大數據。 第一、對於初學者尤其是編程小白,Linux、Java的學習是必須的。但這並不代表我們非要研究透這些,我們只要

0開始架構複雜來源:低成本、安全、規模

低成本 一般中小公司基本都是靠引入新技術來達到低成本的目標;而大公司更有可能自己去創造新的技術來達到低成本的目標,因為大公司才有足夠的資源、技術和時間去創造新技術。 安全 安全本身是一個龐大而又複雜的技術領域,並且一旦出問題,對業務和企業形象影響非常大。 從技術的角

開始caffe:利用GoogleNet實現影象識別

一、準備模型 在這裡,我們利用已經訓練好的Googlenet進行物體影象的識別,進入Googlenet的GitHub地址,進入models資料夾,選擇Googlenet 點選Googlenet的模型下載地址下載該模型到電腦中。 模型結構 在這裡,我們利用之前講

地圖的覆蓋物自定義--資訊視窗的自定義呼叫白茹提供的資訊視窗InfoWindow

百度地圖的覆蓋物自定義(而)--資訊視窗的自定義(呼叫白茹提供的資訊視窗InfoWindow) var point=new BMap.Point(111.54525,45.578); setInfo

Android應用中使用地圖API並新增標註

網上一些資料這種的內容已經過時了,這裡是最新的內容,如果哪裡不對,請吐槽。。。 1)下載百度地圖移動版API(Android)開發包       要在Android應用中使用百度地圖API,就需要在工程中引用百度地圖API開發包,這個開發包包含兩個檔案: 2)申請A

FPGAXilinx的7系列6

使用者必須要認識到,學習一下技巧可以讓更多的邏輯放在更少的Slice中,使工具能夠達到既實現設計時序要求又滿足使用者對功耗的要求。而現在很多使用者缺乏程式碼編寫的想法,編寫出一個有時序問題的設計。為了滿足要求,就會不停修改,再綜合再佈局佈線來滿足自己的時序目標。其實,他們需要的是重新評估他們的HDL程式碼技術

地圖和openlayers融合封裝之demo展示

2018.5.28 --11:31 wmap的目的是減少地圖開發的成本和時間。  如果你需要進行地圖開發,覺的百度地圖和openlayers的api文件晦澀難懂(主要是openlayers的api很難懂,百度api入門很簡單),可以使用wmap。你不需要去學習百度地圖api

FPGAXilinx的7系列7

3.最基本的DSP資源3.1 由FIR濾波器談起隨著各種應用複雜度的不斷提升,傳統的DSP和處理器的架構無法支援這麼複雜的並行資料演算法的需求。FPGA卻恰好能夠滿足這樣的需求。FPGA擁有大量的DSP計算單元能夠幫助使用者實現各種各樣的複雜演算法。拿FIR濾波器舉個例子。如

地圖4.1_1開發教程7工具類

繼續上次截圖的工具類 本章包含的內容有, 1.移動指定的經緯度到中心點 2.將座標收藏到收藏夾 3.移動點的斜率、角度、距離(官方) 4.進行軌跡移動 /** * 百度地圖工具類 * Created by kowal on 2016/12/8.

地圖4.1_1開發教程6點收藏2

實現對收藏點的刪除,跳轉地圖上對應收藏點的操作 新建一個Activity,其佈局很簡單 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=

Android 地圖 SDK v3.0.0 新增覆蓋物Marker與InfoWindow的使用

上篇部落格已經實現了地圖的定位以及結合了方向感測器使用者路痴定位方向,如果你還不清楚,請檢視:Android 百度地圖 SDK v3.0.0 (二) 定位與結合方向感測器,本章會教大家如何新增覆蓋物,實現周邊搜尋,以及對覆蓋物的點擊出現介紹等效果。效果圖:我們的需求是,當用戶

React

原文請戳 初接觸React,除了不習慣其元件化的設計原則外,往往它所‘依賴’的眾多module也會讓初學者感到困惑,使得不知從何學起。此文只是我對React的一些淺析,希望能幫助想要學習React的朋友入門。 1.React從來就是獨立的 正如

地圖4.1_1開發教程6點收藏1

在本章教程中,將一起學習長按地圖收藏該點,這本章中,將設計到的內容有 1.長按時間 2.生成marker 3.地理編碼搜尋(用地址檢索座標)、反地理編碼搜尋(用座標檢索地址) 4.收藏點 5.刪除點等操作 先上效果圖 長按地圖,生成地圖的點,地理編碼搜