開發者可利用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個顯示位置(左下,中下,右下,左上,中上,右上)。
其中參數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);
針對已經添加在地圖上的標註,可採用以下方式進行手勢拖拽:
第一步,設置可拖拽:
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)
運行後,底圖標註被隱藏,效果如圖:
地圖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);
運行結果以下:
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);
效果圖以下:
自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);
運行結果以下:
彈出窗覆蓋物的實現方式以下,開發者可利用此接口,構建具備更強交互性的地圖頁面。
//建立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的點擊事件處理中便可實現該效果。
運行結果以下:
地形圖圖層(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);
運行結果以下:
熱力圖是用不一樣顏色的區塊疊加在地圖上描述人羣分佈、密度和變化趨勢的一個產品,百度地圖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; } }
運行結果以下:
利用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(); } }
運行結果以下:
百度地圖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.