百度地圖之一百度地圖搭建開發環境

初學者,這兩天照着老羅的百度地圖實踐了一下,小結一下,期待各學習者一塊兒交流!(事先聲明,全部代碼來自老羅視頻...)

地圖是經常使用的功能:

(1)基本搭建:
1.下載百度API,將其放在lib中,並添加path,申請Key,添加權限.
2.用bmapManager,MKSearch,mapView,搭建基本環境.代碼以下:

[代碼]java代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package chufan.mybaidumap;
 
import android.os.Bundle;
import android.widget.Toast;
 
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.MapActivity;
import com.baidu.mapapi.MapController;
import com.baidu.mapapi.MapView;
 
public class BaiduMapActivity extends MapActivity {
    private MapView mapView;
    private BMapManager bMapManager;//加載地圖引擎
    //百度地圖的key
    private String keyString="7F16C0415EB0C02A070F5EF58B905418EB5A82CE";
    //在百度地圖上添加一些控件,好比放大縮小
    private MapController mapController;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mapView=(MapView)findViewById(R.id.bmapView);
        bMapManager=newBMapManager(BaiduMapActivity.this);
        bMapManager.init(keyString,newMKGeneralListener() {
             
            public void onGetPermissionState(int arg0) {
                // TODO Auto-generated method stub
                if(arg0==300){
                    Toast.makeText(BaiduMapActivity.this,"輸入的Key有錯請覈實!!", 1).show();
                }
            }
             
            public void onGetNetworkState(int arg0) {
                // TODO Auto-generated method stub
                 
            }
        });
        initMapActivity(bMapManager);
        mapView.setBuiltInZoomControls(true);//表示能夠設置縮放功能
        mapController=mapView.getController();
        mapController.setZoom(12);
        //須要定義一個經續度:
         
    }
     
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        if(bMapManager!=null){
            bMapManager.destroy();
            bMapManager=null;
        }
    }
    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        if(bMapManager!=null){
            bMapManager.start();
        }
    }
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        if(bMapManager!=null){
            bMapManager.stop();
        }
    }
    @Override
    protected boolean isRouteDisplayed() {
        // TODO Auto-generated method stub
        returnfalse;
    }
}
(2)用文字方式顯示某個建築物:地圖裏全部顯示都由一層鋪在其表面的圖層來完成,即overlay,若是要由想特地標誌某地址,則須要本身先去"畫出"一個圖層.代碼以下:

[代碼]java代碼:

?
1
mapView.getOverlays().add(newMyOverlay()); //調用新建的圖層
?
1
2
3
4
5
6
7
8
9
10
11
12
13
public class MyOverlay extends Overlay{
 //構建在地圖上的一個點
      
     private GeoPoint geoPoint=newGeoPoint((int)(39.915*1E6),(int)(116.404*1E6));
     //聲明一上畫筆的工具
     private Paint paint=newPaint();
     public void draw(Canvas arg0, MapView arg1, boolean arg2) {
         // TODO Auto-generated method stub
         super.draw(arg0, arg1, arg2);
         Point point =mapView.getProjection().toPixels(geoPoint,null);
         arg0.drawText("*這裏天安門", point.x, point.y, paint);
     }
 }

(3)同時標示多個地點,一樣原理,只是此次用到的是圖層中的數組,ItemizedOverlay,還有點擊事件OnTap.

[代碼]java代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    public class MyOverlayItem extends ItemizedOverlay<OverlayItem>{
        private List<OverlayItem> list=newArrayList<OverlayItem>();
         
        private double mLat1=39.90923;//表示緯度
        private double mLon1=116.397428;//表示經度
 
        private double mLat2=39.90922;//表示緯度
        private double mLon2=116.311128;//表示經度
         
        private double mLat3=39.917723;//表示緯度
        private double mLon3=116.371128;//表示經度   
        public MyOverlayItem(Drawable drawable) {
            super(drawable);
            GeoPoint geoPoint1=newGeoPoint((int)(mLat1*1E6),(int)(mLon1*1E6));
            GeoPoint geoPoint2=newGeoPoint((int)(mLat2*1E6),(int)(mLon2*1E6));
            GeoPoint geoPoint3=newGeoPoint((int)(mLat3*1E6),(int)(mLon3*1E6));
            list.add(newOverlayItem(geoPoint1,"Point1","Point1"));
            list.add(newOverlayItem(geoPoint2,"Point2","Point2"));
            list.add(newOverlayItem(geoPoint3,"Point3","Point3"));
            populate();//須要調用地圖刷新功能
        }
@Override
protected boolean onTap(int i) {
    // TODO Auto-generated method stub
    Toast.makeText(BaiduMapActivity.this,list.get(i).getSnippet(), 1).show();
    returntrue;
}
        @Override
        protected OverlayItem createItem(int arg0) {
            // TODO Auto-generated method stub
            returnlist.get(arg0);
        }
 
        @Override
        public int size() {
            // TODO Auto-generated method stub
            returnlist.size();
        }
    }
(4)接着就是咱們本身用百度地圖的時候常常用到的,查找,路線,公交,人行等,這都是MKSearch完成.

[代碼]java代碼:

?
1
  mkSearch=newMKSearch();//生成對象
?
1
mkSearch.init(bMapManager,newMySearchListener());//MySearchListener重要,全部動做都由它回調
?
1
mkSearch.poiSearchNearBy("kfc",newGeoPoint((int)(39.915*1E6),(int)(116.404*1E6)),5000);
?
1
2
3
4
5
6
7
8
9
<span class="Apple-tab-span">           </span>if(result==null){
                return;//判斷是否回調
            }
            PoiOverlay poiOverlay=newPoiOverlay(BaiduMapActivity.this, mapView);//生成圖層
            poiOverlay.setData(result.getAllPoi());//給圖層畫上數據
            mapView.getOverlays().add(poiOverlay);//顯示圖層
            //刷新
            mapView.invalidate();
        }
根據範圍和檢索詞發起範圍檢索:poiSearchNearBy---->onGetPoiResult---->PoiOverlay
駕車路線搜索:drivingSearch---->onGetDrivingRouteResult---->RouteOverlay
標註行走路線搜索:walkingSearch---->onGetWalkingRouteResult--->RouteOverlay
公交換乘路線搜索:transitSearch---->onGetTransitRouteResult--->TransitOverlay   (能夠顯示多條路線,在老羅視頻教程第九課)
查詢某一路公交路線詳情搜索:poiSearchInCity--->onGetPoiResult---->mkSearch.busLineSearch----->RouteOverlay (這個稍微曲折了少量,由於要找bus路線要UID,而UID只經過"文字"-->"地圖信息"就須要poiSearch,PoiSearch的結果都在onGetPoiResult裏回調)

小結一下:PoiSearch是由"文字"---->地址或者路線
               其它即點到點,須要兩個MKPlanNode.

(5)老羅的第十節課,被坑了,一直在琢磨爲何會回調onGetPoiResult裏的代碼,壓根兒就沒有執行...代碼刪了也照樣獲得相同結果.也多是水平未夠,求解惑.
若是是沒調用到onGetPoiResult的話,就和前面的差很少:
詳細地址與GeoPoint的轉換:geocode/reverseGeocode--->onGetAddrResult--->ItemizedOverlay  而後將這個點的經緯格式化後顯示出來.
這樣問題又來了,若是隻是輸入地址而後給出Geopoint的點,poiSearch也一樣能夠作到,爲何要畫蛇添足用geocode?
觀察下兩個函數所獲得的數據:

poiSearch:(MKPoiInfo) java

geocode:(MKAddrInfo) android

 
geocode只有一個點的數據,poiSearch是一組數據.因此暫時結論爲:geocode屬於精確地址與點的轉換,poiSearch屬於模糊尋找,有一大堆結果.
 
總結:
1.運行問題,若是懷疑是標點,能夠看warn告警.
2.animateTo  看不到效果??刪掉同樣效果
3.super(boundCenterBottom(mark));
drawable.setBounds()
這兩句什麼做用,求回答.
相關文章
相關標籤/搜索