使用ArcGIS API for Silverlight 进行复合多条件空间查询
原文:使用ArcGIS API for Silverlight 进行复合多条件空间查询
这两天帮网上认识的一个兄弟做了一个查询的示例,多多少少总结一下,在此和大家分享。
为什么说是复合多条件呢?因为进行空间查询有时候我们查询的条件会很复杂,比如要求某一要素的某一属性大于多少,且小于多少,且又不等于多少等等。而在官网给出的例子中并没有关于复合查询的说明。不过查看API后,你会发现一句很重要的话:
A where clause for the query. Any legal SQL where clause operating on the fields in the layer is allowed, for example: where=POP2000 > 350000.
也就是说在进行空间查询是Query的Where属性实际上是SQL where查询的字符串,所以这样我们写查询条件是就可以仿照SQL where查询语句的方式。具体可参考如下的示例。
一、前台部分
界面设计如下:

前台XAML代码如下:
MainPage.xaml
说明:
在前台页面还增加了要素的Web在线编辑功能,如果要素来自于ArcSDE数据库,那么还可以同步跟新到后台的数据库。
二、后台代码
后台主要是实现查询,查询时通过QueryTask指定查询的图层以及声明查询的任务,QueryTask通过ExecuteAsync方法接收Query参数,然后开始查询,通过QueryCompleted事件返回查询的结果。
其中Query指定查询的条件和查询相关的参数,下面列出了Query的常用参数列表:
| 参数列表 | 参数说明 |
| Geometry | 指定查询的空间过滤器,并可通过Query.SpatialRelationship来描述查询的空间关系,有效的几何类型有:MapPoint, Polyline, Polygon, Envelope, or MultiPoint. |
| OutFields | 筛选的字段集合即要素包含的属性 |
| ReturnGeometry | 返回查询的几何要素,如果返回全部字段,则强制设置了ReturnGeometry为true |
| Source | 如果查询的是动态图层,这设置图层源 |
| SpatialRelationship | 描述空间查询被查询的要素与输入的几何要素的空间关系 |
| Text | 对应要素服务图层中显示的字段 |
| Where | 查询语句,由一条合法的SQL语句表示 |
下面看一下查询具体实现的方式:
首先声明QueryTask及查询的目标图层
//用于查询的Task
QueryTask queryTask = new QueryTask();
//查询的目标图层
FeatureLayer featurelayer;
//声明一个Draw,用于绘制查询的区域,进行空间查询
Draw myDraw;
在构造函数中赋值和实例化
public MainPage()
{
InitializeComponent(); featurelayer = map1.Layers["RiverSourceLayer"] as FeatureLayer; editorWidget.Loaded += new RoutedEventHandler(editorWidget_Loaded); queryTask.Url = featurelayer.Url;
queryTask.ExecuteCompleted += new EventHandler<QueryEventArgs>(queryTask_ExecuteCompleted);
queryTask.Failed += new EventHandler<TaskFailedEventArgs>(queryTask_Failed);
myDraw = new Draw(map1);
myDraw.DrawMode = DrawMode.Polygon;
myDraw.IsEnabled = false;
myDraw.FillSymbol = new SimpleFillSymbol()
{
BorderBrush=new SolidColorBrush(Colors.Black),
BorderThickness=3,
Fill=new SolidColorBrush (Colors.Red),
};
myDraw.DrawComplete += new EventHandler<DrawEventArgs>(myDraw_DrawComplete);
FiledsCombox.ItemsSource = AttributeString.GraphicAttributesEnNameString;
}
自定义两个查询方法:
StartQueryBySQL(string sqlString):按SQL 的Where语句进行查询。
private void StartQueryBySQL(string sqlString)
{
if (ExpressionTextBox.Text == "")
return;
Query query = new Query();
query.ReturnGeometry = true;
query.OutFields.AddRange(AttributeString.GraphicAttributesEnNameString);
query.Where = sqlString;
query.OutSpatialReference = map1.SpatialReference;
queryTask.ExecuteAsync(query);
}
StartQueryBySpatial(ESRI.ArcGIS.Client.Geometry.Geometry geometry):按绘制的空间图形进行查询
private void StartQueryBySpatial(ESRI.ArcGIS.Client.Geometry.Geometry geometry)
{
Query query = new Query();
query.ReturnGeometry = true;
query.OutFields.AddRange(AttributeString.GraphicAttributesEnNameString);
query.Geometry = geometry;
query.OutSpatialReference = map1.SpatialReference;
queryTask.ExecuteAsync(query);
}
接下来就是点击不同的按钮进行查询了,并对查询的结果进行处理,例如在地图上显示查询的结果。
注:本文由于查询的是点要素,所以在查询的Completed事件完成函数中只对点进行了Symbol显示操作,如果查询的结果是面要素还需对面进行处理,读者可自行添加。
下面是查询完成对结果处理的代码:
private void queryTask_ExecuteCompleted(object sender, QueryEventArgs e)
{
GraphicsLayer graphicsLayer = map1.Layers["QueryResultLayer"] as GraphicsLayer;
graphicsLayer.ClearGraphics(); if (e.FeatureSet.Features.Count > )
{
foreach (Graphic resultFeature in e.FeatureSet.Features)
{
resultFeature.Symbol = new SimpleMarkerSymbol()
{
Color=new SolidColorBrush(Colors.Red),
Size=,
Style=SimpleMarkerSymbol.SimpleMarkerStyle.Circle,
};
graphicsLayer.Graphics.Add(resultFeature);
}
}
else
{
MessageBox.Show("没有查询到目标要素!");
}
}
空间查询时在Draw的Competed事件中提交空间查询请求:
private void myDraw_DrawComplete(object sender, DrawEventArgs e)
{
StartQueryBySpatial(e.Geometry);
myDraw.IsEnabled = false;
}
其他部分的代码就是对查询的输入进行的一下控制,以及对程序Bug的一些处理(当然依旧还有些bug没有修复,不过不影响查询的整体功能,读者可以自己再修改完善)。
下面给出完整的代码:Coding-Behind
最后的效果示意图(结果用红色的点表示,点击要素可查看其属性列表):
1.Where查询:
a、查询条件一:Source_ID > 1 and Source_ID < 20 and Source_ID ! = 14
查询结果:

b、查询条件二:Source_ID > 1 and Source_Emissions is not null and Source_Emissions < 200
查询结果:

c.空间查询
输入查询多边形:

查询出多边形内的要素:

源码及测试数据下载:【下载代码】
数据使用说明:压缩文件中的的数据为ArcMap导出的XML文件,使用时,在ArcMap中新建一个地理数据库,然后右键导入,选择该xml文件,即可生成本例的数据。建议将该数据的服务发布成要素服务,这样支持Web在线编辑。
(版权所有,转载请标明出处)
使用ArcGIS API for Silverlight 进行复合多条件空间查询的更多相关文章
- ArcGIS api fo silverlight学习一(silverlight加载GeoServer发布的WMS地图)
最好的学习资料ArcGIS api fo silverlight官网:http://help.arcgis.com/en/webapi/silverlight/samples/start.htm 一. ...
- ArcGIS API for Silverlight动态标绘的实现
原文:ArcGIS API for Silverlight动态标绘的实现 1.下载2个dll文件,分别是: ArcGISPlotSilverlightAPI.dll 和 Matrix.dll 其下载地 ...
- ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题
原文:ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题 问题:如果在地图上加载成百上千工程点时,会密密麻麻,外观不是很好看,怎么破? 解决方法: ...
- ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法
原文:ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法 群里好几个朋友都提到过这样的问题,说他们在Silverlight中调用了WebServi ...
- ArcGIS API for Silverlight 调用GP服务绘制等值面
原文:ArcGIS API for Silverlight 调用GP服务绘制等值面 GP服务模型如下图: 示例效果图片如下:
- ArcGIS API for Silverlight代码中使用Template模板
原文:ArcGIS API for Silverlight代码中使用Template模板 在项目开发中,会遇到点选中聚焦闪烁效果,但是因为在使用Symbol的时候,会设置一定的OffSetX和OffS ...
- ArcGIS API for Silverlight实现地图测距功能
原文:ArcGIS API for Silverlight实现地图测距功能 问题:如何实现地图测距功能? 地图工具栏 <Grid x:Name="gToolMenu" Hei ...
- ArcGIS API for Silverlight 加载google地图
原文:ArcGIS API for Silverlight 加载google地图 using System; using System.Net; using System.Windows; using ...
- ArcGIS API for Silverlight 绘制降雨路径动画
原文:ArcGIS API for Silverlight 绘制降雨路径动画 #region 降雨动画演示 2014-04-16 List<Graphic> graphics = new ...
随机推荐
- .NET 4 并行(多核)编程系列之四 Task的休眠
原文:.NET 4 并行(多核)编程系列之四 Task的休眠 .NET 4 并行(多核)编程系列之四 Task的休眠 前言:之前的几篇文章断断续续的介绍了Task的一些功能:创建,取消.本篇介绍Tas ...
- DisplayContent、StackBox、TaskStack笔记
文章仅零散记录自己的一点理解,仅供自己參考. 每一个显示设备,都有一个Display对象,DisplayManagerService专门管理这些Display. 1.DisplayContent() ...
- cocos2d-x -- 渠道SDK【棱镜】接入(1)
棱镜SDK简单介绍 若想让游戏上线,渠道接入步骤是不可缺少的,为了避免一对一接入渠道问题,我选择了棱镜SDK,由于棱镜是游戏与渠道SDK的中间层,为CP厂商屏蔽各个渠道SDK之间的差异,整个接入过程, ...
- STL中间set具体用法!!!!
1.关于set C++ STL 之所以得到广泛的赞誉,也被非常多人使用.不仅仅是提供了像vector, string, list等方便的容器,更重要的是STL封装了很多复杂的数据结构算法和大量经常使用 ...
- js实现鼠标拖拽div-------Day44
假设去问这样一个问题"你认为鼠标操作简单,还是键盘操作简单",相信会有多数人都会回答鼠标吧,毕竟键盘button那么多,假设手小了或者手法不规范了,太easy出问题了,也对操作的速 ...
- 如何识别SQL Server中的CPU瓶颈
原文:如何识别SQL Server中的CPU瓶颈 原文出自: http://www.mssqltips.com/sqlservertip/2316/how-to-identify-sql-server ...
- SQL Server中tempdb的管理
原文:SQL Server中tempdb的管理 资料来自: http://blogs.msdn.com/b/sqlserverstorageengine/archive/tags/tempdb/ ht ...
- C代码分析器(一个 公开赛冠军)
最近心血来潮,我希望能写一个通用的代码分析工具(其实这个词有点太.事实上为C代码).看到这几天我看到代码头晕眼花,尽管Source Insight救命,仍然没有足够的智慧思考很多地方. 如今主要遇到的 ...
- JS封深入了解
1. javascript 语言理解闭包 js变量的范围分成两个:全局变量.局部变量.在全局变量的函数外声明变量,内部功能可以直接调用全局变量.声明变量里面的函数必须使用var 命令,否则,它里面的函 ...
- cocos2d 简单的日常高仿酷跑游戏
1.第一个直接看看这个游戏看起来视频(GIF我们不能满足游戏展) 跑酷游戏最纠结的是地图.碰撞倒是简单,能够自己写或者使用box2d等物理引擎.跑酷游戏地图的特点就是随机性.可是随机中又有策划特意安排 ...