百度地图开发-检索功能
轉(zhuǎn)載請注明作者。
注:本人在找工作,地點(diǎn)在北京。
百度地圖SDK開發(fā)(三)檢索功能
目前百度地圖SDK所集成的檢索服務(wù)包括:POI檢索、公交信息查詢、線路規(guī)劃、地理編碼、行政區(qū)邊界數(shù)據(jù)檢索、在線建議查詢、短串分享(包括POI搜索結(jié)果分享、駕車/公交/騎行/步行路線規(guī)劃分享、反向地理編碼結(jié)果分享)。 本文將簡單的介紹下POI檢索,路線查詢,地理編碼。
POI檢索
POI(Point of Interest),中文可以翻譯為“興趣點(diǎn)”。在地理信息系統(tǒng)中,一個(gè)POI可以是一棟房子、一個(gè)商鋪、一個(gè)郵筒、一個(gè)公交站等。
百度地圖SDK提供三種類型的POI檢索:周邊檢索、區(qū)域檢索和城市內(nèi)檢索。
接下來就是代碼時(shí)刻,通過不同的代碼來展示下三種不同的搜索,其實(shí)也就是范圍不同,其他的都差不多。還記得上一篇中說過的百度地圖中的基本模式嗎?創(chuàng)建對象, 創(chuàng)建監(jiān)聽器,設(shè)置參數(shù)發(fā)起請求。在檢索的時(shí)候也是這個(gè)套路。
上面的代碼完全就是按照之前的邏輯去寫的,創(chuàng)建對象,設(shè)置監(jiān)聽器,設(shè)置參數(shù)。發(fā)起請求,采用的是附近檢索,用到的類分別有 PoiSearch POi檢索對象,OnGetPoiSearchResultListener檢索的監(jiān)聽對象,根據(jù)檢索方式的不同采用不用的檢索參數(shù)對象。
經(jīng)常用的就是City,Bound,Nearby三種檢索方式,其他的我也不熟悉。配置好參數(shù)之后就可以發(fā)起一次檢索,并且發(fā)起的形式要與檢索參數(shù)相對應(yīng)。之后就可以就監(jiān)聽器中對檢索的結(jié)果進(jìn)行處理了。
檢索監(jiān)聽器的回調(diào)函數(shù)有兩個(gè),分別是普通回調(diào)和深度回調(diào),以普通回調(diào)為例,先進(jìn)行檢索結(jié)果的判斷,之后對結(jié)果中的信息進(jìn)行處理,查出每一個(gè)POi的PoiInfo對象,之后我做的就是把info中的一些信息封裝到了Marker的bundle對象中,好在之后使用。marker對象的獲得是通過baidumap的addoverlay方法的返回值強(qiáng)轉(zhuǎn)獲取到的。接下來看看對于查詢到的信息的使用。
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的點(diǎn)擊事件,創(chuàng)建一個(gè)布局放置三個(gè)文本用來顯示信息,之后在監(jiān)聽事件中取出之前放在marker對象中的bundle對象,將其中的內(nèi)容顯示在文本中,最后創(chuàng)建一個(gè)infowindow顯示在地圖上。看效果。
布局寫的有點(diǎn)Low,各位就將就看吧,不過功能是實(shí)現(xiàn)了,對于POI檢索就這多,還有就是建議大家以后寫的時(shí)候別像我上面那樣寫,很浪費(fèi)資源的,可以把搜索對象和監(jiān)聽回調(diào)都拿出去,在onClick方法中只對檢索參數(shù)進(jìn)行設(shè)置,發(fā)起檢索就可以。城市檢索和范圍檢索就是在檢索參數(shù)上有所不同,其他的都一樣,最后別忘了執(zhí)行search.destroy(),釋放資源。
線路規(guī)劃
在最新的V3.7.0中支持四種線路分別是,公交,駕車,步行,騎行四種。四種方式的規(guī)劃模式是一樣的,上代碼。
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 步行回調(diào)}@Overridepublic void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {//TODO 公交回調(diào)Log.d("TAG","result_biking:"+transitRouteResult.error);if (transitRouteResult==null || transitRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {Toast.makeText(MainActivity.this, "抱歉,未找到結(jié)果", Toast.LENGTH_SHORT).show();return ;}if (transitRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {//起終點(diǎn)或途經(jīng)點(diǎn)地址有岐義,通過以下接口獲取建議查詢信息//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 駕車回調(diào)Log.d("TAG","result_biking:"+drivingRouteResult.error);if (drivingRouteResult == null || drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR) {Toast.makeText(MainActivity.this, "抱歉,未找到結(jié)果", Toast.LENGTH_SHORT).show();return ;}if (drivingRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {//起終點(diǎn)或途經(jīng)點(diǎn)地址有岐義,通過以下接口獲取建議查詢信息//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, "抱歉,未找到結(jié)果", Toast.LENGTH_SHORT).show();return ;}if (bikingRouteResult.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {//起終點(diǎn)或途經(jīng)點(diǎn)地址有岐義,通過以下接口獲取建議查詢信息//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);}上面的代碼同樣也是根據(jù)之前說過的模板去寫的。創(chuàng)建一個(gè)查詢對象RoutePlanSearch,設(shè)置監(jiān)聽器setOnGetRoutePlanResultListener,設(shè)置查詢參數(shù)BikingRoutePlanOption,發(fā)起查詢search.bikingSearch(options)。百度地圖中都是這么處理的。接下來仔細(xì)看下代碼。原諒我的懶惰,我都寫onClick方法里了。比較值得注意的就是在監(jiān)聽器的回調(diào)中有四個(gè)方法,分別對應(yīng)著四種規(guī)劃。同樣的查詢方法也有四種。參數(shù)的配置也有四種。在回調(diào)函數(shù)中可能會有人注意到BikingRouteOverlay類似的這種類,對應(yīng)著騎車覆蓋物,駕車覆蓋物等,就是在地圖上的顯示,這些類在百度地圖的類參考中是沒有的。而且下載下來的SDK中也沒有,最開始還以為得自己根據(jù)查詢回來的路線,之后經(jīng)過計(jì)算用之前說過的基本的覆蓋物去寫,后來在官方的demo中發(fā)現(xiàn)了這個(gè)東西。
,有興趣的可以去下個(gè)demo去看看,專門有個(gè)overlayUtils包里面放著已經(jīng)寫好的關(guān)于路線的覆蓋物。真是的。百度地圖也不告訴一聲。而且官方的類參考也查不到,有點(diǎn)不負(fù)責(zé)任啊。
上面的代碼并不難。如果你已經(jīng)了解了百度地圖的這種創(chuàng)建模式就很好理解了。上效果。(效果里面顯示的是騎行的路線)。
關(guān)于這個(gè)搜索的地址,可以看到我在搜索東單到西單的時(shí)候提示地址是無效的,百度對于路線規(guī)劃的站點(diǎn)是不支持模糊查詢的,必須是準(zhǔn)確的。
還有一點(diǎn)就是我一共進(jìn)行了兩次搜索,在進(jìn)行第二次搜索之后之前的搜索路線沒有被清除,這點(diǎn)也很好解決。調(diào)用這個(gè)方法就可以 overlay.removeFromMap();
如果想要更改路線覆蓋物的樣式,可以直接重寫overlay的兩個(gè)方法,能夠設(shè)置起點(diǎn)和終點(diǎn)坐標(biāo),如果想把路線改了,可以改BikingRouteOverlay中的代碼,可以實(shí)現(xiàn)各種樣式。
公交,駕車,步行的程序類似,就不多介紹了。
地理編碼
地理編碼指的是將地址信息建立空間坐標(biāo)關(guān)系的過程。有可分為正向地圖編碼和反向地圖編碼。使用的方式也很簡單,跟之前的方式也是相同的,創(chuàng)建對象, 設(shè)置監(jiān)聽器,設(shè)置參數(shù)發(fā)起請求就可以。上代碼。。
//創(chuàng)建百度地圖的地理編碼查詢對象GeoCoder coder=GeoCoder.newInstance();//設(shè)置監(jiān)聽器coder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {@Overridepublic void onGetGeoCodeResult(GeoCodeResult result) {//地理位置查經(jīng)緯度Log.d("tag", "error_code: "+result.error);if(result==null||result.error!= SearchResult.ERRORNO.NO_ERROR){Toast.makeText(GeocodeActivity.this, "該點(diǎn)在地球上不存在",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) {//經(jīng)緯度查地址}});GeoCodeOption options=new GeoCodeOption().city("北京").address(ed_location.getText().toString());//設(shè)置查詢參數(shù)。發(fā)起查詢coder.geocode(options);//坐標(biāo)系查地理位置 // coder.reverseGeoCode();}可以看到邏輯都是一樣的,不同的就是地理編碼查詢類GeoCoder,看一下官方的文檔。
,可以看到就這么幾個(gè)方法,使用也很容易。
監(jiān)聽器的回調(diào)有兩個(gè)方法,發(fā)起請求有兩種,參數(shù)設(shè)置有兩個(gè)輔助類。就這么多就能實(shí)現(xiàn)從地理位置到坐標(biāo)和坐標(biāo)到地理位置。
可以看到在效果圖中輸入地理位置信息就能在地圖上標(biāo)記出來,至于坐標(biāo)轉(zhuǎn)到地理位置就是調(diào)用另一個(gè)方法就可以。
總結(jié)
關(guān)于百度地圖的開發(fā)就準(zhǔn)備寫這么多了。不再繼續(xù)往下寫了,因?yàn)閷懸黄┛蛯τ谖襾碚f通常需要一天到兩天的時(shí)間去了解,查資料,自己先寫一遍再整理成一篇博客,對于百度地圖,通過我的這三篇博客應(yīng)該就可能夠說實(shí)現(xiàn)基本的使用了,日常功能完全可以滿足,更多的內(nèi)容我也不怎么會 。那就這樣吧。。
注:本人在找工作,地點(diǎn)在北京。
總結(jié)
以上是生活随笔為你收集整理的百度地图开发-检索功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: snap国内加速
- 下一篇: ISO9001质量管理体系认证流程