Skip to content

在地图上绘制

Marker标记覆盖物

Marker标记覆盖物,可以用来标记地图上的点信息,包括但不限于:兴趣点、小车位置、乘客位置等。

添加Marker

代码如下:

java
    // 从assets中加载一张名为"arrow.png"的bitmap
    BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromAsset(this, "arrow.png");
    
    // 创建MarkerOptions,为添加的Marker赋予必要的属性。position表示其地理坐标
    markerOptions = new MarkerOptions().icon(bitmapDescriptor).position(new LatLng(40.0462780000,116.2858500000));
                
    // 通过DiMap创建Marker
    marker = diMap.addMarker(markerOptions);

Marker销毁

java
    // 调用remove()方法销毁marker
    marker.remove();

Marker动画

代码示例,该示例创建了一个透明度、旋转及缩放的组合动画,持续时间3秒钟:

java
        AnimationSet animationSet = new AnimationSet(true);
        // 添加透明度动画
        animationSet.addAnimation(new AlphaAnimation(0f, 1f));
        
        // 添加旋转动画
        animationSet.addAnimation(new RotateAnimation(0f, 180f, 0f, 0f, 0f));
        
        // 缩放动画
        animationSet.addAnimation(new ScaleAnimation(1f, 2f, 1f, 2f));
        
        // 设置持续时间
        animationSet.setDuration(3000);
        
        // 设置动画回调,会在开始和结束时通知调用方
        marker.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart() {
                Toast.makeText(MarkerActivity.this, "Animation start!", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onAnimationEnd() {
                Toast.makeText(MarkerActivity.this, "Animation end!", Toast.LENGTH_SHORT).show();
            }
        });
        
        // 开启动画
        marker.startAnimation(animationSet);

InfoWindow

InfoWindow是Marker上的一个气泡,可通过setSnippet、setTitle创建默认的InfoWindow,也可以自定义其样式,做更加丰富复杂的气泡。

代码示例:

java
    // 如下创建了一个带有InfoWindow的marker对象。其title和snippet设置了默认样式下的标题和文字片段,setInfoWindowEnable()开启InfoWindow
    MarkerOptions markerOptions = new MarkerOptions().icon(BitmapDescriptorFactory
        .defaultMarker())
        .position(DIAMOND_BUILDING)
        .title("标题")
        .snippet("文字片段")
        .setInfoWindowEnable(true);
        
    Marker markerWithInfoWindow = diMap.addMarker(markerOptions);
    
    // 显示InfoWindow
    markerWithInfoWindow.showInfoWindow();
    
    // 隐藏InfoWindow
    markerWithInfoWindow.hideInfoWindow();

InfoWindowAdapter

若希望自定义InfoWindow的样式,可使用DiMap.InfoWindowAdapter返回一个自定义View做更加灵活的定制显示:

java
marker.setInfoWindowAdapter(new DiMap.InfoWindowAdapter() {
    @Override
    public View getInfoWindow(Marker marker) {
        TextView t = new TextView(context);
        return t;
    }
});

// 调用showInfoWindow()更新
marker.showInfoWindow();

Polyline路线覆盖物

可以用来表示导航路线等。由一组经纬度来决定

java
    // 如下代码添加了一条带路况的路线
    Polyline line = diMap.addPolyline(
        (new PolylineOptions())
            .add(WULUMUQI, GUANGZHOU, DIGIT)
            .width(20).multiColorLineInfo(infos)
            .type(PolylineOptions.LineType.LINE_TYPE_MULTICOLOR));
            
    
    // 删除路线
    line.remove();

上述代码中添加了一条路线。另外需注意的是,如上述代码所示,Polyline有2种类型,需在添加时即指定,

  • 一种适合表达导航路线,type为PolylineOptions.LineType.LINE_TYPE_MULTICOLOR;
  • 另一种适合表达更抽象意义上的几何路线,此时PolylineOptions.LineType.LINE_TYPE_ARGB

其他更详尽的信息可参考API文档。

圆形及多边形覆盖物

上述2种覆盖物分别可以绘制球面圆形,以及更为广泛的任意多边形,适合实现一些地理围栏等相关的功能。(实际Circle本质也是Polygon的一种,只不过特意开放方便开发者调用)

二者的不同在于API定义不同,circle由地理圆心(经纬度),及半径(米)定义;多边形由不少于3个的地理位置点定义。

以下仅以Circle为例,Polygon的代码类似,不再赘述。

java
    // 定义了中心点、半径(1千米),边框颜色、填充色、及边框宽度
    CircleOptions options = new CircleOptions().center(new LatLng(40.0498582224,116.2865710258))
                .radius(1000).strokeColor(Color.BLACK)
                .fillColor(Color.argb(50, 1,1,1)).strokeWidth(20);
    circle = diMap.addCircle(options);

    // 删除覆盖物
    circle.remove();

HeatOverlay绘制热力图

如下代码展示了如何添加一个热力图。

java
    // step1 构造热力数据HeatDataNode,每个都包含了经纬度和热力值
    ArrayList<HeatDataNode> nodes=new ArrayList<>();

    nodes.add(new HeatDataNode(new LatLng(40.049072, 116.296159),1));
    nodes.add(new HeatDataNode(new LatLng(40.059072, 116.296159),1));
    nodes.add(new HeatDataNode(new LatLng(40.069072, 116.296159),1));
    nodes.add(new HeatDataNode(new LatLng(40.079072, 116.296159),2));
    nodes.add(new HeatDataNode(new LatLng(40.089072, 116.296159),2));
    nodes.add(new HeatDataNode(new LatLng(40.099072, 116.296159),2));
    nodes.add(new HeatDataNode(new LatLng(40.109072, 116.296159),3));
    nodes.add(new HeatDataNode(new LatLng(40.119072, 116.296159),3));
    nodes.add(new HeatDataNode(new LatLng(40.129072, 116.296159),3));
    nodes.add(new HeatDataNode(new LatLng(40.139072, 116.296159),4));
    nodes.add(new HeatDataNode(new LatLng(40.149072, 116.296159),4));

    // step2 添加热力图
    HeatOverlayOptions options = new HeatOverlayOptions().
                nodes(nodes).radius(100);
    HeatOverlay heatOverlay = diMap.addHeatOverlay(options);

    // step3 删除热力图
    heatOverlay.remove();