zoukankan      html  css  js  c++  java
  • ArcGIS API For JS 之服务器端要素的增删改(结合TemplatePicker控件)

    本文结合的是要素图层的增删改,结合Draw、TemplatePicker控件、Edit工具,总体思路:

    加载点、线、面要素图层,为map注册layers-add-result事件,通过initEditing函数进行工具等初始化,通过evt参数获取所有的图层,并赋值给layers变量,声明Edit工具,并注册deactivate事件, 然后遍历layers中的每个图层对象注册点击事件和双击事件进行操作,至于TemplatePicker控件通过监测selection-change事件进行判断绘画类型,将类型传给Draw进行绘图。关于默认配置 esriConfig.defaults.geometryService我用的本地的(也可以不配置直接在代码中书写),如果用官网加上代理。

    一、TemplatePicker控件介绍

    为用户显示预设值的特征集(例如点、线、面,类型就这三种),对图层中的每一个服务可以进行添加,通过点击选择模板上的符号进行添加到图层上。模板里面的符号是由所要加载的要素图层的要素所决定的,当然这个控件也可以当作一个简单的图例。

    二、TemplatePicker控件控件声明

                    var templatePicker = new TemplatePicker({
                        featureLayers: layers,
                        rows: "auto",
                        columns: 2,
                        grouping: true,
                        style: "height: auto; overflow: auto;"
                    }, "templatePickerDiv");
    
                    templatePicker.startup();;

    三、图层对象事件

                    //遍历每个图层给每个图层注册事件
                    arrayUtils.forEach(layers, function (layer) {
                        var editingEnabled = false;
                        //双击选中要素进行编辑
                        layer.on("dbl-click", function (evt) {
                            event.stop(evt);
                            if (editingEnabled === false) {
                                editingEnabled = true;
                                editToolbar.activate(Edit.EDIT_VERTICES, evt.graphic);
                            } else {
                                currentLayer = this;
                                editToolbar.deactivate();
                                editingEnabled = false;
                            }
                        });
    
                        layer.on("click", function (evt) {
                            //阻止事件冒泡和默认事件
                            event.stop(evt);
                            //Ctrl+鼠标左键删除
                            if (evt.ctrlKey === true || evt.metaKey === true) {  
                                layer.applyEdits(null, null, [evt.graphic]);
                                //this表示当前触发点击事件的图层对象
                                currentLayer = this;
                                editToolbar.deactivate();
                                editingEnabled = false;
                            }
                        });
                    });

    四、编辑控件以及事件

                    var editToolbar = new Edit(map);
                    editToolbar.on("deactivate", function (evt) {
                        currentLayer.applyEdits(null, [evt.graphic], null);
                    });

    五、全部代码

    <!DOCTYPE html>
    <html>
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        
        <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
        <title>Landuse</title>
    
        <link rel="stylesheet" href="https://js.arcgis.com/3.24/dijit/themes/claro/claro.css">
        <link rel="stylesheet" href="https://js.arcgis.com/3.24/esri/css/esri.css">
        <style>
          html, body {
            height: 100%;
             100%;
            margin: 0;
            padding: 0;
            overflow:hidden;
          }
          #header {
            border:solid 2px #462d44;
            background:#fff;
            color:#444;
            -moz-border-radius: 4px;
            border-radius: 4px;
            font-family: sans-serif;
            font-size: 1.1em;
            padding-left:20px;
          }
          #map {
            padding:1px;
            border:solid 2px #444;
            -moz-border-radius: 4px;
            border-radius: 4px;
          }
          #rightPane {
            border:none;
            padding: 0;
            228px;
          }
          .templatePicker {
            border: solid 2px #444;
          }
        </style>
    
        <script src="https://js.arcgis.com/3.24/"></script>
        <script>
            var map;
            require([
              "esri/map",
              "esri/toolbars/draw",
              "esri/toolbars/edit",
              "esri/graphic",
              "esri/config",
              "esri/dijit/editing/Editor",
              "esri/layers/FeatureLayer",
              "esri/geometry/Extent",
    
              "esri/symbols/SimpleMarkerSymbol",
              "esri/symbols/SimpleLineSymbol",
              "esri/symbols/SimpleFillSymbol",
    
              "esri/dijit/editing/TemplatePicker",
    
              "dojo/_base/array",
              "dojo/_base/event",
              "dojo/_base/lang",
              "dojo/parser",
              "dijit/registry",
    
              "dijit/layout/BorderContainer", "dijit/layout/ContentPane",
              "dijit/form/Button", "dojo/domReady!"
            ], function (
              Map, Draw, Edit, Graphic, esriConfig,Editor,
              FeatureLayer,Extent,
              SimpleMarkerSymbol, SimpleLineSymbol, SimpleFillSymbol,
              TemplatePicker,
              arrayUtils, event, lang, parser, registry
            ) {
                parser.parse();
    
                ////使用代理因为要跨域
                //esriConfig.defaults.io.proxyUrl = "/proxy/";
    
              
                esriConfig.defaults.geometryService = new esri.tasks.GeometryService("http://localhost:6080/arcgis/rest/services/Utilities/Geometry/GeometryServer");
    
                map = new Map("map", {
                    extent:new Extent({
                        xmin: -1.74295131297E7,
                        ymin: -1.60132136175E7,
                        xmax: 3.46819141188E7,
                        ymax: 1.2326799939499997E7,
                        spatialReference: { wkid: 3857 }
                    })
                });
    
                map.on("layers-add-result", initEditing);
    
                var landusePointLayer = new FeatureLayer("http://localhost:6080/arcgis/rest/services/publish/FeatureServer/0", {
                    mode: FeatureLayer.MODE_SNAPSHOT,
                    outFields: ["*"]
                });
                var landuseLineLayer = new FeatureLayer("http://localhost:6080/arcgis/rest/services/publish/FeatureServer/1", {
                    mode: FeatureLayer.MODE_SNAPSHOT,
                    outFields: ["*"]
                });
                var landusePolygonLayer = new FeatureLayer("http://localhost:6080/arcgis/rest/services/publish/FeatureServer/2", {
                    mode: FeatureLayer.MODE_SNAPSHOT,
                    outFields: ["*"]
                });
                map.addLayers([landusePointLayer, landuseLineLayer, landusePolygonLayer]);
    
                function initEditing(evt) {
                    console.log("initEditing", evt);
                    // var map = this;
                    var currentLayer = null;
    
                    //dojo.map(array, callback, scope):
                    //该方法用来对数组中的每个元素执行操作,并返回一个数组包含操作的结果。其三个参数的含义与 dojo.forEach()相同。
                    var layers = arrayUtils.map(evt.layers, function (result) {
                        return result.layer;
                    });
                    console.log("layers", layers);
    
                    var editToolbar = new Edit(map);
                    editToolbar.on("deactivate", function (evt) {
                        currentLayer.applyEdits(null, [evt.graphic], null);
                    });
                    //遍历每个图层给每个图层注册事件
                    arrayUtils.forEach(layers, function (layer) {
                        var editingEnabled = false;
                        //双击选中要素进行编辑
                        layer.on("dbl-click", function (evt) {
                            event.stop(evt);
                            if (editingEnabled === false) {
                                editingEnabled = true;
                                editToolbar.activate(Edit.EDIT_VERTICES, evt.graphic);
                            } else {
                                currentLayer = this;
                                editToolbar.deactivate();
                                editingEnabled = false;
                            }
                        });
    
                        layer.on("click", function (evt) {
                            //阻止事件冒泡和默认事件
                            event.stop(evt);
                            //Ctrl+鼠标左键删除
                            if (evt.ctrlKey === true || evt.metaKey === true) {  
                                layer.applyEdits(null, null, [evt.graphic]);
                                //this表示当前触发点击事件的图层对象
                                currentLayer = this;
                                editToolbar.deactivate();
                                editingEnabled = false;
                            }
                        });
                    });
    
                    var templatePicker = new TemplatePicker({
                        featureLayers: layers,
                        rows: "auto",
                        columns: 2,
                        grouping: true,
                        style: "height: auto; overflow: auto;"
                    }, "templatePickerDiv");
    
                    templatePicker.startup();;
                    var drawToolbar = new Draw(map);
    
                    var selectedTemplate;
                    templatePicker.on("selection-change", function () {
                        if (templatePicker.getSelected()) {
                            selectedTemplate = templatePicker.getSelected();
                        }
                        switch (selectedTemplate.featureLayer.geometryType) {
                            case "esriGeometryPoint":
                                drawToolbar.activate(Draw.POINT);
                                break;
                            case "esriGeometryPolyline":
                                drawToolbar.activate(Draw.POLYLINE);
                                break;
                            case "esriGeometryPolygon":
                                drawToolbar.activate(Draw.POLYGON);
                                break;
                        }
                    });
    
                    drawToolbar.on("draw-end", function (evt) {
                        drawToolbar.deactivate();
                        editToolbar.deactivate();
                        var newAttributes = lang.mixin({}, selectedTemplate.template.prototype.attributes);
                        var newGraphic = new Graphic(evt.geometry, null, newAttributes);
                        selectedTemplate.featureLayer.applyEdits([newGraphic], null, null);
                    });
                }
            });
        </script>
      </head>
      <body class="claro">
        <div data-dojo-type="dijit/layout/BorderContainer" data-dojo-props="gutters:true, design:'headline'" style="100%;height:100%;">
          <div data-dojo-type="dijit/layout/ContentPane"  id="header" data-dojo-props="region:'top'">双击选中,Ctrl+鼠标右键删除 </div>
          <div id="map" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'center'"></div>
          <div id="rightPane" data-dojo-type="dijit/layout/ContentPane" data-dojo-props="region:'right'">
            <div id="templatePickerDiv"></div>
              
          </div>
        </div>
          
      </body>
    </html>

    引用文件用的官方的我这本地配置的才是3.18版本真垃圾,好多没法加载,找个事件得改改了,还有发布要素服务,我们有时候发布是一个mxd文档里面有好几个图层,记载的时候一定要进行分层,否则没法加载,至于怎么发布要素图层这个网上教程很多,这里就不介绍了。这里的点、线、面图层都是我随便画的(不要喷我)代码参考官方。

    六、有图有真相

    删除前:

    删除后:

  • 相关阅读:
    Codeforces Round #652 (Div. 2) A. FashionabLee(几何)
    轻量应用服务器如何通过修改apache配置文件实现非https的访问多域名到不同子目录程序?
    在Windows环境下使用hexo搭建博客以及部署到gitee / github
    使用WordPress搭建个人手机博客(阿里云)
    访问自己服务器的ip地址
    php环境无法上传文件的解决方法
    SSRF漏洞
    CSRF全家桶(含义,防御,攻击)
    JS实现HTML实体与字符的相互转换
    CentOS系统下载及应用部署
  • 原文地址:https://www.cnblogs.com/tuboshu/p/10752352.html
Copyright © 2011-2022 走看看