Arcgis 图层划片

523 阅读2分钟

图层划片前置知识:

  • GraphicsLayer
  • Graphic
  • SketchViewModel

什么是 GraphicsLayer ?

A&Q:字面意思: 图形图层,用于在arcgis 中承载 矢量几何图形 (通俗来说我们可以在 GraphicsLayer 图层中进行绘制几何图形)

什么是 Graphic ?

A&Q: 图形是现实世界地理现象的矢量表示(地图中显示的可视化图形),包含geometry几何图形、symbol(符号)、和 attributes属性

什么是 SketchViewModel ?

A&Q: 是 Sketch 部件提供的逻辑(暴露给开发人员的绘图接口),sketchViewModel 旨在与Graphics一起使用,并且需要在 配置参数中指定 layer 属性 为 GraphicsLayer 的实例;

     require(
            [
                'esri/WebMap',
                'esri/views/MapView',
                'esri/layers/GraphicsLayer',
                'esri/Graphic',
                'esri/widgets/Sketch/SketchViewModel',
            ],
            (WebMap, MapView, GraphicsLayer, Graphic, SketchViewModel) => {
                // 创建地图服务
                const webmap = new WebMap({
                    portalItem: {
                        id: "e691172598f04ea8881cd2a4adaa45ba"
                    }
                });
                // 创建视图
                const view = new MapView({
                    map: webmap,
                    container: "viewDiv",
                    zoom: 4,
                    center: [-100.4593, 36.9014]
                });
                const graphicsLayer = new GraphicsLayer();    // 绘制图层
                // 使用 SketchViewModel
                const sketchViewModel = new SketchViewModel({
                     layer: graphicsLayer,
                     view: view,
                     pointSymbol: {
                             type: '', // 绘制什么图形
                             color: [], // 绘制的颜色
                             ...
                     }
                 })
                 
            }))
 

sketchViewModel的交互操作

  • 为 sketchViewModel 绑定click事件
  • 通过 sketchViewModelcreateupdate等事件的监听

methed

  • create:当开始绘图、正在绘图、完成绘图时触发,获取到绘制图形的地图要素信息;
sketchViewModel.on(['create'], (event) => {
                    //  event.state事件状态: start、active、complete、cancel
                    if (event.state == 'complete') {
                        sketchGeometry = event.graphic.geometry;  
                    } 
                })
                
 sketchViewModel.on(["update"], (event) => {
                    const eventInfo = event.toolEventInfo;
                    // update the filter every time the user moves the filtergeometry
                    if (eventInfo && eventInfo.type.includes("move")) {
                        if (eventInfo.type === "move-stop") {
                            sketchGeometry = event.graphics[0].geometry;
                        }
                    }
                    // update the filter every time the user changes the vertices of the filtergeometry
                    if (eventInfo && eventInfo.type.includes("reshape")) {
                        if (eventInfo.type === "reshape-stop") {
                            sketchGeometry = event.graphics[0].geometry;
                        }
                    }
                });
  • update:当更新绘图、或完成绘图时触发,回调内获取地理要素信息;
  • delete:当用户点击小部件 delete功能按钮、或调用delete()方法时触发;
  • redo/undo:当用户重做/撤销时触发

绘制图形绑定click事件

绘制什么图形

  document.getElementById("polygon-geometry-button").onclick = geometryButtonsClickHandler;
                function geometryButtonsClickHandler(event) {
                    const geometryType = event.target.value;      // 获取要画什么图形 polygon、polyline
                    sketchViewModel.create(geometryType);        // 调用create方法,开始绘制
                }

完整代码

  <link rel="stylesheet" href="https://js.arcgis.com/4.23/esri/themes/light/main.css" />
    <script src="https://js.arcgis.com/4.23/"></script>
    <script>
        require(
            [
                'esri/WebMap',
                'esri/views/MapView',

                'esri/layers/GraphicsLayer',
                'esri/Graphic',
                'esri/widgets/Sketch/SketchViewModel',
            ],
            (WebMap, MapView, GraphicsLayer, Graphic, SketchViewModel) => {
                // 创建地图服务
                const webmap = new WebMap({
                    portalItem: {
                        id: "e691172598f04ea8881cd2a4adaa45ba"
                    }
                });
                // 创建视图
                const view = new MapView({
                    map: webmap,
                    container: "viewDiv",
                    zoom: 4,
                    center: [-100.4593, 36.9014]
                });

                const sketchLayer = new GraphicsLayer();    // 绘制草图图层
                const bufferLayer = new GraphicsLayer();

                // create the layerView's to add the filter
                let sceneLayerView = null;
                let featureLayerView = null;
                view.map.addMany([sketchLayer, bufferLayer]);   // 把图层添加到视图图层中
                view.map.load().then(() => {
                    view.map.layers.forEach((layer, index) => {

                        view.whenLayerView(layer)
                            .then((layerView) => {
                                if (layer.type === "feature") {
                                    featureLayerView = layerView;
                                }
                                if (layer.type === "scene") {
                                    sceneLayerView = layerView;
                                }
                            }).catch(() => console.error());
                    })

                })
                // use SketchViewModel to draw polygons that are used as a filter
                let sketchGeometry = null;
                const sketchViewModel = new SketchViewModel({
                    layer: sketchLayer,
                    view: view,
                    pointSymbol: {
                        type: "simple-marker",
                        style: "circle",
                        size: 10,
                        color: [255, 255, 255, 0.8],
                        outline: {
                            color: [211, 132, 80, 0.7],
                            size: 10
                        }
                    },
                    polylineSymbol: {
                        type: "simple-line",
                        color: [211, 132, 80, 0.7],
                        width: 6
                    },
                    polygonSymbol: {
                        type: "simple-fill",
                        symbolLayers: [
                            {
                                type: "fill",
                                material: {
                                    color: [255, 255, 255, 0.8]
                                },
                                outline: {
                                    color: [211, 132, 80, 0.7],
                                    size: "10px"
                                }
                            }
                        ]
                    },
                    defaultCreateOptions: { hasZ: false }

                })
                sketchViewModel.on(['create'], (event) => {
                    if (event.state == 'complete') {
                        sketchGeometry = null;  
                        sketchGeometry = event.graphic.geometry;
                    }
                })
                sketchViewModel.on(["update"], (event) => {
                    const eventInfo = event.toolEventInfo;
                    // update the filter every time the user moves the filtergeometry
                    if (eventInfo && eventInfo.type.includes("move")) {
                        if (eventInfo.type === "move-stop") {
                            sketchGeometry = event.graphics[0].geometry;
                        }
                    }
                    // update the filter every time the user changes the vertices of the filtergeometry
                    if (eventInfo && eventInfo.type.includes("reshape")) {
                        if (eventInfo.type === "reshape-stop") {
                            sketchGeometry = event.graphics[0].geometry;
                        }
                    }
                });

                // draw geometry buttons - use the selected geometry to sktech
                document.getElementById("point-geometry-button").onclick = geometryButtonsClickHandler;
                document.getElementById("line-geometry-button").onclick = geometryButtonsClickHandler;
                document.getElementById("polygon-geometry-button").onclick = geometryButtonsClickHandler;
                function geometryButtonsClickHandler(event) {
                    const geometryType = event.target.value;      // 获取要画什么图形
                    sketchViewModel.create(geometryType);
                }
            })
    </script>
    <div id="viewDiv"></div>
    <div id="infoDiv" class="esri-widget">
        <div class="geometry-options">
            <button class="esri-widget--button esri-icon-map-pin geometry-button" id="point-geometry-button"
                value="point" title="Filter by point"></button>
            <button class="esri-widget--button esri-icon-polyline geometry-button" id="line-geometry-button"
                value="polyline" title="Filter by line"></button>
            <button class="esri-widget--button esri-icon-polygon geometry-button" id="polygon-geometry-button"
                value="polygon" title="Filter by polygon"></button>
        </div>
    </div>

链接地址: