基礎地圖Android SDK

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

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

全部疊加或覆蓋到地圖的內容,咱們統稱爲地圖覆蓋物。如標註、矢量圖形元素(包括:折線、多邊形和圓等)、定位圖標等。覆蓋物擁有本身的地理座標,當您拖動或縮放地圖時,它們會相應的移動。android

百度地圖SDK爲廣大開發者提供的基礎地圖和上面的各類覆蓋物元素,具備必定的層級壓蓋關係,具體以下(從下至上的順序):數組

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

二、瓦片圖層(TileOverlay);ide

三、地形圖圖層(GroundOverlay);動畫

四、熱力圖圖層(HeatMap);ui

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

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

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

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

九、標註圖層(Marker),文字繪製圖層(Text);

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

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

十二、彈出窗圖層(InfoWindow);

1三、自定義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搜索圖層、個人位置圖層等)的疊加關係,適用於開發者擁有某一區域的地圖,並但願使用此區域地圖覆蓋相應位置的百度地圖。


1、瓦片劃分規則:

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

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

地圖級別爲1時,會分紅 1 * 4 = 4 張瓦片

依次類推,

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

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


2、瓦片圖層分爲本地加載和在線下載兩種繪製方式。

一、本地加載方式,將圖片打包於應用內,適用於圖片較小且不須要頻繁變動,經過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

二、 在線下載,將圖片存放於開發者提供的服務中,提供給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());
相關文章
相關標籤/搜索