Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android--百度地圖之基礎地圖(三)

Android--百度地圖之基礎地圖(三)

編輯:關於Android編程

開發者可利用SDK提供的接口,使用百度為您提供的基礎地圖數據。目前百度地圖SDK所提供的地圖等級為3-21級,所包含的信息有建築物、道路、河流、學校、公園等內容。

V3.7.0起,地圖支持縮放至21級,暫不支持衛星圖、熱力圖、交通路況圖層的21級顯示,打開以上類型圖層,地圖會自動縮放到20級。

所有疊加或覆蓋到地圖的內容,我們統稱為地圖覆蓋物。如標注、矢量圖形元素(包括:折線、多邊形和圓等)、定位圖標等。覆蓋物擁有自己的地理坐標,當您拖動或縮放地圖時,它們會相應的移動。

百度地圖SDK為廣大開發者提供的基礎地圖和上面的各種覆蓋物元素,具有一定的層級壓蓋關系,具體如下(從下至上的順序):

1、基礎底圖(包括底圖、底圖道路、衛星圖等);

2、瓦片圖層(TileOverlay);

3、地形圖圖層(GroundOverlay);

4、熱力圖圖層(HeatMap);

5、實時路況圖圖層(BaiduMap.setTrafficEnabled(true););

6、百度城市熱力圖(BaiduMap.setBaiduHeatMapEnabled(true););

7、底圖標注(指的是底圖上面自帶的那些POI元素);

8、幾何圖形圖層(點、折線、弧線、圓、多邊形);

9、標注圖層(Marker),文字繪制圖層(Text);

10、指南針圖層(當地圖發生旋轉和視角變化時,默認出現在左上角的指南針);

11、定位圖層(BaiduMap.setMyLocationEnabled(true););

12、彈出窗圖層(InfoWindow);

13、自定義View(MapView.addView(View););

地圖類型

百度地圖Android SDK為您提供了3種類型的地圖資源(普通矢量地圖、衛星圖和空白地圖),開發者可以利用BaiduMap中的mapType()方法來設置地圖類型。核心代碼如下:


mMapView = (MapView) findViewById(R.id.bmapView);  
mBaiduMap = mMapView.getMap();  
 
//普通地圖  
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);  
 
//衛星地圖  
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);  
 
//空白地圖, 基礎地圖瓦片將不會被渲染。在地圖類型中設置為NONE,將不會使用流量下載基礎地圖瓦片圖層。使用場景:與瓦片圖層一起使用,節省流量,提升自定義瓦片圖下載速度。
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);

實時交通圖

當前,全國范圍內已支持多個城市實時路況查詢,且會陸續開通其他城市。

在地圖上打開實時路況的核心代碼如下:

mMapView = (MapView) findViewById(R.id.bmapView);  
mBaiduMap = mMapView.getMap();  
//開啟交通圖   
mBaiduMap.setTrafficEnabled(true);

百度城市熱力圖

百度地圖SDK繼為廣大開發者開放熱力圖本地繪制能力之後,再次進一步開放百度自有數據的城市熱力圖層,幫助開發者構建形式更加多樣的移動端應用。

百度城市熱力圖的性質及使用與實時交通圖類似,只需要簡單的接口調用,即可在地圖上展現樣式豐富的百度城市熱力圖。

在地圖上開啟百度城市熱力圖的核心代碼如下:

mMapView = (MapView) findViewById(R.id.bmapView);  
mBaiduMap = mMapView.getMap();  
//開啟交通圖   
mBaiduMap.setBaiduHeatMapEnabled(true);

地圖控制和手勢

地圖控制

地圖Logo

默認在左下角顯示,不可以移除。

通過mMapView.setLogoPosition(LogoPosition.logoPostionleftBottom);方法,使用枚舉類型控制顯示的位置,共支持6個顯示位置(左下,中下,右下,左上,中上,右上)。

地圖Logo不允許遮擋,可通過mBaiduMap.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);方法可以設置地圖邊界區域,來避免UI遮擋。

其中參數paddingLeft、paddingTop、paddingRight、paddingBottom參數表示距離屏幕邊框的左、上、右、下邊距的距離,單位為屏幕坐標的像素密度。

指南針

指南針默認為開啟狀態,可以關閉顯示 。

比例尺

比例尺默認為開啟狀態,可以關閉顯示。同時支持設置MaxZoomLevel和minZoomLevel,可通過mMapView.getMapLevel獲取當前地圖級別下比例尺所表示的距離大小。

地圖手勢

地圖平移

控制是否啟用或禁用平移的功能,默認開啟。如果啟用,則用戶可以平移地圖

地圖縮放

控制是否啟用或禁用縮放手勢,默認開啟。如果啟用,用戶可以雙指點擊或縮放地圖視圖。

地圖俯視(3D)

控制是否啟用或禁用俯視(3D)功能,默認開啟。如果啟用,則用戶可使用雙指 向下或向上滑動到俯視圖。

地圖旋轉

控制是否啟用或禁用地圖旋轉功能,默認開啟。如果啟用,則用戶可使用雙指 旋轉來旋轉地圖。

禁止所有手勢

控制是否一並禁止所有手勢,默認關閉。如果啟用,所有手勢都將被禁用。

標注覆蓋物

地圖標注

開發者可根據自己實際的業務需求,利用標注覆蓋物,在地圖指定的位置上添加標注信息。具體實現方法如下:

//定義Maker坐標點  
LatLng point = new LatLng(39.963175, 116.400244);  
//構建Marker圖標  
BitmapDescriptor bitmap = BitmapDescriptorFactory  
    .fromResource(R.drawable.icon_marka);  
//構建MarkerOption,用於在地圖上添加Marker  
OverlayOptions option = new MarkerOptions()  
    .position(point)  
    .icon(bitmap);  
//在地圖上添加Marker,並顯示  
mBaiduMap.addOverlay(option);
\

<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+1eu21NLRvq3M7bzT1Nq12M28yc+1xLHq16KjrL/JssnTw8jnz8K3vcq9vfjQ0MrWysbNz9eno7o8L3A+CjxwPrXa0ruyvaOsyejWw7/Jzc/Xp6O6PC9wPgo8cHJlIGNsYXNzPQ=="brush:java;">OverlayOptions options = new MarkerOptions() .position(llA) //設置marker的位置 .icon(bdA) //設置marker圖標 .zIndex(9) //設置marker所在層級 .draggable(true); //設置手勢拖拽 //將marker添加到地圖上 marker = (Marker) (mBaiduMap.addOverlay(options)); 第二步,設置監聽方法:

//調用BaiduMap對象的setOnMarkerDragListener方法設置marker拖拽的監聽
mBaiduMap.setOnMarkerDragListener(new OnMarkerDragListener() {
    public void onMarkerDrag(Marker marker) {
        //拖拽中
    }
    public void onMarkerDragEnd(Marker marker) {
        //拖拽結束
    }
    public void onMarkerDragStart(Marker marker) {
        //開始拖拽
    }
});

自v3.3.0版本起,SDK提供了給Marker增加動畫的能力,具體實現方法如下:

// 通過marker的icons設置一組圖片,再通過period設置多少幀刷新一次圖片資源
ArrayList giflist = new ArrayList();
giflist.add(bdA);
giflist.add(bdB);
giflist.add(bdC);
OverlayOptions ooD = new MarkerOptions().position(pt).icons(giflist)
				.zIndex(0).period(10);	
mMarkerD = (Marker) (mBaiduMap.addOverlay(ooD));

針對已添加在地圖上的標注覆蓋物,可利用如下方法進行修改和刪除操作:

marker.remove();   //調用Marker對象的remove方法實現指定marker的刪除

自v3.6.0版本起,SDK提供了給加載Marker增加動畫的能力,加載maker時包含兩種加載動畫方式:從地上生長和從天上落下。

以生長動畫為例,具體實現方法如下:

MarkerOptions ooD = new MarkerOptions().position(llD).icons(giflist)
                .zIndex(0).period(10);
 if (animationBox.isChecked()) {
     // 生長動畫
     ooD.animateType(MarkerAnimateType.grow);
 }
 Marker  mMarkerD = (Marker) (mBaiduMap.addOverlay(ooD));

自v3.6.0版本起,SDK提供了給Marker設置透明度的方法,具體實現方法如下:

MarkerOptions ooA = new MarkerOptions().position(llD).icons(giflist)
                .zIndex(0).period(10).alpha(0.5);
mBaiduMap.addOverlay(ooA);

具體源碼請在OverlayDemo中查看。 

點聚合功能

自v3.6.0版本起,新增點聚合功能,可通過縮小地圖層級,將定義范圍內的多個標注點,聚合顯示成一個標注點,並在MarkerClusterDemo中開放源碼,方便開發者自行修改。

// 初始化點聚合管理類
ClusterManager mClusterManager = new ClusterManager<>(this, mBaiduMap);
// 向點聚合管理類中添加Marker實例
LatLng llA = new LatLng(39.963175, 116.400244);
List items = new ArrayList<>();
items.add(new MyItem(llA));
mClusterManager.addItems(items);

具體源碼請在MarkerClusterDemo中查看。

底圖標注

自v3.6.0版本起,SDK在BaiduMap提供了控制底圖標注的showMapPoi方法,默認顯示底圖標注。利用此屬性可得到僅顯示道路信息的地圖,方法如下:

// 將底圖標注設置為隱藏,方法如下:
mBaiduMap.showMapPoi(false)

運行後,底圖標注被隱藏,效果如圖:

\

幾何圖形覆蓋物

地圖SDK提供多種結合圖形覆蓋物,利用這些圖形,可幫助您構建更加豐富多彩的地圖應用。目前提供的幾何圖形有:點(Dot)、折線(Polyline)、弧線(Arc)、圓(Circle)、多邊形(Polygon)。

下面以多邊形為例,向大家介紹如何使用幾何圖形覆蓋物:

//定義多邊形的五個頂點  
LatLng pt1 = new LatLng(39.93923, 116.357428);  
LatLng pt2 = new LatLng(39.91923, 116.327428);  
LatLng pt3 = new LatLng(39.89923, 116.347428);  
LatLng pt4 = new LatLng(39.89923, 116.367428);  
LatLng pt5 = new LatLng(39.91923, 116.387428);  
List pts = new ArrayList();  
pts.add(pt1);  
pts.add(pt2);  
pts.add(pt3);  
pts.add(pt4);  
pts.add(pt5);  
//構建用戶繪制多邊形的Option對象  
OverlayOptions polygonOption = new PolygonOptions()  
    .points(pts)  
    .stroke(new Stroke(5, 0xAA00FF00))  
    .fillColor(0xAAFFFF00);  
//在地圖上添加多邊形Option,用於顯示  
mBaiduMap.addOverlay(polygonOption);

運行結果如下:

\

Android地圖SDK自v3.5.0版本起,新增了折線多段顏色繪制能力,實現的核心代碼如下:

//構造紋理資源
BitmapDescriptor custom1 = BitmapDescriptorFactory
				.fromResource(R.drawable.icon_road_red_arrow);
BitmapDescriptor custom2 = BitmapDescriptorFactory
				.fromResource(R.drawable.icon_road_green_arrow);
BitmapDescriptor custom3 = BitmapDescriptorFactory
				.fromResource(R.drawable.icon_road_blue_arrow);
// 定義點
LatLng pt1 = newLatLng(39.93923, 116.357428);
LatLng pt2 = newLatLng(39.91923, 116.327428);
LatLng pt3 = newLatLng(39.89923, 116.347428);
LatLng pt4 = newLatLng(39.89923, 116.367428);
LatLng pt5 = newLatLng(39.91923, 116.387428);
 
//構造紋理隊列
ListcustomList = newArrayList();
customList.add(custom1);
customList.add(custom2);
customList.add(custom3);
 
List points = newArrayList();
List index = newArrayList();
points.add(pt1);//點元素
index.add(0);//設置該點的紋理索引
points.add(pt2);//點元素
index.add(0);//設置該點的紋理索引
points.add(pt3);//點元素
index.add(1);//設置該點的紋理索引
points.add(pt4);//點元素
index.add(2);//設置該點的紋理索引
points.add(pt5);//點元素
//構造對象
OverlayOptionsooPolyline = newPolylineOptions().width(15).color(0xAAFF0000).points(points).customTextureList(customList).textureIndex(index);
//添加到地圖
mBaiduMap.addOverlay(ooPolyline);

效果圖如下:

\

自v3.6.0版本起,擴展了折線多段顏色繪制能力:增加支持分段紋理繪制、分段顏色繪制,實現的核心代碼如下:

構造PolylineOptions對象,添加折線分段顏色繪制覆蓋物,核心代碼如下:

// 構造折線點坐標
List points = new ArrayList();
points.add(new LatLng(39.965,116.404));
points.add(new LatLng(39.925,116.454));
points.add(new LatLng(39.955,116.494));
points.add(new LatLng(39.905,116.554));
points.add(new LatLng(39.965,116.604));
 
//構建分段顏色索引數組
List colors = new ArrayList<>();
colors.add(Integer.valueOf(Color.BLUE));
colors.add(Integer.valueOf(Color.RED));
colors.add(Integer.valueOf(Color.YELLOW));
colors.add(Integer.valueOf(Color.GREEN));
 
OverlayOptions ooPolyline = new PolylineOptions().width(10)
        .colorsValues(colors).points(points);
添加在地圖中
Polyline  mPolyline = (Polyline) mBaiduMap.addOverlay(ooPolyline);

檢索結果覆蓋物

針對檢索功能模塊(POI檢索、線路規劃等),地圖SDK還對外提供相應的覆蓋物來快速展示結果信息。這些方法都是開源的,開發者可根據自己的實際去求來做個性化的定制。

利用檢索結果覆蓋物展示POI搜索結果的方式如下:

第一步,構造自定義 PoiOverlay 類;

private class MyPoiOverlay extends PoiOverlay {  
    public MyPoiOverlay(BaiduMap baiduMap) {  
        super(baiduMap);  
    }  
    @Override  
    public boolean onPoiClick(int index) {  
        super.onPoiClick(index);  
        return true;  
    }  
}

第二步,在POI檢索回調接口中添加自定義的PoiOverlay;

public void onGetPoiResult(PoiResult result) {  
    if (result == null || result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {  
        return;  
    }  
    if (result.error == SearchResult.ERRORNO.NO_ERROR) {  
        mBaiduMap.clear();  
        //創建PoiOverlay  
        PoiOverlay overlay = new MyPoiOverlay(mBaiduMap);  
        //設置overlay可以處理標注點擊事件  
        mBaiduMap.setOnMarkerClickListener(overlay);  
        //設置PoiOverlay數據  
        overlay.setData(result);  
        //添加PoiOverlay到地圖中  
        overlay.addToMap();  
        overlay.zoomToSpan();  
        return;  
    }  
}

運行結果如下:

\

利用TransitRouteOverlay展示公交換乘結果:

//在公交線路規劃回調方法中添加TransitRouteOverlay用於展示換乘信息  
public void onGetTransitRouteResult(TransitRouteResult result) {  
    if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {  
        //未找到結果  
        return;  
    }  
    if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {  
        //起終點或途經點地址有岐義,通過以下接口獲取建議查詢信息  
        //result.getSuggestAddrInfo()  
        return;  
    }  
    if (result.error == SearchResult.ERRORNO.NO_ERROR) {  
        route = result.getRouteLines().get(0);  
        //創建公交路線規劃線路覆蓋物   
        TransitRouteOverlay overlay = new MyTransitRouteOverlay(mBaidumap);  
        //設置公交路線規劃數據     
        overlay.setData(route);  
        //將公交路線規劃覆蓋物添加到地圖中  
        overlay.addToMap();  
        overlay.zoomToSpan();  
   }  
}

運行結果如下:


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved