arcgis js 4.x 实现绘制与编辑 含节点吸附

<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport"
          content="initial-scale=1,maximum-scale=1,user-scalable=no" />
    <title>
        Synchronize MapView and SceneView | Sample | ArcGIS Maps SDK for
        JavaScript 4.26
    </title>

    <style>
        html,
        body {
            padding: 0;
            margin: 0;
            height: 100%;
        }

        #draw{
            position:absolute;
            right:15%;
            top:2%;
        }
        #editor {
            position: absolute;
            right: 12%;
            top: 2%;
        }
        #undo {
            position: absolute;
            right: 9%;
            top: 2%;
        }
        #redo {
            position: absolute;
            right: 6%;
            top: 2%;
        }
       
    </style>

    <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/Map", "esri/views/MapView", "esri/Graphic", "esri/layers/GraphicsLayer",
            "esri/widgets/Editor",
            "esri/layers/TileLayer", "esri/layers/WMTSLayer", "esri/layers/WebTileLayer",
            "esri/geometry/Extent", "esri/geometry/Point",
            "esri/widgets/Sketch/SketchViewModel",
], (
                Map,
            MapView, Graphic, GraphicsLayer, Editor,
            TileLayer, WMTSLayer, WebTileLayer, Extent, Point,SketchViewModel
            ) => {
            const map = new Map();
          

           var tdtVecLayer = new WebTileLayer({
                urlTemplate:
                    'http://{subDomain}.tianditu.gov.cn/DataServer?T=vec_w&x={col}&y={row}&l={level}&tk=',
                subDomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7'],
            })
            var tdtPoiLayer = new WebTileLayer({
                urlTemplate:
                    'http://{subDomain}.tianditu.gov.cn/DataServer?T=cva_w&x={col}&y={row}&l={level}&tk=',
                subDomains: ['t0', 't1', 't2', 't3', 't4', 't5', 't6', 't7'],
            })

         
            map.add(tdtVecLayer);
            map.add(tdtPoiLayer);

            var mapview = new MapView({
                container: "viewDiv",
                center: [118.884968, 32.12381],
                zoom: 14,
                map: map
            });



            let graphicsLayer = new GraphicsLayer();
            map.add(graphicsLayer);
           

             // 创建编辑工具
            var sketchViewModel = new SketchViewModel({
                layer: graphicsLayer,
                view: mapview,
                activeFillSymbol:{
                    type: "simple-fill",
                    style: "solid",
                    color: [255, 0, 0, 0.2],
                    outline: {
                        color: [255, 0, 0],
                        width: 1
                    }
                },
                snappingOptions: { 
                    enabled: true, 
                    featureSources: [{
                        layer: graphicsLayer, enabled: true
                    }]
                }
            });

            //绘制
            document.getElementById("draw").addEventListener("click", function () {
                sketchViewModel.updateOnGraphicClick = false;
                sketchViewModel.create("polygon", { "mode": "click" });

            })

            //编辑
            document.getElementById("editor").addEventListener("click", function () {
                sketchViewModel.updateOnGraphicClick = true;

            })
           //撤销
            document.getElementById("undo").addEventListener("click", function () {
                sketchViewModel.undo();

            })
            //恢复
            document.getElementById("redo").addEventListener("click", function () {
                sketchViewModel.redo();

            })
            保存
            //document.getElementById("save").addEventListener("click", function () {
            //    sketchViewModel.updateOnGraphicClick = false;
            //    sketchViewModel.cancel();
            //})
           

            //绘制图形绑定事件
            sketchViewModel.on("create", onGraphicCreate);

            //编辑图形绑定事件
            sketchViewModel.on("update", onGraphicUpdate);



           
            //绘制完执行函数
            function onGraphicCreate(event) {
                if (event.state === "complete") {
                    console.log(event)
                    graphicsLayer.add(event.graphic);
                }

            }

            //编辑完执行函数
            function onGraphicUpdate(event) {
                const graphic = event.graphics[0];
                if (event.state === "complete") {
                    console.log(graphic);
                }
            }

            //编辑完执行函数
            function onGraphicUpdate(event) {
                const graphic = event.graphics[0];
                if (event.state === "complete") {
                    console.log(graphic);
                }
            }
        });

    </script>
</head>
<body>
    <div id="viewDiv" style="float: left; width: 100%; height: 100%"></div>
    <button id="draw">绘制</button>
    <button id="editor">编辑</button>
    <button id="undo">撤销</button>
    <button id="redo">恢复</button>
    <!--<button id="save">保存图形</button>-->



</body>
</html>

参考文章

SketchViewModel | API Reference | ArcGIS Maps SDK for JavaScript 4.29 | ArcGIS Developers

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值