arcgis api for javascript(一)使用自定义数据对FeatureLayer进行渲染
2016-06-27 11:38
776 查看
基于arcgis api for javascript3.17,arcgis server10.3
本文主要针对esriGeometryPolygon型(面要素)FeatureLayer中添加自定义属性列的需求。这种client端的数据修改并不会保存到server端
我们知道一般的渲染我们是通过使用FeatureLayer里的值来实现的。但经常有这样的需求,我们需要使用外部的数据(非FeatureLayer图层里自带的数据)来对某一个图层进行渲染,难道还需要我们在arcmap里重新给shp文件添加该列数据然后重新发布service吗?
比较正规的做法是开启服务的Feature Access功能。如下图
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/06/63203b22b71b88358170d29bc19741f6)
但开启该功能需要在发布时指定数据库,否则会报错。详情可以百度ArcGIS server发布FeatureAccess
于是笔者首先想到了使用自定义FeatureLayer。这种自定义的FeatureLayer虽然能解决点和线的需求,但无法解决面要素的增加数据的需求,难不成你还打算在js中自定义绘制中国地图啊
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/33c29e3268d66ef5c09858efe40a3635.gif)
自定义点或者线的FeatureLayer笔者可能会在另一篇博客中给出,当前只说明如何在面要素的FeatureLayer中增加数据。
主要实现原理:
好的,然后贴出全部代码:
上述代码的效果图如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/06/b72fd89ba4f559cbff3e5c86c1788ac2)
然后我们看看打印的内容:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/06/19b152796b50fba703069a06c1ad8f3f)
显示FeatureLayer中的graphic数是34,对应中国的34个省以及直辖市。
然后输出了其中一个graphic,是青海省,我们看到了加进去的nico这一列数据,注意这一列在server端是没有的。
注意,如上所述,ArcGISTiledMapServiceLayer的FeatureLayer中的graphic数可远不止这么点,它会把整个graphic切成许多小的graphics.
以上就完成了在FeatureLayer中对每个要素自定义数据。
这种需求可以使得我们把数据保存在其他数据库中,当需要的时候取出来然后和FeatureLayer中的属性进行关联以渲染图层。
本文主要针对esriGeometryPolygon型(面要素)FeatureLayer中添加自定义属性列的需求。这种client端的数据修改并不会保存到server端
我们知道一般的渲染我们是通过使用FeatureLayer里的值来实现的。但经常有这样的需求,我们需要使用外部的数据(非FeatureLayer图层里自带的数据)来对某一个图层进行渲染,难道还需要我们在arcmap里重新给shp文件添加该列数据然后重新发布service吗?
比较正规的做法是开启服务的Feature Access功能。如下图
但开启该功能需要在发布时指定数据库,否则会报错。详情可以百度ArcGIS server发布FeatureAccess
于是笔者首先想到了使用自定义FeatureLayer。这种自定义的FeatureLayer虽然能解决点和线的需求,但无法解决面要素的增加数据的需求,难不成你还打算在js中自定义绘制中国地图啊
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/33c29e3268d66ef5c09858efe40a3635.gif)
自定义点或者线的FeatureLayer笔者可能会在另一篇博客中给出,当前只说明如何在面要素的FeatureLayer中增加数据。
主要实现原理:
featureLayer.graphics[i].attributes["nico"]=1;该方法可以直接修改(或添加)FeatureLayer的属性,但这种修改只存在于client端,修改的数据不影响server端。
好的,然后贴出全部代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="https://js.arcgis.com/3.17/esri/css/esri.css"> <script src="https://js.arcgis.com/3.17/"></script> <style> body{ height: 100%; margin: 0; padding: 0; } #map { height: 100%; margin: 20px 20px 20px 20px; width: 1000px; height: 800px; padding: 0; border:1px solid #000; } </style> <script> require([ "dojo/_base/connect", "dojo/dom", "dojo/on", "esri/InfoTemplate", "esri/map", "esri/layers/FeatureLayer", "esri/renderers/SimpleRenderer", "esri/Color", "esri/symbols/SimpleFillSymbol", "esri/symbols/SimpleLineSymbol", "dojo/domReady!" ], function(connect,dom, on, InfoTemplate, Map, FeatureLayer,SimpleRenderer,Color,SimpleFillSymbol,SimpleLineSymbol) { var map = new Map("map", { basemap: "topo", center: [121, 35], zoom: 4, minZoom: 3, maxZoom: 10, logo: false }); //笔者server上的图层 var featureLayer = new FeatureLayer("http://localhost:6080/arcgis/rest/services/ChinaProvince/MapServer/0",{ //注意这里的mode一定要指定MODE_SNAPSHOT,否则每次放大或缩小或者是平移都会执行FeatureLayer的update-end操作 mode: FeatureLayer.MODE_SNAPSHOT, outFields: ["*"] }); map.addLayer(featureLayer); //定义一个render对FeatureLayer自定义的数据进行渲染 var renderer = new SimpleRenderer(new SimpleFillSymbol().setOutline(new SimpleLineSymbol().setWidth(0.1).setColor(new Color([128,128,128])))); renderer.setColorInfo({ //使用nico属性进行渲染 field: "nico", minDataValue: 0, maxDataValue: 40, colors: [ new Color([0, 255, 0]), new Color([255, 0, 0]) ] }); featureLayer.on("update-end", function(){ //输出其中一个graphic(面要素)的所有属性 for(var i = 0;i<featureLayer.graphics.length;i++){ //自定义数据,在每个面要素中添加nico属性 featureLayer.graphics[i].attributes["nico"]=i; } featureLayer.setRenderer(renderer); featureLayer.redraw(); //输出FeatureLayer中所有的graphic数 console.log("number of graphics in featureLayer:"+featureLayer.graphics.length); //输出其中一个graphic(面要素)的所有属性 console.log("10th graphic attributes in featureLayer:"); console.log(featureLayer.graphics[10].attributes); }); }); </script> </head> <body> <div id="map"></div> </body> </html>需要注意的事项都在代码中说明了,另外需要强调的是,FeatureLayer请一定要使用ArcGISDynamicMapServiceLayer中的FeatureLayer图层,如果是ArcGISTiledMapServiceLayer的FeatureLayer,则会产生很多的小块graphic,增加数据十分不易。
上述代码的效果图如下:
然后我们看看打印的内容:
显示FeatureLayer中的graphic数是34,对应中国的34个省以及直辖市。
然后输出了其中一个graphic,是青海省,我们看到了加进去的nico这一列数据,注意这一列在server端是没有的。
注意,如上所述,ArcGISTiledMapServiceLayer的FeatureLayer中的graphic数可远不止这么点,它会把整个graphic切成许多小的graphics.
以上就完成了在FeatureLayer中对每个要素自定义数据。
这种需求可以使得我们把数据保存在其他数据库中,当需要的时候取出来然后和FeatureLayer中的属性进行关联以渲染图层。
相关文章推荐
- Andriod arcgis保存Mapview为图片的实例代码
- 基于Arcgis for javascript实现百度地图ABCD marker的效果
- 在arcgis使用python脚本进行字段计算时是如何解决中文问题的
- ArcGis Map 中操作备忘
- ArcGis 的教程和资源
- 基于ArcEngine+C#开发的空间数据管理平台架构设计及功能说明
- 关于 ArcGIS 32位及64位版本问题
- Zoom to Selected Globe Features
- 在ArcGIS中如何删除重复的点要素
- Arcgis Flex Api自定义点样式实现风场显示
- ArcGIS10.2 破解版安装教程
- ArcGIS入门手册
- Arcgis 地图的发布
- ArcMap求四至点坐标的方法(最小外接矩形范围)
- SDE服务启动报错的解决方法
- ArcGIS API for Javascript 应用开发入门
- Arcgis10.0安装遇到错误1935
- 安装Arcgis出现error1606 NULLDesktop10.2
- ArcGIS 10.x geodatabase attachment之外业篇
- catalog下添加ArcServer报“参数错误”错误