天天看點

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--百度地圖之基礎地圖(三)

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);  

目前,全國範圍内已支援多個城市實時路況查詢,且會陸續開通其他城市。

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

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

//開啟交通圖     

mbaidumap.settrafficenabled(true);  

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

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

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

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

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)功能,預設開啟。如果啟用,則使用者可使用雙指 向下或向上滑動到俯視圖。

地圖旋轉

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

禁止所有手勢

控制是否一并禁止所有手勢,預設關閉。如果啟用,所有手勢都将被禁用。

開發者可根據自己實際的業務需求,利用标注覆寫物,在地圖指定的位置上添加标注資訊。具體實作方法如下:

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

針對已經添加在地圖上的标注,可采用如下方式進行手勢拖拽:

第一步,設定可拖拽:

第二步,設定監聽方法:

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

//調用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增加動畫的能力,具體實作方法如下:

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

// 通過marker的icons設定一組圖檔,再通過period設定多少幀重新整理一次圖檔資源  

arraylist<bitmapdescriptor> giflist = new arraylist<bitmapdescriptor>();  

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中開放源碼,友善開發者自行修改。

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

// 初始化點聚合管理類  

clustermanager mclustermanager = new clustermanager<>(this, mbaidumap);  

// 向點聚合管理類中添加marker執行個體  

latlng lla = new latlng(39.963175, 116.400244);  

list<myitem> items = new arraylist<>();  

items.add(new myitem(lla));  

mclustermanager.additems(items);  

具體源碼請在markerclusterdemo中檢視。

自v3.6.0版本起,sdk在baidumap提供了控制底圖示注的showmappoi方法,預設顯示底圖示注。利用此屬性可得到僅顯示道路資訊的地圖,方法如下:

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

// 将底圖示注設定為隐藏,方法如下:  

mbaidumap.showmappoi(false)  

運作後,底圖示注被隐藏,效果如圖:

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

地圖sdk提供多種結合圖形覆寫物,利用這些圖形,可幫助您建構更加豐富多彩的地圖應用。目前提供的幾何圖形有:點(dot)、折線(polyline)、弧線(arc)、圓(circle)、多邊形(polygon)。

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

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

//定義多邊形的五個頂點    

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<latlng> pts = new arraylist<latlng>();    

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--百度地圖之基礎地圖(三)

android地圖sdk自v3.5.0版本起,新增了折線多段顔色繪制能力,實作的核心代碼如下:

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

//構造紋理資源  

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);  

//構造紋理隊列  

list<bitmapdescriptor>customlist = newarraylist<bitmapdescriptor>();  

customlist.add(custom1);  

customlist.add(custom2);  

customlist.add(custom3);  

list<latlng> points = newarraylist<latlng>();  

list<integer> index = newarraylist<integer>();  

points.add(pt1);//點元素  

index.add(0);//設定該點的紋理索引  

points.add(pt2);//點元素  

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);  

效果圖如下:

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

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

構造polylineoptions對象,添加折線分段顔色繪制覆寫物,核心代碼如下:

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

// 構造折線點坐标  

list<latlng> points = new arraylist<latlng>();  

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<integer> 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 類;

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

private class mypoioverlay extends poioverlay {    

    public mypoioverlay(baidumap baidumap) {    

        super(baidumap);    

    }    

    @override    

    public boolean onpoiclick(int index) {    

        super.onpoiclick(index);    

        return true;    

}  

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

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

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();    

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

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

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

//在公交線路規劃回調方法中添加transitrouteoverlay用于展示換乘資訊    

public void ongettransitrouteresult(transitrouteresult result) {    

    if (result == null || result.error != searchresult.errorno.no_error) {    

        //未找到結果    

    if (result.error == searchresult.errorno.ambiguous_roure_addr) {    

        //起終點或途經點位址有岐義,通過以下接口擷取建議查詢資訊    

        //result.getsuggestaddrinfo()    

        route = result.getroutelines().get(0);    

        //建立公交路線規劃線路覆寫物     

        transitrouteoverlay overlay = new mytransitrouteoverlay(mbaidumap);    

        //設定公交路線規劃資料       

        overlay.setdata(route);    

        //将公交路線規劃覆寫物添加到地圖中    

   }    

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