当前位置: 首页 > 文档资料 > Cesium 中文文档 >

Cesium 之图层管理器篇

优质
小牛编辑
173浏览
2023-12-01

本篇实现cesium图层管理器功能,效果图如下:

1.图层配置文件信息:

/*地图图层菜单目录构造*/
/*
 *name-图层名称
 *layerurl-图层服务配置
 *type代表地图服务类型:
 0代表ArcGisMapServerImageryProvider;
 1代表createOpenStreetMapImageryProvider;
 2代表WebMapTileServiceImageryProvider;
 3代表createTileMapServiceImageryProvider;
 4 代表UrlTemplateImageryProvider;
 5 代表WebMapServiceImageryProviderr(WMS);
 6 代表kml,kmz;
 7 代表geoJson;
 *layerid-图层id
 */
MapConfig.Layers = [
    { id: 1, pId: 0, name: "基础图层",checked:false },
    {
        id: 11,
        pId: 1,
        name: "海岛",//WMS-T
        layerurl: "http://gisserver:18081/geoserver/gwc/service/wms",
        layerid: "NAD_HD",
        IsWebMercatorTilingScheme:true,//是否创建摩卡托投影坐标系,默认是地理坐标系
        type: 5,
        checked: false
    },
    {
        id: 12,
        pId: 1,
        name: "地质钻孔",//WMS-T
        layerurl: "http://gisserver:18081/geoserver/gwc/service/wms",
        layerid: "NAD_ZDZK",
        IsWebMercatorTilingScheme:true,//是否创建摩卡托投影坐标系,默认是地理坐标系
        type: 5,
        checked: false
    },
    {
        id: 13,
        pId: 1,
        name: "渔业资源",//WMS-T
        layerurl: "http://gisserver:18081/geoserver/gwc/service/wms",
        layerid: "NAD_YYZY",
        IsWebMercatorTilingScheme:true,//是否创建摩卡托投影坐标系,默认是地理坐标系
        type: 5,
        checked: false
    },
    {
        id: 14,
        pId: 1,
        name: "海洋生态保护",//WMS-T
        layerurl: "http://gisserver:18081/geoserver/gwc/service/wms",
        layerid: "NAD_HYSTBH",
        IsWebMercatorTilingScheme:true,//是否创建摩卡托投影坐标系,默认是地理坐标系
        type: 5,
        checked: false
    },
    {
        id: 15,
        pId: 1,
        name: "岸线资源",//WMS-T
        layerurl: "http://gisserver:18081/geoserver/gwc/service/wms",
        layerid: "NAD_AXZY",
        IsWebMercatorTilingScheme:true,//是否创建摩卡托投影坐标系,默认是地理坐标系
        type: 5,
        checked: false
    },
    {
        id: 16,
        pId: 1,
        name: "海洋规划",//WMS-T
        layerurl: "http://gisserver:18081/geoserver/gwc/service/wms",
        layerid: "NAD_HYGH",
        IsWebMercatorTilingScheme:true,//是否创建摩卡托投影坐标系,默认是地理坐标系
        type: 5,
        checked: false
    },
    {
        id: 17,
        pId: 1,
        name: "行政区划",//WMS-T
        layerurl: "http://gisserver:18081/geoserver/gwc/service/wms",
        layerid: "NAD_XZQH",
        IsWebMercatorTilingScheme:true,//是否创建摩卡托投影坐标系,默认是地理坐标系
        type: 5,
        checked: false
    },
    /*{
        id: 13,
        pId: 1,
        name: "水东港路网",//WMS
        layerurl: "http://gisserver:18081/geoserver/DEGSRPT/wms",
        layerid: "GEO_MM_ROAD",
        IsWebMercatorTilingScheme:true,//是否创建摩卡托投影坐标系,默认是地理坐标系
        type: 5,
        checked: false
    },*/
    /*{ id: 2, pId: 0, name: "业务图层",checked:false },
    {
        id: "facilities.kml",
        pId: 2,
        name: "点-kml",//kml
        layerurl: GLOBAL.domainResource+"/systems/common-bx-gis/models/cesium/SampleData/kml/facilities/facilities.kml",
        type: 6,
        checked: false
    },*/
    /*{
        id: "gdpPerCapita2008.kmz",
        pId: 2,
        name: "kmz",//kmz
        layerurl: GLOBAL.domainResource+"/systems/common-bx-gis/models/cesium/SampleData/kml/gdpPerCapita2008.kmz",
        type: 6,
        checked: false
    },*/
    /*{
        id: "simplestyles.geojson",
        pId: 2,
        name: "geoJson",//geoJson
        //layerurl: GLOBAL.domainResource+"/systems/common-bx-gis/models/cesium/SampleData/simplestyles.geojson",
        layerurl: GLOBAL.domainResource+"/systems/common-bx-gis/models/cesium/SampleData/tf.geojson",
        type: 7,
        checked: false
    },*/
];

2.图层管理器核心代码:

//显示图层控制器
$("#cesium3DLayers").click(function(){
   cesium.show3DLayers(MapConfig.Layers);
});
   /**
     * 显示图层控制器
     * @method show3DLayers
     * @param  layersconfig 图层控制器数据源
     * @return
     */
    show3DLayers: function (layersconfig) {
        var cesium = this;
        if(!cesium.isLoad3DLayers){
            cesium.isLoad3DLayers = showLayersView();
        }
        //显示图层控制器
        function showLayersView(){
            cesium.layer3DList=[];
            this.treeObj = null;
            //加载图层目录树
            InitTree();
            return true;
        }
        //初始化图层目录树
        function InitTree(){
            var setting = {
                check: {
                    enable: true
                },
                data: {
                    simpleData: {
                        enable: true
                    }
                },
                callback: {
                    onCheck: function (e, treeId, treeNode) {
                        if (treeNode.checked) {//勾选状态下,显示地图控件
                            if (treeNode.children) { //勾选专题目录
                                for (var i = 0; i < treeNode.children.length; i++) {
                                    loadServerTypeMap(treeNode.children[i].id, treeNode.children[i].type, treeNode.children[i].layerurl, treeNode.children[i].layerid, treeNode.children[i].proxyUrl,treeNode.children[i].IsWebMercatorTilingScheme);
                                }
                            }
                            else {//勾选叶节点
                                loadServerTypeMap(treeNode.id, treeNode.type, treeNode.layerurl, treeNode.layerid, treeNode.proxyUrl,treeNode.IsWebMercatorTilingScheme);
                            }
                        }
                        else { //去掉勾选框,隐藏地图控件
                            if (treeNode.children) { //专题目录
                                for (var i = 0; i < treeNode.children.length; i++) {
                                    deleteServerTypeMap(treeNode.children[i].id);
                                }
                            }
                            else {//叶节点
                                deleteServerTypeMap(treeNode.id);
                            }
                        }
                    }
                }
            };
            var ztreeRoleAuth = $("#ztreeThemeServerOfLayer");
            var ztree = $.fn.zTree.init(ztreeRoleAuth, setting, layersconfig);
            this.treeObj = $.fn.zTree.getZTreeObj("ztreeThemeServerOfLayer");
            this.treeObj.expandAll(true);
            //加载已经勾选的图层
            var nodes = this.treeObj.getCheckedNodes(true);
            if(nodes.length>0){
                for(var i=0;i<nodes.length;i++){
                    if(!nodes[i].isParent){//节点图层
                        loadServerTypeMap(nodes[i].id, nodes[i].type, nodes[i].layerurl, nodes[i].layerid, nodes[i].proxyUrl,nodes[i].IsWebMercatorTilingScheme);
                    }
                }
            }
        }
        /**
         * 删除指定ID的图层
         */
        function deleteServerTypeMap(id){
            switch(typeof(id))
            {
                case "number":
                    if(cesium.layer3DList.length>0){
                        for(var i=0;i<cesium.layer3DList.length;i++){
                            if(cesium.layer3DList[i].id == id){
                                cesium.cesiumViewer.scene.imageryLayers.remove(cesium.layer3DList[i].layer);
                            }
                        }
                    }
                    break;
                case "string":
                    var len = cesium.cesiumViewer.dataSources.length;
                    if(len>0){
                        for(var i=0;i<len;i++){
                            var dataSource = cesium.cesiumViewer.dataSources.get(i);
                            if(dataSource._name && dataSource._name == id){
                                cesium.cesiumViewer.dataSources.remove(dataSource);
                            }
                        }
                    }
                    break;
                case "undefined":
                    break;
            }
        }
       /**
         * 加载不同类型地图服务的底图
         @ id 图层的id标识
         @ servertype 地图服务类型(0代表ArcGisMapServerImageryProvider;1代表createOpenStreetMapImageryProvider;
         2代表WebMapTileServiceImageryProvider;3代表createTileMapServiceImageryProvider;
         4 代表UrlTemplateImageryProvider;5 代表WebMapServiceImageryProviderr(WMS))
         @ url 地图服务的url
         @ layerid 地图图层的id
         @ proxyUrl 代理请求url
         @ tilingScheme 地图坐标系,WebMercatorTilingScheme(摩卡托投影坐标系3857);GeographicTilingScheme(世界地理坐标系4326)
         */
        function loadServerTypeMap(id, servertype, url, layerid, proxyUrl,IsWebMercatorTilingScheme){
            var layers = cesium.cesiumViewer.scene.imageryLayers;
            var layer = null;
            switch (servertype) {
                case 0://ArcGisMapServerImageryProvider
                    var curlayer = layers.addImageryProvider(new Cesium.ArcGisMapServerImageryProvider({
                        proxy : new Cesium.DefaultProxy(proxyUrl),
                        url : url,
                        layers:layerid,
                        enablePickFeatures : false
                    }));
                    layer = {layer:curlayer,id:id};
                    break;
                case 1://OpenStreetMapImageryProvider
                    var curlayer = layers.addImageryProvider(Cesium.createOpenStreetMapImageryProvider({
                        url : url
                    }));
                    layer = {layer:curlayer,id:id};
                    break;
                case 2://WebMapTileServiceImageryProvider
                    break;
                case 3://createTileMapServiceImageryProvider
                    break;
                case 4://UrlTemplateImageryProvider
                    break;
                case 5://WebMapServiceImageryProvider
                    var m_tilingScheme = new Cesium.GeographicTilingScheme();
                    if(IsWebMercatorTilingScheme){
                        m_tilingScheme = new Cesium.WebMercatorTilingScheme();
                    }
                    var curlayer = layers.addImageryProvider(new Cesium.WebMapServiceImageryProvider({
                        url: url,
                        layers: layerid,
                        //tilingScheme:tilingScheme,
                        tilingScheme:m_tilingScheme,
                        parameters : {
                            service:"WMS",
                            version:"1.1.1",
                            request:"GetMap",
                            transparent : true,
                            format : 'image/png'
                        },
                        show: false
                    }));
                    layer = {layer:curlayer,id:id};
                    break;
                case 6://kml,kmz
                    var options = {
                        camera : cesium.cesiumViewer.scene.camera,
                        canvas : cesium.cesiumViewer.scene.canvas
                    };
                    cesium.cesiumViewer.dataSources.add(Cesium.KmlDataSource.load(url, options)).then(function(dataSource){
                        cesium.cesiumViewer.camera.flyHome();
                    });
                    break;
                case 7://geoJson
                    /*var options = {
                        camera : cesium.cesiumViewer.scene.camera,
                        canvas : cesium.cesiumViewer.scene.canvas
                    };
                    cesium.cesiumViewer.dataSources.add(Cesium.KmlDataSource.load(url, options)).then(function(dataSource){
                        cesium.cesiumViewer.camera.flyHome();
                    });*/
                    /*var dataSource = Cesium.GeoJsonDataSource.load('../../../../Apps/SampleData/simplestyles.geojson');
                    viewer.dataSources.add(dataSource);
                    viewer.zoomTo(dataSource);*/
                    cesium.cesiumViewer.dataSources.add(Cesium.GeoJsonDataSource.load(url)).then(function(dataSource){
                        cesium.cesiumViewer.zoomTo(dataSource);
                    });
                    break;
                default://ArcGisMapServerImageryProvider
                    var curlayer = layers.addImageryProvider(new Cesium.ArcGisMapServerImageryProvider({
                        proxy : new Cesium.DefaultProxy(proxyUrl),
                        url : url,
                        layers:layerid,
                        enablePickFeatures : false
                    }));
                    layer = {layer:curlayer,id:id};
                    break;
            }
            if(layer)
                cesium.layer3DList.push(layer);
        }
    },