本博文编写时的软件件环境,为
ArcGIS Server 10.1sp1,ArcGIS API for Silverlight 3.0,VS2010sp1
需求:我有一堆点 ,分为不同的种类,每个点都有一个value属性,我要统计某一空间范围内不同种类点的个数以及每种类型的点的value属性和。以下是数据,为10万个点分为七类。属性表如下
如果在10.1 之前的话,我们需要通过空间查询把所有符合条件的的要素查回来,在前端进行遍历,然后根据属性自己判断一个点要素属于哪一类的,以及计算属性值得和。代码大致如下
- Query query = new Query();
- query.ReturnGeometry = false;
- query.Geometry = geo;
- OutFields f = new OutFields();
- f.Add("value");
- f.Add("class");
- query.OutFields = f;
- queryTask.ExecuteCompleted += new EventHandler<QueryEventArgs>(queryTask_ExecuteCompleted);
- _dicResults = new Dictionary<string, double>();
- var graphics = from graphic in e.FeatureSet orderby graphic.Attributes["class"] select graphic;
- double sum = 0;
- foreach (Graphic g in graphics)
- {
- string key = g.Attributes["class"].ToString();
- double value = Convert.ToInt32(g.Attributes["value"]);
- if (_dicResults.ContainsKey(key))
- {
- _dicResults[key] += value;
- }
- else _dicResults.Add(key, value);
- sum += value;
- }
如果使用上述方式的话查询的数据过多的话,还需要修改服务器返回到前端的最大要素的个数(默认是1000),相当于求和,求数量 还容易一些,如果我计算标准差,方差的话要麻烦一些了,不过ArcGIS 10.1 for Server 在查询中支持了服务端的分组统计功能,ArcGIS API 3.0 for Silverlight 开始了支持这些新功能。直接把返回我们要得到的统计结果
看一下OMD
从以上可以看出 API 与之前 不同是 查询参数增加了。其中 GroupByFieldsForStatistics 意思是以那个字段分组统计,相当于我们在sql 语句中写的 Groupby 可以为多个字段, OutStatistics代表统计方法 比如求一组内的数据的和,最大值 最小值,平均值,数量,标准差。实现如下。跟原来的查询类似 新建立一个Querytask,初始化查询查询参数Query,执行查询 在回调函数里面处理返回结果。
- queryTask = new QueryTask();
- Query query= new Query()
- {
- GroupByFieldsForStatistics = new List<string> { "class" },
- OutStatistics = new List<OutStatistic> {
- new OutStatistic(){
- OnStatisticField = "class",
- OutStatisticFieldName = "count",255)"> StatisticType = StatisticType.Count
- },
- new OutStatistic(){
- OnStatisticField = "value",255)"> OutStatisticFieldName = "sum",248)"> StatisticType = StatisticType.Sum
- } },
- Geometry=geo
- };
- query.ReturnGeometry = false;
- queryTask.ExecuteCompleted += new EventHandler<QueryEventArgs>(queryTask_ExecuteCompleted);
- queryTask.Failed += new EventHandler<TaskFailedEventArgs>(queryTask_Failed);
- queryTask.ExecuteAsync(query);
以class 为字段进行分组同时计算 每种class的点的个数,然后计算每一类 class 要素的value之和,时传入的参数Geometry=geo 是自己绘制的查询范围,处理返回结果的函数如下
- void queryTask_ExecuteCompleted (object sender,QueryEventArgs e)
- {
- _dicResults = new Dictionary<string, double>();
- var graphics = e.FeatureSet ;
- double sum = 0;
- //输出的是一个表格 形式如下 三个字段
- // class count sum
- foreach (Graphic g in graphics)
- {
- string key = g.Attributes["class"].ToString();
- double value = Convert.ToInt32(g.Attributes["sum"]);
- _dicResults.Add(key,248)"> sum += value;
- }
- }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。