# 五、专题地图

# (一)专题与图层

专题是可综合显示多种地图要素的地图。通常可用于显示某种主题的地图。

地图要素:标记要素、路线要素、区域要素,统称地图要素。

在CoreSDK中,专题关联了多个图层,每个图层关联一个地图要素集。

地图要素集:标记集合、路线集合、区域集合,统称地图要素集。

因此,要配置好专题,得先要会配置图层。要显示专题数据,也需要知道如何获取图层关联的图层数据。

# (二)图层(Layer)

图层通常对应一种集合数据,并可自定义其在地图上的符号(或者说显示样式)。Layer类的常用属性表如下:

属性名 值类型 属性描述
name String 图层的名称
remark String 图层的备注信息
icon Icon 图层的图标
geometryType GeometryType 图层类型
layerSymobl PointSymbol / PolylineSymbol / PolygonSymbol 图层的地图符号

图层常用方法如下:

方法名 返回类型 方法描述
setName void 设置图层名称
setMapFeatureSet void 设置图层关联的地图要素集合
setLayerSymbol void 设置图层的地图符号

# 1、获取/查询图层

初始化成功后,可调用Cellsys的organization对象的queryLayer方法进行查询。具体代码示例如下:

Cellsys.organization.queryLayer(new CsCallback<QueryResult<Layer>>() {
    @Override
    public void onSuccess(QueryResult<Layer> object) {
        /*分页信息-查询方法特有*/
        PageInfo pageInfo = object.pageInfo;//查询接口特有的分页信息
        int totalCount = pageInfo.totalCount;//数据总数
        int totalPage = pageInfo.totalPage;//总页数
        int pageNo = pageInfo.pageNo;//当前页码(从1开始)
        int pageSize = pageInfo.pageSize;//每页查询数量(注意!不一定和当前查询的数据总量匹配)
             
        /*获取查询结果*/
        List<Layer> layers = object.data;
        if (layers != null && layers.size() > 0) {//查询结果可能为null
            Layer layer = layers.get(0);
            String name = layer.getName();//图层名称
            String remark = layer.getRemark();//图层备注
            GeometryType geometryType = layer.getGeometryType();
            /*图层样式
             * 根据地图要素集种类(标记、路线、区域)的不同,图层样式会是不同的MapSymbol子类。*/
            MapSymbol mapSymbol = layer.getLayerSymbol();
            if (mapSymbol instanceof PointSymbol) {
                PointSymbol pointSymbol = (PointSymbol) mapSymbol;
            } else if (mapSymbol instanceof PolylineSymbol) {
                PolylineSymbol polylineSymbol = (PolylineSymbol) mapSymbol;
            } else if (mapSymbol instanceof PolygonSymbol) {
                PolygonSymbol polygonSymbol = (PolygonSymbol) mapSymbol;
            }
        }
    }
             
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        /*失败*/
        int code = errorMessage.getCode();//错误码
        String errMsg = errorMessage.getMessage();//错误信息
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

# 2、新增图层

初始化成功后,可调用Cellsys的organization对象的createLayer方法进行查询。具体代码示例如下:

/*创建标记图层*/
PointSymbol pointSymbol = new PointSymbol(icon, new Color(Ribbon.GeekBlue, RibbonLevel.L2));//自定义图层样式传null,直接使用标记集合的默认样
Cellsys.organization.createLayer("图层名称", "图层描述", markerSet, pointSymbol, new CsCallback<Layer>() {
    @Override
    public void onSuccess(Layer object) {
        /*创建成功,object为创建成功的返回对象*/
        object.getName();
    }
         
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        /*失败*/
        int code = errorMessage.getCode();//错误码
        String errMsg = errorMessage.getMessage();//错误信息
    }
});
/*创建路线图层*/
int strokeWidth = 5;//边框宽度
Color strokeColor = new Color(Ribbon.Green, RibbonLevel.L8);
PolylineSymbol polylineSymbol = new PolylineSymbol(strokeWidth, strokeColor);//图层路线样式。传null则使用路线的默认样式
Cellsys.organization.createLayer("图层名称", "图层描述", lineSet, polylineSymbol, new CsCallback<Layer>() {
    @Override
    public void onSuccess(Layer object) {
        /*创建成功,object为创建成功的返回对象*/
        object.getName();
    }
         
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        /*失败*/
        int code = errorMessage.getCode();//错误码
        String errMsg = errorMessage.getMessage();//错误信息
    }
});
/*创建区域图层*/
Color _fillColor = new Color(Ribbon.Green, RibbonLevel.L4);//填充颜色
float _fillAlpha = 0.5f;
int _strokeWidth = 5;//边框宽度
Color _strokeColor = new Color(Ribbon.Green, RibbonLevel.L8);
float _strokeAlpha = 1f;
PolylineSymbol lineSymbol = new PolylineSymbol(strokeWidth, strokeColor);
PolygonSymbol polygonSymbol = new PolygonSymbol(_fillColor, _fillAlpha, lineSymbol, FillType.PureColor, 0);
Cellsys.organization.createLayer("图层名称", "图层描述", areaSet, polygonSymbol, new CsCallback<Layer>() {
    @Override
    public void onSuccess(Layer object) {
        /*创建成功,object为创建成功的返回对象*/
        object.getName();
    }
         
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        /*失败*/
        int code = errorMessage.getCode();//错误码
        String errMsg = errorMessage.getMessage();//错误信息
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

# 3、更新图层

初始化成功后,可调用Cellsys的organization对象的updateLayer方法进行查询。具体代码示例如下:

layer.setName("要修改的名称");
layer.setRemark("要修改的备注");
/*修改图层关联的集合数据,并使用集合默认的样式*/
layer.setMapFeatureSet(markerSet);
layer.setMapFeatureSet(lineSet);
layer.setMapFeatureSet(areaSet);
     
/*修改图层关联的集合数据,并自定义样式*/
boolean result = layer.setMapFeatureSet(markerSet, pointSymbol);
if (!result) {
    //修改失败。可能原因是,集合与样式的类型不匹配。标记集合需配对点符号,路线集合配对线符号,区域集合配对面符号。
}
boolean result2 = layer.setMapFeatureSet(lineSet, polylineSymbol);
boolean result3 = layer.setMapFeatureSet(areaSet, polygonSymbol);
/*仅修改图层的样式*/
boolean changeResult = layer.setLayerSymbol(pointSymbol);
if (!changeResult) {
    //修改失败。可能原因是,集合与样式的类型不匹配。标记集合需配对点符号,路线集合配对线符号,区域集合配对面符号。
}
Cellsys.organization.updateLayer(layer, new CsCallback() {
    @Override
    public void onSuccess(Object object) {
        //修改成功,相关属性已同步到layer对象中。
        String name = layer.getName();
    }
     
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        /*失败*/
        int code = errorMessage.getCode();//错误码
        String errMsg = errorMessage.getMessage();//错误信息
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

# 4、删除图层

初始化成功后,可调用Cellsys的organization对象的deleteLayer方法进行查询。具体代码示例如下:

Cellsys.organization.deleteLayer(layer, new CsCallback() {
    @Override
    public void onSuccess(Object object) {
        /*成功*/
    }
         
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        /*失败*/
        int code = errorMessage.getCode();//错误码
        String errMsg = errorMessage.getMessage();//错误信息
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13

# (三)专题(Map)

专题可关联多种图层数据,并指定图层在专题中的排序。排序越靠后的图层越容易被其他图层覆盖。专题类(Map)的常用属性如下:

属性名 值类型 属性描述
name String 专题地图名称
remark String 专题地图备注信息
icon Icon 专题地图图标
mapConifg MapConifg 专题地图配置信息

常用方法如下:

方法名 返回类型 方法描述
queryLayers void 查询专题关联的图层详情
associateLayer void 新增关联图层(单个)
cancelAssociateLayer void 取消关联图层(单个)
updateAssociatedLayers void 重设图层关联关系(可多个)
sortLayers void 图层排序

# 1、获取专题

初始化成功后,可通过Cellsys的organization对象获取。具体代码示例如下:

List<Map> maps = Cellsys.organization.getMaps();//可能为null
if (maps != null && maps.size() > 0) {
    Map map = maps.get(0);
    String name = map.getName();//获取专题名称
    String remark = map.getRemark();//获取专题备注
    Icon icon = map.getIcon();//获取专题图标
    MapConfig mapConfig = map.getMapConfig();//获取专题的地图配置
    MapPoint center = mapConfig.defaultCenter;//专题地图默认中心点
    int zoom = mapConfig.defaultZoom;//专题地图默认缩放级别
    //查询专题关联图层
    map.queryLayer(new CsCallback<QueryResult<Layer>>() {
        @Override
        public void onSuccess(QueryResult<Layer> object) {
            List<Layer> layers = object.data;
            if (layers != null) {
                //......
            }
        }
             
        @Override
        public void onFailure(ErrorMessage errorMessage) {
            /*失败*/
            int code = errorMessage.getCode();//错误码
            String errMsg = errorMessage.getMessage();//错误信息
        }
    });
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

# 2、新增专题

初始化成功后,可通过Cellsys的organization对象来新增专题。具体代码示例如下:

//地图配置类
MapPoint center = new MapPoint(23, 113);//专题地图默认中心点
int zoom = 16;//专题地图默认缩放级别
MapConfig mapConfig = new MapConfig(center, zoom);
Cellsys.organization.createMap("专题名称", "专题备注", icon, mapConfig, new CsCallback<Map>() {
    @Override
    public void onSuccess(Map object) {
        /*创建成功,回调是创建后的map对象*/
        String name = object.getName();//专题名称
        //...
    }
            
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        /*失败*/
        int code = errorMessage.getCode();//错误码
        String errMsg = errorMessage.getMessage();//错误信息
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 3、更新专题

初始化成功后,可通过Cellsys的organization对象来更新专题信息。具体代码示例如下:

MapPoint center = new MapPoint(23, 113);//专题地图默认中心点
int zoom = 16;//专题地图默认缩放级别
MapConfig mapConfig = new MapConfig(center, zoom);
map.setName("修改后名称");
map.setRemark("修改的备注");
map.setIcon(icon);//修改图标
map.setMapConfig(mapConfig);
Cellsys.organization.updateMap(map, new CsCallback() {
    @Override
    public void onSuccess(Object object) {
        /*修改成功*/
    }
        
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        /*失败*/
        int code = errorMessage.getCode();//错误码
        String errMsg = errorMessage.getMessage();//错误信息
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 4、删除专题

初始化成功后,可通过Cellsys的organization对象来删除专题。具体代码示例如下:

Cellsys.organization.deleteMap(map, new CsCallback() {
    @Override
    public void onSuccess(Object object) {
        /*删除成功*/
    }
         
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        /*失败*/
        int code = errorMessage.getCode();//错误码
        String errMsg = errorMessage.getMessage();//错误信息
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13

# 5、图层关联

Map对象提供了三种方法来设置与图层的关联关系。分别是关联单个图层、取消关联单个图层、重设所有图层的关联关系。具体代码示例如下:

/*新增一个关联图层*/
map.associateLayer(layer, new CsCallback() {
    @Override
    public void onSuccess(Object object) {
        /*成功*/
    }
          
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        /*失败*/
        int code = errorMessage.getCode();//错误码
        String errMsg = errorMessage.getMessage();//错误信息
    }
});
             
/*移除指定的关联图层*/
map.cancelAssociateLayer(layer, new CsCallback() {
    @Override
    public void onSuccess(Object object) {
        /*成功*/
    }
         
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        /*失败*/
        int code = errorMessage.getCode();//错误码
        String errMsg = errorMessage.getMessage();//错误信息
    }
});
     
/*重置关联的图层,清空之前的图层关联,重新设置新的图层关联关系*/
List<Layer> layers = new ArrayList<>();
layers.add(layer);
layers.add(layer2);
map.updateAssociatedLayers(layers, new CsCallback() {
    @Override
    public void onSuccess(Object object) {
        /*成功*/
    }
         
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        /*失败*/
        int code = errorMessage.getCode();//错误码
        String errMsg = errorMessage.getMessage();//错误信息
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

# 6、图层排序

通过Map对象的sortLayers方法来对图层进行排序。代码示例如下:

List<Layer> layers = new ArrayList<>();
layers.add(layer);//最早加入的图层处于最顶层,最后加入的图层处于最底层。
layers.add(layer2);
layers.add(layer3);
map.sortLayers(layers, new CsCallback() {
    @Override
    public void onSuccess(Object object) {
        /*成功*/
    }
         
    @Override
    public void onFailure(ErrorMessage errorMessage) {
        /*失败*/
        int code = errorMessage.getCode();//错误码
        String errMsg = errorMessage.getMessage();//错误信息
    }
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17