好久没来更新了,趁周末有一点点时间,来总结下前两周的知识点,最近一直在做arcgis
相关的工作,主要是在FeatureLayer
图层上做一些操作,比如点击查询要素并高亮,根据行政区划加载要素图层、要素统计,要素样式设置,属性编辑等功能。下面就根据这些知识来总结下怎么用的。
1.加载图层
1.1图层初始化
在ArcGis
中加载矢量图层主要采用的是FeatureLayer
这个类来加载,实例化FeatureLayer
需要传递图层的地址,还可以设置一些额外的参数,比如设置需要返回的属性信息等。具体代码如下所示:
require([
"esri/map",
"esri/layers/FeatureLayer",
"esri/symbols/SimpleMarkerSymbol",
"esri/symbols/SimpleFillSymbol",
"esri/symbols/SimpleLineSymbol",
"esri/Color",
"esri/graphic",
"dojo/domReady!"
],
function (
Map,
FeatureLayer,
SimpleMarkerSymbol,
SimpleFillSymbol,
SimpleLineSymbol,
Color,
Graphic
) {
var map = new Map("map", {
basemap: "dark-gray",
center: [-97.395, 37.537],
zoom: 5
});
var url = "https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/NCAA_Tourney_2015/FeatureServer/1";
var featureLayer = new FeatureLayer(url, {
mode: FeatureLayer.MODE_ONDEMAND,
outFields: ["*"],
});
map.addLayer(featureLayer);
});
1.2条件加载
在加载FeatureLayer
的时候,可以设置一些条件来加载矢量数据,比如只加载某个行政区内的数据,可以设置如下所示:
//过滤,只需要查询用户所在行政区划的数据
featureLayer.setDefinitionExpression("XZQDM" + " like '" + this.xzqdm + "%'");
其实就是写一条SQL
语句,然后再通过setDefinitionExpression
函数,将SQL
传递给FeatureLayer
进行条件查询。
1.3样式设置
FeatureLayer
虽然可以在做图的时候,直接将样式设置好,但为了方便前端修改颜色,也可以在前端通过代码来设置样式信息,当某个字段的值不一样时,可以设置不同的样式,下面以Rd_64_Result
字段为例,当字段的值为W
时设置一咱样式 ,为L
时设置另一种样式,如下所示:
var recordRenderer = new UniqueValueRenderer(defaultSymbol, "Rd_64_Result");
recordRenderer.addValue("W", new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_CIRCLE, 7, null, new Color([255, 0, 0])));
recordRenderer.addValue("L", new SimpleMarkerSymbol(SimpleMarkerSymbol.STYLE_CIRCLE, 7, null, new Color([0, 0, 255])));
featureLayer.setRenderer(recordRenderer);
2.要素点击查询
要素点击查询,主要有两种方式,一种是直接给FeatureLayer
添加点击事件,来获取要素信息,但这种方式只能获取到一个要素信息,如果有重叠的要素,将无法获取到,另一种是使用坐标点来查询点击区域的所有要素信息,这种方式虽然可以查询到重叠的点,但也有不好的一点,就是需要请求网络,当矢量数据很多的时候,点击一下要等很久才能查询出来,总之各有各的优点,具体要看业务需求。
2.1点击获取要素信息
该种方式主要是给FeatureLayer
添加click
事件,然后再获取要素相关信息,如下所示:
featureLayer.on("click", function (evt) {
var attr = evt.graphic.attributes;
var geometry = evt.graphic.geometry
attr["Rd_64_Result"] = "AA"
});
2.2点击查询要素
该方式主要是走网络请求的方式来查询要素信息,首先获取到坐标点,然后再根据坐标点来构造一个圆,给圆设置一个半径,然后中查询与该圆相交的要素信息,如下所示:
this.map.on('click',function(evt){
//查询10米内的数据,点击的时候方便选中
var point = evt.mapPoint;
var circleGeometry = new Circle(point,{
"radius": 10
});
self.selectQuery.geometry = circleGeometry;
//查询
self.featureLayer.selectFeatures(self.selectQuery, FeatureLayer.SELECTION_NEW);
})
查询返回结果
dojo.connect(featureLayer, "onSelectionComplete", function (features) {
dojo.forEach(features, function (feature) {
var attributes = feature.attributes;
})
3.要素属性编辑
当需要个性要素属性时,我们一开始可能想到的方式就是后台提供一个接口来进行更改,其实FeatureLayer
就已经支持属性编辑了,不过在发布FeatureLayer
图层的时候需要将图层设置成可编辑的,前端就可以使用applyEdits
来进行修改属性信息了,如下所示:
featureLayer.on("click", function (evt) {
var attr = evt.graphic.attributes;
attr["Rd_64_Result"] = "AA"
var graphic = new Graphic(evt.graphic.geometry,"",attr);
featureLayer.applyEdits(null,[graphic],null);//编辑要素
//刷新图层
featureLayer.refresh();
});
applyEdits
方法支持三个参数,分别是新增
,修改
,删除
。类型为数组,可以批量操作。
4.要素统计
同样的,在ArcGis
中可以直接使用FeatureLayer
的一些方法来查询统计信息,不需要后台提供服务接口,当然,如果一些比较复杂的统计需求,最好是后台提供接口了,这里主要是以简单的统计来分类,比如根据某个字段的值进行统计,具体的实现方法如下所示:
var queryTask,query,statDef;
queryTask = new QueryTask(this.configInfo.featureUrl);
query = new Query();
query.outFields = ["*"];
statDef = new StatisticDefinition();
//统计总和
statDef.statisticType = "sum";
// 统计的字段
statDef.onStatisticField = "MJ";
statDef.outStatisticName = "MJ";//字段名称
query.returnGeometry = false;
query.where = "Rd_64_Result=1 and XZQDM = '" + this.xzqdm + "'";
query.outStatistics = [ statDef ];//返回的统计信息
query.groupByFieldsForStatistics = ["SFQL"];//根据某个字段分组
queryTask.execute(query, function(result){
if(result){
var features = result.features;
if(features && features.length >0){
var attributes = features[0].attributes
var SUM_MJ = attributes['SUM_MJ'];//返回的统计信息
}
}
}, function(e){
});
网友评论