基礎地圖Android SDK


開發者可利用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);

basicmap1.png

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

第一步,設置可拖拽:

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

 
// 初始化點聚合管理類
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方法,默認顯示底圖標注。利用此屬性可得到僅顯示道路信息的地圖,方法如下:

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

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

nopoi.png

幾何圖形覆蓋物

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

運行結果如下:

basicmap2.png

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);   //構造紋理隊列 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);//點元素 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);

效果圖如下:

3_%E5%89%AF%E6%9C%AC.png

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

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

 
// 構造折線點坐標
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);

運行結果:

文字覆蓋物

文字,在地圖中也是一種覆蓋物,開發者可利用相關的接口,快速實現在地圖上書寫文字的需求。實現方式如下:

//定義文字所顯示的坐標點  
LatLng llText = new LatLng(39.86923, 116.397428); //構建文字Option對象,用於在地圖上添加文字 OverlayOptions textOption = new TextOptions() .bgColor(0xAAFFFF00) .fontSize(24) .fontColor(0xFFFF00FF) .text("百度地圖SDK") .rotate(-30) .position(llText); //在地圖上添加該文字對象並顯示 mBaiduMap.addOverlay(textOption);

運行結果如下:

basicmap3.png

彈出窗覆蓋物

彈出窗覆蓋物的實現方式如下,開發者可利用此接口,構建具有更強交互性的地圖頁面。

//創建InfoWindow展示的view  
Button button = new Button(getApplicationContext()); button.setBackgroundResource(R.drawable.popup); //定義用於顯示該InfoWindow的坐標點 LatLng pt = new LatLng(39.86923, 116.397428); //創建InfoWindow , 傳入 view, 地理坐標, y 軸偏移量 InfoWindow mInfoWindow = new InfoWindow(button, pt, -47); //顯示InfoWindow mBaiduMap.showInfoWindow(mInfoWindow);

下圖為點擊Marker彈出InfoWindow的示例圖,開發者只需將InfoWindow的顯示方法寫在Maker的點擊事件處理中即可實現該效果。

運行結果如下:

basicmap4.png

地形圖圖層

地形圖圖層(GroundOverlay),又可叫做圖片圖層,即開發者可在地圖的指定位置上添加圖片。該圖片可隨地圖的平移、縮放、旋轉等操作做相應的變換。該圖層是一種特殊的Overlay, 它位於底圖和底圖標注層之間(即該圖層不會遮擋地圖標注信息)。

在地圖中添加使用地形圖覆蓋物的方式如下:

//定義Ground的顯示地理范圍  
LatLng southwest = new LatLng(39.92235, 116.380338); LatLng northeast = new LatLng(39.947246, 116.414977); LatLngBounds bounds = new LatLngBounds.Builder() .include(northeast) .include(southwest) .build(); //定義Ground顯示的圖片 BitmapDescriptor bdGround = BitmapDescriptorFactory .fromResource(R.drawable.ground_overlay); //定義Ground覆蓋物選項 OverlayOptions ooGround = new GroundOverlayOptions() .positionFromBounds(bounds) .image(bdGround) .transparency(0.8f); //在地圖中添加Ground覆蓋物 mBaiduMap.addOverlay(ooGround);

運行結果如下:

basicmap5.png

熱力圖功能

熱力圖是用不同顏色的區塊疊加在地圖上描述人群分布、密度和變化趨勢的一個產品,百度地圖SDK將繪制熱力圖的能力為廣大開發者開放,幫助開發者利用自有數據,構建屬於自己的熱力圖,提供豐富的展示效果。

利用熱力圖功能構建自有數據熱力圖的方式如下:

第一步,設置顏色變化:

//設置漸變顏色值
int[] DEFAULT_GRADIENT_COLORS = {Color.rgb(102, 225, 0), Color.rgb(255, 0, 0) }; //設置漸變顏色起始值 float[] DEFAULT_GRADIENT_START_POINTS = { 0.2f, 1f }; //構造顏色漸變對象 Gradient gradient = new Gradient(DEFAULT_GRADIENT_COLORS, DEFAULT_GRADIENT_START_POINTS);

第二步,准備數據:

//以下數據為隨機生成地理位置點,開發者根據自己的實際業務,傳入自有位置數據即可
List<LatLng> randomList = new ArrayList<LatLng>(); Random r = new Random(); for (int i = 0; i < 500; i++) { // 116.220000,39.780000 116.570000,40.150000 int rlat = r.nextInt(370000); int rlng = r.nextInt(370000); int lat = 39780000 + rlat; int lng = 116220000 + rlng; LatLng ll = new LatLng(lat / 1E6, lng / 1E6); randomList.add(ll); }

第三步,添加、顯示熱力圖:

//在大量熱力圖數據情況下,build過程相對較慢,建議放在新建線程實現
HeatMap heatmap = new HeatMap.Builder() .data(randomList) .gradient(gradient) .build(); //在地圖上添加熱力圖 mBaiduMap.addHeatMap(heatmap);

第四步,刪除熱力圖:

heatmap.removeHeatMap();

檢索結果覆蓋物

針對檢索功能模塊(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; } }

運行結果如下:

basicmap6.png

利用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(); } }

運行結果如下:

basicmap7.png

OpenGL繪制功能

百度地圖SDK為廣大開發者開放了OpenGL繪制接口,幫助開發者在地圖上實現更靈活的樣式繪制,豐富地圖使用效果體驗。

下面將以在地圖上繪制折線為例,向大家介紹如何使用OpenGL繪制接口:

// 定義地圖繪制每一幀時 OpenGL 繪制的回調接口
OnMapDrawFrameCallback callback = new OnMapDrawFrameCallback() { public void onMapDrawFrame(GL10 gl, MapStatus drawingMapStatus) { if (mBaiduMap.getProjection() != null) { // 計算折線的 opengl 坐標 calPolylinePoint(drawingMapStatus); // 繪制折線 drawPolyline(gl, Color.argb(255, 255, 0, 0), vertexBuffer, 10, 3, drawingMapStatus); } } }   // 設置地圖繪制每一幀時的回調接口 mMapView = (MapView) findViewById(R.id.bmapView); mBaiduMap = mMapView.getMap(); mBaiduMap.setOnMapDrawFrameCallback(this);   // 計算折線 OpenGL 坐標 public void calPolylinePoint(MapStatus mspStatus) { PointF[] polyPoints = new PointF[latLngPolygon.size()]; vertexs = new float[3 * latLngPolygon.size()]; int i = 0; for (LatLng xy : latLngPolygon) { // 將地理坐標轉換成 openGL 坐標 polyPoints[i] = mBaiduMap.getProjection().toOpenGLLocation(xy, mspStatus); vertexs[i * 3] = polyPoints[i].x; vertexs[i * 3 + 1] = polyPoints[i].y; vertexs[i * 3 + 2] = 0.0f; i++; } for (int j = 0; j < vertexs.length; j++) { Log.d(LTAG, "vertexs[" + j + "]: " + vertexs[j]); } vertexBuffer = makeFloatBuffer(vertexs); }   //創建OpenGL繪制時的頂點Buffer private FloatBuffer makeFloatBuffer(float[] fs) { ByteBuffer bb = ByteBuffer.allocateDirect(fs.length * 4); bb.order(ByteOrder.nativeOrder()); FloatBuffer fb = bb.asFloatBuffer(); fb.put(fs); fb.position(0); return fb; }   // 繪制折線 private void drawPolyline(GL10 gl, int color, FloatBuffer lineVertexBuffer, float lineWidth, int pointSize, MapStatus drawingMapStatus) {   gl.glEnable(GL10.GL_BLEND); gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);   gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);   float colorA = Color.alpha(color) / 255f; float colorR = Color.red(color) / 255f; float colorG = Color.green(color) / 255f; float colorB = Color.blue(color) / 255f;   gl.glVertexPointer(3, GL10.GL_FLOAT, 0, lineVertexBuffer); gl.glColor4f(colorR, colorG, colorB, colorA); gl.glLineWidth(lineWidth); gl.glDrawArrays(GL10.GL_LINE_STRIP, 0, pointSize);   gl.glDisable(GL10.GL_BLEND); gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); }

結果如下圖所示:

opengl.png

TextureMapView渲染

地圖SDK為廣大開發者新增了TextureMapView類,實現地圖由TextureView渲染(使用前提:Android 4.0以上系統,並開啟強制GPU渲染),解決原MapView基於系統GLSurfaceView導致在TabHost和scrollView中等閃黑屏、白邊、壓蓋等問題,使用方法與原MapView類似。

代碼如下:

private TextureMapView mMapView; private BaiduMap mBaiduMap; mMapView = (TextureMapView) findViewById(R.id.mTexturemap); mBaiduMap = mMapView.getMap();

瓦片圖層

地圖SDK自v3.6.0起,新增瓦片圖層(tileOverlay), 該圖層支持開發者添加自有瓦片數據,包括本地加載和在線下載兩種方式。該圖層可隨地圖的平移、縮放、旋轉等操作做相應的變換,它僅位於底圖之上(即瓦片圖層將會遮擋底圖,不遮擋其他圖層),瓦片圖層的添加順序不會影響其他圖層(例如:POI搜索圖層、我的位置圖層等)的疊加關系,適用於開發者擁有某一區域的地圖,並希望使用此區域地圖覆蓋相應位置的百度地圖。


一、瓦片划分規則:

百度地圖SDK會根據不同的比例尺將地圖划分成若干個瓦片,並且以中心點經緯度(0,0)開始計算瓦片,當地圖顯示縮放級別增大時,每一個瓦片被划分成4 個瓦片。如:

地圖級別為0時,只有1張瓦片

地圖級別為1時,會分成 1 * 4 = 4 張瓦片

依次類推,

地圖級別為n時,總共划分的瓦片為:4的n次方

為了保證瓦片的顯示效果,第n級的瓦片顯示的地圖level范圍為[n - 0.5, n + 0.5)


二、瓦片圖層分為本地加載和在線下載兩種繪制方式。

1、本地加載方式,將圖片打包於應用內,適用於圖片較小且不需要頻繁變更,通過TileLayer可實現,下面舉例分步說明添加本地瓦片圖層的步驟:

 
  // 瓦片圖對象
TileOverlay tileOverlay; /** * 定義瓦片圖的離線Provider,並實現相關接口 * MAX_LEVEL、MIN_LEVEL 表示地圖顯示瓦片圖的最大、最小級別 * Tile 對象表示地圖每個x、y、z狀態下的瓦片對象 */ FileTileProvider tileProvider = new FileTileProvider() { @Override public Tile getTile(int x, int y, int z) { // 根據地圖某一狀態下x、y、z加載指定的瓦片圖 String filedir = "LocalTileImage/" + z + "/" + z + "_" + x + "_" + y + ".jpg"; Bitmap bm = getFromAssets(filedir); if (bm == null) { return null; } // 瓦片圖尺寸必須滿足256 * 256 offlineTile = new Tile(bm.getWidth(), bm.getHeight(), toRawData(bm)); bm.recycle(); return offlineTile; } @Override public int getMaxDisLevel() { return MAX_LEVEL; } @Override public int getMinDisLevel() { return MIN_LEVEL; } }; TileOverlayOptions options = new TileOverlayOptions(); // 構造顯示瓦片圖范圍,當前為世界范圍 LatLng northeast = new LatLng(80, 180); LatLng southwest = new LatLng(-80, -180); // 設置離線瓦片圖屬性option options.tileProvider(tileProvider) .setPositionFromBounds(new LatLngBounds.Builder().include(northeast).include(southwest).build()); // 通過option指定相關屬性,向地圖添加離線瓦片圖對象 tileOverlay = mBaiduMap.addTileLayer(options);

效果如圖:

android-tileioverlay-offline.PNG

2、 在線下載,將圖片存放於開發者提供的服務中,提供給SDK一個URL模板,通過URLTileLayer調用在線瓦片圖層的URL,下面舉例分步說明添加在線瓦片圖層的步驟:

 
// 瓦片圖對象
TileOverlay tileOverlay; final String urlString = mEditText.getText().toString(); /** * 定義瓦片圖的在線Provider,並實現相關接口 * MAX_LEVEL、MIN_LEVEL 表示地圖顯示瓦片圖的最大、最小級別 * urlString 表示在線瓦片圖的URL地址 */ TileProvider tileProvider = new UrlTileProvider() { @Override public int getMaxDisLevel() { return MAX_LEVEL; } @Override public int getMinDisLevel() { return MIN_LEVEL; } @Override public String getTileUrl() { return urlString; } }; TileOverlayOptions options = new TileOverlayOptions(); // 構造顯示瓦片圖范圍,當前為世界范圍 LatLng northeast = new LatLng(80, 180); LatLng southwest = new LatLng(-80, -180); // 通過option指定相關屬性,向地圖添加在線瓦片圖對象 tileOverlay = mBaiduMap.addTileLayer(options.tileProvider(tileProvider).setMaxTileTmp(TILE_TMP).setPositionFromBounds(new LatLngBounds.Builder().include(northeast).include(southwest).build()));

效果如下:

xianshangtupian.png

設置地圖區域邊界

v3.7.0起,新增setPadding方法,支持設置地圖區域邊界,在被定義邊距范圍內,對顯示和操作地圖,做了如下兩方面的定義。

(1)百度logo、比例尺、指南針、縮放控件等,可被控制在自定義的地圖區域邊界內。

(3)自適應MapStatus中心點坐標,由原屏幕中心點調整至設置的區域中心點。

當設計的UI與地圖部分重疊時,可以設置地圖的操作和顯示范圍,以防止UI遮擋和重疊。

給地圖設置邊界,需在OnMapLoadedCallback.onMapLoaded() 回調內設置才生效,設置方法如下:

// paddingLeft、 paddingTop、 paddingRight、 paddingBottom 
// 表示距離屏幕左、上、右、下邊距離,單位為屏幕坐標下的像素密度   mBaiduMap.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);

設置地圖顯示范圍

v3.7.0起新增了設置地圖顯示范圍,手機屏幕僅顯示設定的地圖范圍,當前不支持旋轉地圖的情況,請與"禁用旋轉手勢"配合使用。

使用場景:針對需要展示部分固定范圍的地圖,如希望設置僅顯示北京市區地圖,可使用此功能。

設置地圖顯示范圍,需在OnMapLoadedCallback.onMapLoaded()回調內設置才能生效。

設置方法如下:

mBaiduMap.setMapStatusLimits(new LatLngBounds.Builder().include(northeast).include(southwest).build());


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM