【转】使用arcgis javascript api 保存不规则面状数据(镂空、自相交)

使用arcgis javascript. api 编辑面状数据的时候,如果面状数据出现自相交(如八字形、多部分、镂空等情况),在使用FeatureLayer的applyEdits函数进行保存时,会保存不成功。 一般来说,保存不成功脚本是不会有任何提示的,必须要对编辑事件进行监控,让其抛出提示,可以参考featureLayer里面的事件onEditsComplete(addResults, updateResults, deleteResults) 事件。在地图初始化时加载featureLayer,然后给featureLayer注册事件,使用dojo.connect的方式,如下dojo.connect(editLayer,"onEditsComplete",editCalled); 其中editLayer就是对应的FeatureLayer,onEditsComplete是FeatureLayer的事件,editCalled是这个事件所触发的执行方法。

function editCalled(addResults,updateResults, deleteResults){
       if(addResults[0].success==true){
           alert("保存成功");
        }else{
               alert("保存失败");
       }
  }

 

接下来要对面图形进行处理,由于客户端脚本无法对自相交的面数据进行运算,那么,我们可以借助Geometry Service的simplify函数,处理后的图形就会由于一个ring变成实际上的多个ring。(注:arcgis 体系下,polygon是由多个ring组成的,默认情况下polygon都是一个ring。出现自相交的时候,polygon这个默认的ring实际上已经是错误的,因此无法对图形进行保存)。这种方法的原理在于通过simplify把polygon变成多个ring再进行保存。原理很简单,但其中有一点要注意的,simplify处理时需要一定的时间,必须要等待期处理完成后重设graphic的图形才能保存。因此,必须要对simplify进行监听。gsvc.simplify([geometry],doSave); doSave函数负责处理新的图形。如下代码段

function doSave(geometries){
 alert("Ring的数目 = " + geometries[0].rings.length);
       gra.setGeometry(geometries[0]);  //gra是之前已经声明的graphic
 }

以下是面编辑的整个网页的测试代码

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <meta. http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <meta. http-equiv="X-UA-Compatible" content="IE=7" />
    <title>Maps Toolbar</title>
   <link rel="stylesheet" type="text/css" href="http://lazysheep/arcgis_js_api/library/2.0/arcgis/js/dojo/dijit/themes/tundra/tundra.css">
    <script. type="text/javascript" src="http://lazysheep/arcgis_js_api/library/2.0/arcgis/"></script>
    <script. type="text/javascript">
      dojo.require("esri.map");
      dojo.require("esri.toolbars.draw");
   dojo.require("esri.dijit.editing.Editor-all");
   dojo.require("esri.tasks.geometry");
      dojo.require("esri.geometry");
   
      var map, toolbar, symbol, editLayer,gsvc,gra;
      function init() {
    esri.config.defaults.io.proxyUrl = "proxy.ashx";
        map = new esri.Map("map");
        gsvc = new esri.tasks.GeometryService("http://lazysheep:8399/arcgis/rest/services/Geometry/GeometryServer");
  var basemap = new esri.layers.ArcGISTiledMapServiceLayer("http://lazysheep:8399/arcgis/rest/services/world/MapServer");
        map.addLayer(basemap);
  
  
  editLayer = new esri.layers.FeatureLayer("http://lazysheep:8399/arcgis/rest/services/wd/FeatureServer/0", {
          mode: esri.layers.FeatureLayer.MODE_ONDEMAND,
          outFields: ["*"]
        });
  dojo.connect(map, "onLayersAddResult", initEditing);
  dojo.connect(editLayer,"onEditsComplete",addCalled);
        map.addLayers([editLayer]);
  
      }
   
   function addCalled(addResults,updateResults, deleteResults){
    if(addResults[0].success==true){
   alert("success");
  }else{
   alert("faile");
  }
   }


      function createToolbar(map) {
        toolbar = new esri.toolbars.Draw(map);  
        dojo.connect(toolbar, "onDrawEnd", addToMap);
      }

      function addToMap(geometry) {
       switch (geometry.type) {
          case "point":
            var symbol = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_SQUARE, 10, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([255,0,0]), 1), new dojo.Color([0,255,0,0.25]));
            break;
          case "polyline":
            var symbol = new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASH, new dojo.Color([255,0,0]), 1);
            break;
          case "polygon":
            var symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASHDOT, new dojo.Color([255,0,0]), 2), new dojo.Color([255,255,0,0.25]));
            gsvc.simplify([geometry],doSave);  //对simplify进行监听,在完成simplify操作后重设图形。
   break;
          case "extent":
            var symbol = new esri.symbol.SimpleFillSymbol(esri.symbol.SimpleFillSymbol.STYLE_SOLID, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_DASHDOT, new dojo.Color([255,0,0]), 2), new dojo.Color([255,255,0,0.25]));
            break;
          case "multipoint":
            var symbol = new esri.symbol.SimpleMarkerSymbol(esri.symbol.SimpleMarkerSymbol.STYLE_DIAMOND, 20, new esri.symbol.SimpleLineSymbol(esri.symbol.SimpleLineSymbol.STYLE_SOLID, new dojo.Color([0,0,0]), 1), new dojo.Color([255,255,0,0.5]));
            break;
        }  
        var graphic = new esri.Graphic(geometry, symbol);
  gra = graphic;
        map.graphics.add(graphic);
   }
   
   
   function drawing(){
    toolbar = new esri.toolbars.Draw(map);
  toolbar.activate(esri.toolbars.Draw.POLYGON);
        dojo.connect(toolbar, "onDrawEnd", addToMap);
   }
   
   function drawing2(){
    toolbar = new esri.toolbars.Draw(map);
  toolbar.activate(esri.toolbars.Draw.FREEHAND_POLYGON);
        dojo.connect(toolbar, "onDrawEnd", addToMap);
   }
   
   function initEditing(layers) {
        var myMap = this;      
        var editToolbar = new esri.toolbars.Edit(myMap);
        dojo.connect(editToolbar, "onDeactivate", function(tool,graphic) {
          editLayer.applyEdits(null, [graphic], null);
        });

        var editingEnabled = false;
        dojo.connect(editLayer, "onDblClick", function(evt) {
          dojo.stopEvent(evt);
          if (editingEnabled === false) {
            editingEnabled = true;
            editToolbar.activate(esri.toolbars.Edit.EDIT_VERTICES , evt.graphic);
          } else {
            editToolbar.deactivate();
            editingEnabled = false;
          }
        });
      }
   
  
   function doSave(geometries){
    alert("Ring的数目 = " + geometries[0].rings.length);
       gra.setGeometry(geometries[0]);  
   }
  

   function save(){
  editLayer.applyEdits([gra],null,null);  
   }
      dojo.addOnLoad(init);
    </script>
  </head>
  <body class="tundra">
    <input type="button" value="draw polygon" nclick="drawing()"/>
 <input type="button" value="draw gpolygon" nclick="drawing2()"/>
 <input type="button" value="save" nclick="save()"/>
    <div id="map" style="width:900px; height:600px; border:1px solid #000;"></div>
  </body>
</html> 

 

 

原文链接:http://www.gisall.com/html/47/122747-4195.html

转载于:https://www.cnblogs.com/dwf07223/archive/2013/04/26/3045728.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ArcGIS JavaScript API是一种用于构建WebGIS应用程序的JavaScript库。它提供了一组工具和功能,使开发人员能够在Web浏览器创建交互式地图和地理信息系统应用程序。该API支持多种数据源和格式,包括地图服务、地理编码服务、地理处理服务和地理数据库。它还提供了许多可自定义的UI组件和工具,使开发人员能够创建自己的地图应用程序。 ### 回答2: ArcGIS JavaScript API是一种基于JavaScript编程语言的地理信息系统(GIS)应用程序接口。它是Esri公司ArcGIS平台的一个关键组件,用于开发互动性、动态、交互式和数据驱动型的Web地图应用程序。 这个API提供了很多有用的功能,其包括地图、图层、地理处理、空间分析、搜索、搜索服务、几何图形、坐标系、符号、渲染、可视化、数据编辑和查询等等。它基于最新的Web标准和技术,如HTML5、CSS、DOM、REST和JSON等,因此它可以快速地创建跨平台、可扩展、精确、可应用和可重用的GIS应用程序。 ArcGIS JavaScript API可以访问来自不同来源的地理空间数据、地理工具和专业技能等资源,以支持用户构建具有定制性、可移植性、易用性和安全性的GIS网站和应用程序。通过这个API,开发人员可以轻松地构建集成GIS的Web应用程序,用以管理、分析和可视化地理数据ArcGIS JavaScript API的主要应用场景包括GIS数据可视化、地图显示、Web GIS、数据分析、企业GIS、GIS培训和地理教育等方向。ArcGIS JavaScript API拥有非常活跃的开发社区,通过在线论坛、社交媒体、博客和文档等渠道,为开发人员提供了充足的支持和帮助。 总之,ArcGIS JavaScript API提供了灵活、可扩展、易用和高效的GIS应用程序开发框架,它为开发人员提供了多种选择和功能,以便构建功能强大、可定制和高品质的Web GIS应用程序。 ### 回答3: ArcGIS JavaScript API是一种基于JavaScript语言的web地图应用程序开发工具包,它是Esri公司全球领先的GIS软件的一部分,也是Esri公司为方便开发者更好地利用GIS数据提供的一款常用工具。该API主要用于在Web应用程序创建及管理交互地图,基于浏览器端的Web应用可以通过该API实现地图的创建、可视化、编辑、分析等功能。同时,它还支持一系列地图数据来源的接入,包括Esri自有的ArcGIS Online、OpenStreetMap等。 ArcGIS JavaScript API提供了包括地图、图表、统计、空间查询、空间分析等一系列的GIS分析功能,使得开发者能够更快速地搭建出一套完整的交互地图应用程序。开发者通过使用JavaScript API,可以很方便地在Web应用程序集成地图组件,实现多个地理数据图层的叠加、切换、搜索和交互等,使得用户可以通过地图直观地感知自己所在的地理位置和环境信息。 除此之外,ArcGIS JavaScript API 还提供了一系列工具和控件帮助开发者快速开发和调试地图应用程序,例如地图工具栏、鼠标事件、弹出框、图表控件、缩放工具、地图比例尺等。 API最大的优势在于其高可定制性和灵活性,开发者可以通过使用其提供的API库,结合本身的业务需求,灵活定制适合自己的地图组件。 总之,ArcGIS JavaScript API的出现,极大地简化了地图数据的展示和交互的过程,不仅为开发者们提供了方便快捷的开发平台,也大大提升了GIS技术在网络地图应用领域的传播、应用和普及率,为数字化时代的地理分析提供了工具和支持。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值