百度地图开发-检索功能
轉載請注明作者。
注:本人在找工作,地點在北京。
百度地圖SDK開發(三)檢索功能
目前百度地圖SDK所集成的檢索服務包括:POI檢索、公交信息查詢、線路規劃、地理編碼、行政區邊界數據檢索、在線建議查詢、短串分享(包括POI搜索結果分享、駕車/公交/騎行/步行路線規劃分享、反向地理編碼結果分享)。 本文將簡單的介紹下POI檢索,路線查詢,地理編碼。
POI檢索
POI(Point of Interest),中文可以翻譯為“興趣點”。在地理信息系統中,一個POI可以是一棟房子、一個商鋪、一個郵筒、一個公交站等。
百度地圖SDK提供三種類型的POI檢索:周邊檢索、區域檢索和城市內檢索。
接下來就是代碼時刻,通過不同的代碼來展示下三種不同的搜索,其實也就是范圍不同,其他的都差不多。還記得上一篇中說過的百度地圖中的基本模式嗎?創建對象, 創建監聽器,設置參數發起請求。在檢索的時候也是這個套路。
上面的代碼完全就是按照之前的邏輯去寫的,創建對象,設置監聽器,設置參數。發起請求,采用的是附近檢索,用到的類分別有 PoiSearch POi檢索對象,OnGetPoiSearchResultListener檢索的監聽對象,根據檢索方式的不同采用不用的檢索參數對象。
經常用的就是City,Bound,Nearby三種檢索方式,其他的我也不熟悉。配置好參數之后就可以發起一次檢索,并且發起的形式要與檢索參數相對應。之后就可以就監聽器中對檢索的結果進行處理了。
檢索監聽器的回調函數有兩個,分別是普通回調和深度回調,以普通回調為例,先進行檢索結果的判斷,之后對結果中的信息進行處理,查出每一個POi的PoiInfo對象,之后我做的就是把info中的一些信息封裝到了Marker的bundle對象中,好在之后使用。marker對象的獲得是通過baidumap的addoverlay方法的返回值強轉獲取到的。接下來看看對于查詢到的信息的使用。
infoView=View.inflate(this,R.layout.infomation,null);name=(TextView) infoView.findViewById(R.id.name);phone=(TextView) infoView.findViewById(R.id.phone);arr=(TextView) infoView.findViewById(R.id.arr);baiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {@Overridepublic boolean onMarkerClick(Marker marker) {Log.d("TAG","marker:"+marker);Bundle info= marker.getExtraInfo();Log.d("TAG","info:"+info);Log.d("TAG","name"+name);name.setText(info.getString("name"));phone.setText(info.getString("phone"));arr.setText(info.getString("arr"));InfoWindow infoWindow=new InfoWindow(infoView,marker.getPosition(),-30);baiduMap.showInfoWindow(infoWindow);return false;}});利用InfoWindow和marker的點擊事件,創建一個布局放置三個文本用來顯示信息,之后在監聽事件中取出之前放在marker對象中的bundle對象,將其中的內容顯示在文本中,最后創建一個infowindow顯示在地圖上。看效果。
布局寫的有點Low,各位就將就看吧,不過功能是實現了,對于POI檢索就這多,還有就是建議大家以后寫的時候別像我上面那樣寫,很浪費資源的,可以把搜索對象和監聽回調都拿出去,在onClick方法中只對檢索參數進行設置,發起檢索就可以。城市檢索和范圍檢索就是在檢索參數上有所不同,其他的都一樣,最后別忘了執行search.destroy(),釋放資源。
線路規劃
在最新的V3.7.0中支持四種線路分別是,公交,駕車,步行,騎行四種。四種方式的規劃模式是一樣的,上代碼。
public void onClick(View v) {if(TextUtils.isEmpty(ed_start.getText().toString())|TextUtils.isEmpty(ed_end.getText().toString())){return ;}RoutePlanSearch search=RoutePlanSearch.newInstance();search.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {@Overridepublic void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {//TODO 步行回調}@Overridepublic void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {//TODO 公交回調Log.d("TAG","result_biking:"+transitRouteResult.error);if (transitRouteResult==null || transitRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {Toast.makeText(MainActivity.this, "抱歉,未找到結果", Toast.LENGTH_SHORT).show();return ;}if (transitRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {//起終點或途經點地址有岐義,通過以下接口獲取建議查詢信息//result.getSuggestAddrInfo()return;}if (transitRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {TransitRouteOverlay overlay = new TransitRouteOverlay(baiduMap);baiduMap.setOnMarkerClickListener(overlay);overlay.setData(transitRouteResult.getRouteLines().get(0));overlay.addToMap();overlay.zoomToSpan();}}@Overridepublic void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {//TODO 駕車回調Log.d("TAG","result_biking:"+drivingRouteResult.error);if (drivingRouteResult == null || drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {Toast.makeText(MainActivity.this, "抱歉,未找到結果", Toast.LENGTH_SHORT).show();return ;}if (drivingRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {//起終點或途經點地址有岐義,通過以下接口獲取建議查詢信息//result.getSuggestAddrInfo()return;}if (drivingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {DrivingRouteOverlay overlay = new DrivingRouteOverlay(baiduMap);baiduMap.setOnMarkerClickListener(overlay);overlay.setData(drivingRouteResult.getRouteLines().get(0));overlay.addToMap();overlay.zoomToSpan();}}@Overridepublic void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {//TODOLog.d("TAG","result_biking:"+bikingRouteResult.error);if (bikingRouteResult == null || bikingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {Toast.makeText(MainActivity.this, "抱歉,未找到結果", Toast.LENGTH_SHORT).show();return ;}if (bikingRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {//起終點或途經點地址有岐義,通過以下接口獲取建議查詢信息//result.getSuggestAddrInfo()return;}if (bikingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {BikingRouteOverlay overlay = new BikingRouteOverlay(baiduMap);baiduMap.setOnMarkerClickListener(overlay);overlay.setData(bikingRouteResult.getRouteLines().get(0));overlay.addToMap();overlay.zoomToSpan();}}});PlanNode start=PlanNode.withCityNameAndPlaceName("北京",ed_start.getText().toString());PlanNode end=PlanNode.withCityNameAndPlaceName("北京",ed_end.getText().toString());BikingRoutePlanOption options=new BikingRoutePlanOption().from(start).to(end); // TransitRoutePlanOption options=new TransitRoutePlanOption() // .from(start) // .to(end) // .city("北京");search.bikingSearch(options); // search.transitSearch(options);}上面的代碼同樣也是根據之前說過的模板去寫的。創建一個查詢對象RoutePlanSearch,設置監聽器setOnGetRoutePlanResultListener,設置查詢參數BikingRoutePlanOption,發起查詢search.bikingSearch(options)。百度地圖中都是這么處理的。接下來仔細看下代碼。原諒我的懶惰,我都寫onClick方法里了。比較值得注意的就是在監聽器的回調中有四個方法,分別對應著四種規劃。同樣的查詢方法也有四種。參數的配置也有四種。在回調函數中可能會有人注意到BikingRouteOverlay類似的這種類,對應著騎車覆蓋物,駕車覆蓋物等,就是在地圖上的顯示,這些類在百度地圖的類參考中是沒有的。而且下載下來的SDK中也沒有,最開始還以為得自己根據查詢回來的路線,之后經過計算用之前說過的基本的覆蓋物去寫,后來在官方的demo中發現了這個東西。
,有興趣的可以去下個demo去看看,專門有個overlayUtils包里面放著已經寫好的關于路線的覆蓋物。真是的。百度地圖也不告訴一聲。而且官方的類參考也查不到,有點不負責任啊。
上面的代碼并不難。如果你已經了解了百度地圖的這種創建模式就很好理解了。上效果。(效果里面顯示的是騎行的路線)。
關于這個搜索的地址,可以看到我在搜索東單到西單的時候提示地址是無效的,百度對于路線規劃的站點是不支持模糊查詢的,必須是準確的。
還有一點就是我一共進行了兩次搜索,在進行第二次搜索之后之前的搜索路線沒有被清除,這點也很好解決。調用這個方法就可以 overlay.removeFromMap();
如果想要更改路線覆蓋物的樣式,可以直接重寫overlay的兩個方法,能夠設置起點和終點坐標,如果想把路線改了,可以改BikingRouteOverlay中的代碼,可以實現各種樣式。
公交,駕車,步行的程序類似,就不多介紹了。
地理編碼
地理編碼指的是將地址信息建立空間坐標關系的過程。有可分為正向地圖編碼和反向地圖編碼。使用的方式也很簡單,跟之前的方式也是相同的,創建對象, 設置監聽器,設置參數發起請求就可以。上代碼。。
//創建百度地圖的地理編碼查詢對象GeoCoder coder=GeoCoder.newInstance();//設置監聽器coder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {@Overridepublic void onGetGeoCodeResult(GeoCodeResult result) {//地理位置查經緯度Log.d("tag", "error_code: "+result.error);if(result==null||result.error!= SearchResult.ERRORNO.NO_ERROR){Toast.makeText(GeocodeActivity.this, "該點在地球上不存在",Toast.LENGTH_SHOR# #T).show();return;}LatLng location = result.getLocation();MarkerOptions overlay=new MarkerOptions();overlay.icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_locate));overlay.position(location);baiduMap.addOverlay(overlay);//移動屏幕中心MapStatusUpdate msu= MapStatusUpdateFactory.newLatLng(location);baiduMap.animateMapStatus(msu);}@Overridepublic void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {//經緯度查地址}});GeoCodeOption options=new GeoCodeOption().city("北京").address(ed_location.getText().toString());//設置查詢參數。發起查詢coder.geocode(options);//坐標系查地理位置 // coder.reverseGeoCode();}可以看到邏輯都是一樣的,不同的就是地理編碼查詢類GeoCoder,看一下官方的文檔。
,可以看到就這么幾個方法,使用也很容易。
監聽器的回調有兩個方法,發起請求有兩種,參數設置有兩個輔助類。就這么多就能實現從地理位置到坐標和坐標到地理位置。
可以看到在效果圖中輸入地理位置信息就能在地圖上標記出來,至于坐標轉到地理位置就是調用另一個方法就可以。
總結
關于百度地圖的開發就準備寫這么多了。不再繼續往下寫了,因為寫一篇博客對于我來說通常需要一天到兩天的時間去了解,查資料,自己先寫一遍再整理成一篇博客,對于百度地圖,通過我的這三篇博客應該就可能夠說實現基本的使用了,日常功能完全可以滿足,更多的內容我也不怎么會 。那就這樣吧。。
注:本人在找工作,地點在北京。
總結
以上是生活随笔為你收集整理的百度地图开发-检索功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: snap国内加速
- 下一篇: ISO9001质量管理体系认证流程