浏览器版本低!无法浏览完整内容,建议升级或更换浏览器。

Android 地图SDK

百度地图SDK是一套应用程序接口, 通过调用地图SDK接口,开发者可以轻松访问百度地图的服务和数据,构建功能丰富、交互性强的地图类应用程序。

本章节将对 自定义图片图层(图片覆盖物GroundOverlay)、自定义瓦片图层(TitleOverlay)、自定义热力图(Heatmap)等做详细说明。
自定义图片图层(图片覆盖物)

地形图图层(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);

运行结果如下:

pictureLayer1.png

自定义瓦片图层

地图SDK自v3.6.0起,新增瓦片图层(TileOverlay), 该图层支持开发者添加自有瓦片数据,包括本地加载和在线下载两种方式。该图层可随地图的平移、缩放、旋转等操作做相应的变换,它仅位于底图之上(即瓦片图层将会遮挡底图,不遮挡其他图层),瓦片图层的添加顺序不会影响其他图层(例如:POI搜索图层、我的位置图层等)的叠加关系,适用于开发者拥有某一区域的地图,并希望使用此区域地图覆盖相应位置的百度地图。

通过瓦片图层可对基础底层地图添加额外的特性,如:某个商场的室内信息、某个景区的详情等等。自定义图层类是MBKTileOverlay,它定义了能添加到基础底层地图的图片集合。

瓦片划分规则

百度地图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);

效果如图:

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

效果如下:

offline_TileLayer1.png

自定义热力图

热力图是用不同颜色的区块叠加在地图上描述人群分布、密度和变化趋势的一个产品,百度地图SDK将绘制热力图的能力为广大开发者开放,帮助开发者利用自有数据,构建属于自己的热力图,提供丰富的展示效果。

注意:此处的“热力图功能”不同于“百度城市热力图”。百度城市热力图通过简单的接口调用,开发者可展示百度数据的热力图层。而此处的热力图功能,需要开发者传入自己的位置数据(坐标),然后SDK会根据热力图绘制规则,为开发者做本地的热力图渲染绘制。

热力图生成的原理
大量自有坐标数据在地图打点,打点的越多,就会根据打点的密集程度,呈现热力图。

利用热力图功能构建自有数据热力图的方式如下:

1设置颜色变化:
//设置渐变颜色值
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);
2准备数据:
//以下数据为随机生成地理位置点,开发者根据自己的实际业务,传入自有位置数据即可
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);
}
3添加、显示热力图:
//在大量热力图数据情况下,build过程相对较慢,建议放在新建线程实现
HeatMap heatmap = new HeatMap.Builder()
    .data(randomList)
    .gradient(gradient)
    .build();

//在地图上添加热力图
mBaiduMap.addHeatMap(heatmap);
4删除热力图:
heatmap.removeHeatMap();

自有坐标数据在地图打点,打点的越多,就会根据打点的密集程度,呈现热力图。如拥有的数据是某一坐标上有一个数值(如密度值、趋势值),生成热力图时,可以理解为在某一坐标打点”密度值次“、”趋势值次“,地图即可呈现热力图。

但密度值、趋势值可能为小数,需要对数据做一下处理,比如整体密度值、趋势值扩大1000倍取整。 读取坐标数据时,某个坐标读取”1000倍密度值次“,那么坐标点的密度,就会通过热力呈现出来了。