cesium图层管理

3,588 阅读5分钟

本文目的

本文使用Cesium中Sandcastle (built version)中的示例演示如何使用Cesium进行图层管理。 效果图如下所示:

本文目录

0.前置环境

安装好node.js和http-server,能使用npm。

1.cesium部署与安装

1.去github下载cesium.cesium地址如下

github.com/CesiumGS/ce… 该地址执行以下3中的命令可以看到cesium中的Sandcastle中的所有示例,这些示例演示了如何使用cesium。

如果github下载过慢,使用如下链接对cesium中github地址进行加速下载toolwa.com/github/

2.vscode打开cesium

3.执行如下命令

npm install

安装cesium中所有依赖包

npm run build

在Sources文件夹下生成cesium.js索引所有cesium的源代码

npm run release

npm run release命令则相当于combine、minifyRelease、generateDocumentation三个命令的集合。他会同时做了三件事:1. 在Build/CesiumUnminified目录下生成调试版的Cesium.js文件; 2. 在Build/Cesium目录下生成压缩优化好的(生产环境下)的Cesium.js文件; 3. 并且还生成了Cesium的api文档,文档放在Build/Documentation目录下。

npm start

启动后可以查看cesium中自带的示例Sandcastle,里面有很多示例可以学习

2.cesium中添加自己的图层和数据

使用vscode新建html文件: 图层管理.html 文件结构如下,只需关注画红框的部分,其中scripts文件夹中内容是将npm run release命令生成的Build文件夹中的Cesium文件夹复制过去即可。

图层管理.html文件中的代码如下:

<!DOCTYPE html>
<html lang = "en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Cesium App</title>
        <script src="./scripts/Cesium/Cesium.js"></script>
        <link rel="stylesheet" href="./scripts/Cesium/Widgets/widgets.css">
        <style>
            @import url(./templates/bucket.css);
      
            #toolbar {
              background: rgba(42, 42, 42, 0.8);
              padding: 4px;
              border-radius: 4px;
            }
      
            #toolbar input {
              vertical-align: middle;
              padding-top: 2px;
              padding-bottom: 2px;
            }
      
            #toolbar table tr {
              transform: translateY(0);
              transition: transform 0.4s ease-out;
            }
      
            #toolbar table tr.up {
              transform: translateY(33px);
              transition: none;
            }
      
            #toolbar table tr.down {
              transform: translateY(-33px);
              transition: none;
            }
          </style>
          <div id="cesiumContainer" class="fullSize"></div>
          <div id="loadingOverlay"><h1>Loading...</h1></div>
          <div id="toolbar">
            <table>
              <tbody data-bind="foreach: layers">
                <tr data-bind="css: { up: $parent.upLayer === $data, down: $parent.downLayer === $data }">
                  <td><input type="checkbox" data-bind="checked: show"></td>
                  <td>
                    <span data-bind="text: name, visible: !$parent.isSelectableLayer($data)"></span>
                    <select data-bind="visible: $parent.isSelectableLayer($data), options: $parent.baseLayers, optionsText: 'name', value: $parent.selectedLayer"></select>
                  </td>
                  <td>
                    <input type="range" min="0" max="1" step="0.01" data-bind="value: alpha, valueUpdate: 'input'">
                  </td>
                  <td>
                    <button type="button" class="cesium-button" data-bind="click: function() { $parent.raise($data, $index()); }, visible: $parent.canRaise($index())"></button>
                  </td>
                  <td>
                    <button type="button" class="cesium-button" data-bind="click: function() { $parent.lower($data, $index()); }, visible: $parent.canLower($index())"></button>
                  </td>
                </tr>
              </tbody>
            </table>
          </div>
    </head>
    <body>
    <script>
        //天地图影像服务,必须添加自己的key
        var tdtImagerLayerProvider = new Cesium.WebMapTileServiceImageryProvider({
                url: "http://t0.tianditu.com/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=fb788337399e78058af0869a899ba0f8",
                layer: "tdtBasicLayer",
                style: "default",
                format: "image/jpeg",
                tileMatrixSetID: "GoogleMapsCompatible",
                show: false
            });
        //天地图注记服务,必须添加自己的key
        var tdtNoteLayerProvider = new Cesium.WebMapTileServiceImageryProvider({
            url:"http://t0.tianditu.com/cia_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cia&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default.jpg&tk=fb788337399e78058af0869a899ba0f8",
            layer:"tiandituImgMarker",
            style:"default",
            format:"image/jpeg",
            tileMatrixSetID:"tiandituImgMarker",
            show:true,
            maximumLevel:16
        });
        //自定义影像
        var myImage=new Cesium.WebMapServiceImageryProvider({            	
            url:'http://10.2.x.x:8080/geoserver/SuqianImage/wms?',  
            layers:'SuqianImage:suqian16',
            parameters:{
                service:'WMS',
                format:'image/png',
                transparent:true,
            },
        });


        Cesium.Ion.defaultAccessToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI2ZDBiN2JhNy1hNjcxLTRkYzUtYmI3Yy03NjE2NzNhZTk4MzciLCJpZCI6MzMyNzQsImlhdCI6MTU5ODM1MTI5Mn0.2V7kvN34qfN3JgJvPfCKBqyPwa_tOmwMzJqGZsAxM8s';
        var viewer = new Cesium.Viewer('cesiumContainer',{
            //imageryProvider: tdtImagerLayerProvider,
        });

        //隐藏版权信息
        viewer._cesiumWidget._creditContainer.style.display = "none";

        //begin视图viewer加载数据
        // //添加注记图层
        // var imageryLayers = viewer.imageryLayers;
        // var tdtNoteLayer = imageryLayers.addImageryProvider(tdtNoteLayerProvider);//添加注记图层
        // imageryLayers.raiseToTop(tdtNoteLayer);//将注记图层置顶
        // //imageryLayers.lowerToBottom(tdtNoteLayer);//将注记图层置底
        // imageryLayers.alpha= 0.3;//改变透明度
        // imageryLayers.brightness= 1.5;//改变亮度

        //end视图viewer加载数据


        //viewer.imageryLayers.get(0).show = false;//显示蓝色地球
        var promise = Cesium.GeoJsonDataSource.load('./vector/宿迁矢量路网_json/宿迁道路_FeaturesToJSON_网页转换.json');  //显示管线数据  直接加载json数据 比把json转化成czml在加载快很多
        promise.then(function (dataSource) {
            viewer.dataSources.add(dataSource);
            var entities = dataSource.entities.values;
            var colorHash = {};

            for (var o = 0; o < entities.length; o++) {
                var r = entities[o];
                r.nameID = o;   //给每条线添加一个编号,方便之后对线修改样式
                r.polyline.width = 10;  //添加默认样式
                (r.polyline.material = new Cesium.PolylineGlowMaterialProperty({
                    glowPower: .1, //一个数字属性,指定发光强度,占总线宽的百分比。
                    color: Cesium.Color.DARKCYAN.withAlpha(.9)
                }), 10)
            
            }
            var temp = new Array();
            window.Hightlightline = function (nameid) {
                var exists = temp.indexOf(nameid);
                if (exists <= -1) {
                    Highlight(nameid,50, 50);
                    temp.push(nameid);  // 添加线nameID到数组,
                }
                else  //已经是高亮状态了 再次点击修改为原始状态
                {
                    Highlight(nameid,10, 10);
                    temp.splice(exists, 1);  //删除对应的nameID
                }
            }
            window.Highlight = function (nameid,width1, width2) {
                for (var o = 0; o < entities.length; o++) {
                    var m = entities[o];
                    if (nameid == o) {
                        m.polyline.width = width1;
                        //m.polyline.width = 10;
                        (m.polyline.material = new Cesium.PolylineGlowMaterialProperty({
                            glowPower: .1, //一个数字属性,指定发光强度,占总线宽的百分比。
                            color: Cesium.Color.DARKCYAN.withAlpha(.9)
                        }), width2)
                    }
                }
            }
        });
        //viewer.flyTo(promise);
        viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) {
            var pickedFeature = viewer.scene.pick(movement.position);
            if (typeof (pickedFeature) != "undefined")   //鼠标是否点到线上
            {
                var name_id = pickedFeature.id.nameID;  //获取每条线的nameID
                Hightlightline(name_id);
            }
        }, Cesium.ScreenSpaceEventType.LEFT_CLICK);


    //begin图层
    // var viewer = new Cesium.Viewer("cesiumContainer", {
    // baseLayerPicker: false,
    // });
    var imageryLayers = viewer.imageryLayers;

    var viewModel = {
    layers: [],
    baseLayers: [],
    upLayer: null,
    downLayer: null,
    selectedLayer: null,
    isSelectableLayer: function (layer) {
        return this.baseLayers.indexOf(layer) >= 0;
    },
    raise: function (layer, index) {
        imageryLayers.raise(layer);
        viewModel.upLayer = layer;
        viewModel.downLayer = viewModel.layers[Math.max(0, index - 1)];
        updateLayerList();
        window.setTimeout(function () {
        viewModel.upLayer = viewModel.downLayer = null;
        }, 10);
    },
    lower: function (layer, index) {
        imageryLayers.lower(layer);
        viewModel.upLayer =
        viewModel.layers[
            Math.min(viewModel.layers.length - 1, index + 1)
        ];
        viewModel.downLayer = layer;
        updateLayerList();
        window.setTimeout(function () {
        viewModel.upLayer = viewModel.downLayer = null;
        }, 10);
    },
    canRaise: function (layerIndex) {
        return layerIndex > 0;
    },
    canLower: function (layerIndex) {
        return layerIndex >= 0 && layerIndex < imageryLayers.length - 1;
    },
    };
    var baseLayers = viewModel.baseLayers;

    Cesium.knockout.track(viewModel);

    function setupLayers() {
    // Create all the base layers that this example will support.
    // These base layers aren't really special.  It's possible to have multiple of them
    // enabled at once, just like the other layers, but it doesn't make much sense because
    // all of these layers cover the entire globe and are opaque.
    addBaseLayerOption("Bing Maps Aerial", undefined); // the current base layer
    addBaseLayerOption(
        "Bing Maps Road",
        Cesium.createWorldImagery({
        style: Cesium.IonWorldImageryStyle.ROAD,
        })
    );
    addBaseLayerOption(
        "ArcGIS World Street Maps",
        new Cesium.ArcGisMapServerImageryProvider({
        url:
            "https://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer",
        })
    );
    addBaseLayerOption(
        "OpenStreetMaps",
        new Cesium.OpenStreetMapImageryProvider()
    );
    addBaseLayerOption(
        "Stamen Maps",
        new Cesium.OpenStreetMapImageryProvider({
        url: "https://stamen-tiles.a.ssl.fastly.net/watercolor/",
        fileExtension: "jpg",
        credit:
            "Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under CC BY SA.",
        })
    );
    addBaseLayerOption(
        "Natural Earth II (local)",
        new Cesium.TileMapServiceImageryProvider({
        url: Cesium.buildModuleUrl("Assets/Textures/NaturalEarthII"),
        })
    );
    addBaseLayerOption(
        "USGS Shaded Relief (via WMTS)",
        new Cesium.WebMapTileServiceImageryProvider({
        url:
            "http://basemap.nationalmap.gov/arcgis/rest/services/USGSShadedReliefOnly/MapServer/WMTS",
        layer: "USGSShadedReliefOnly",
        style: "default",
        format: "image/jpeg",
        tileMatrixSetID: "default028mm",
        maximumLevel: 19,
        credit: "U. S. Geological Survey",
        })
    );

    // Create the additional layers
    addAdditionalLayerOption(
        "United States GOES Infrared",
        new Cesium.WebMapServiceImageryProvider({
        url:
            "https://mesonet.agron.iastate.edu/cgi-bin/wms/goes/conus_ir.cgi?",
        layers: "goes_conus_ir",
        credit: "Infrared data courtesy Iowa Environmental Mesonet",
        parameters: {
            transparent: "true",
            format: "image/png",
        },
        })
    );
    addAdditionalLayerOption(
        "United States Weather Radar",
        new Cesium.WebMapServiceImageryProvider({
        url:
            "https://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi?",
        layers: "nexrad-n0r",
        credit: "Radar data courtesy Iowa Environmental Mesonet",
        parameters: {
            transparent: "true",
            format: "image/png",
        },
        })
    );
    addAdditionalLayerOption(
        "TileMapService Image",
        new Cesium.TileMapServiceImageryProvider({
        url: "./images/cesium_maptiler/Cesium_Logo_Color",
        }),
        0.2
    );
    addAdditionalLayerOption(
        "Single Image",
        new Cesium.SingleTileImageryProvider({
        url: "./images/Cesium_Logo_overlay.png",
        rectangle: Cesium.Rectangle.fromDegrees(
            -115.0,
            38.0,
            -107,
            39.75
        ),
        }),
        1.0
    );
    addAdditionalLayerOption(
        "Grid",
        new Cesium.GridImageryProvider(),
        1.0,
        false
    );
    addAdditionalLayerOption(
        "Tile Coordinates",
        new Cesium.TileCoordinatesImageryProvider(),
        1.0,
        false
    );
    addAdditionalLayerOption(
        "天地图",
        new Cesium.WebMapTileServiceImageryProvider({
                url: "http://t0.tianditu.com/img_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=img&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default&format=tiles&tk=fb788337399e78058af0869a899ba0f8",
                layer: "tdtBasicLayer",
                style: "default",
                format: "image/jpeg",
                tileMatrixSetID: "GoogleMapsCompatible",
                show: false
            }),
        1.0,
        false
    );
    addAdditionalLayerOption(
        "天地图注记",
        new Cesium.WebMapTileServiceImageryProvider({
            url:"http://t0.tianditu.com/cia_w/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cia&tileMatrixSet=w&TileMatrix={TileMatrix}&TileRow={TileRow}&TileCol={TileCol}&style=default.jpg&tk=fb788337399e78058af0869a899ba0f8",
            layer:"tiandituImgMarker",
            style:"default",
            format:"image/jpeg",
            tileMatrixSetID:"tiandituImgMarker",
            show:true,
            maximumLevel:16
        }),
        1.0,
        false
    );
    }

    function addBaseLayerOption(name, imageryProvider) {
    var layer;
    if (typeof imageryProvider === "undefined") {
        layer = imageryLayers.get(0);
        viewModel.selectedLayer = layer;
    } else {
        layer = new Cesium.ImageryLayer(imageryProvider);
    }

    layer.name = name;
    baseLayers.push(layer);
    }

    function addAdditionalLayerOption(name, imageryProvider, alpha, show) {
    var layer = imageryLayers.addImageryProvider(imageryProvider);
    layer.alpha = Cesium.defaultValue(alpha, 0.5);
    layer.show = Cesium.defaultValue(show, true);
    layer.name = name;
    Cesium.knockout.track(layer, ["alpha", "show", "name"]);
    }

    function updateLayerList() {
    var numLayers = imageryLayers.length;
    viewModel.layers.splice(0, viewModel.layers.length);
    for (var i = numLayers - 1; i >= 0; --i) {
        viewModel.layers.push(imageryLayers.get(i));
    }
    }

    setupLayers();
    updateLayerList();

    //Bind the viewModel to the DOM elements of the UI that call for it.
    var toolbar = document.getElementById("toolbar");
    Cesium.knockout.applyBindings(viewModel, toolbar);

    Cesium.knockout
    .getObservable(viewModel, "selectedLayer")
    .subscribe(function (baseLayer) {
        // Handle changes to the drop-down base layer selector.
        var activeLayerIndex = 0;
        var numLayers = viewModel.layers.length;
        for (var i = 0; i < numLayers; ++i) {
        if (viewModel.isSelectableLayer(viewModel.layers[i])) {
            activeLayerIndex = i;
            break;
        }
        }
        var activeLayer = viewModel.layers[activeLayerIndex];
        var show = activeLayer.show;
        var alpha = activeLayer.alpha;
        imageryLayers.remove(activeLayer, false);
        imageryLayers.add(baseLayer, numLayers - activeLayerIndex - 1);
        baseLayer.show = show;
        baseLayer.alpha = alpha;
        updateLayerList();
    });

    //end图层
    </script>
    </body>>
</html>>