原文:使用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及查询的目标图层

  1. //用于查询的Task
  2. QueryTask queryTask = new QueryTask();
  3. //查询的目标图层
  4. FeatureLayer featurelayer;

//声明一个Draw,用于绘制查询的区域,进行空间查询
          Draw myDraw;

在构造函数中赋值和实例化

  1. public MainPage()
  2. {
  3. InitializeComponent();
  4.  
  5. featurelayer = map1.Layers["RiverSourceLayer"] as FeatureLayer;
  6.  
  7. editorWidget.Loaded += new RoutedEventHandler(editorWidget_Loaded);
  8.  
  9. queryTask.Url = featurelayer.Url;
  10. queryTask.ExecuteCompleted += new EventHandler<QueryEventArgs>(queryTask_ExecuteCompleted);
  11. 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);

  1. FiledsCombox.ItemsSource = AttributeString.GraphicAttributesEnNameString;
  2. }

自定义两个查询方法:

StartQueryBySQL(string sqlString):按SQL 的Where语句进行查询。

  1. private void StartQueryBySQL(string sqlString)
  2. {
  3. if (ExpressionTextBox.Text == "")
  4. return;
  5. Query query = new Query();
  6. query.ReturnGeometry = true;
  7. query.OutFields.AddRange(AttributeString.GraphicAttributesEnNameString);
  8. query.Where = sqlString;
  9. query.OutSpatialReference = map1.SpatialReference;
  10. queryTask.ExecuteAsync(query);
  11. }

StartQueryBySpatial(ESRI.ArcGIS.Client.Geometry.Geometry geometry):按绘制的空间图形进行查询

  1. private void StartQueryBySpatial(ESRI.ArcGIS.Client.Geometry.Geometry geometry)
  2. {
  3. Query query = new Query();
  4. query.ReturnGeometry = true;
  5. query.OutFields.AddRange(AttributeString.GraphicAttributesEnNameString);
  6. query.Geometry = geometry;
  7. query.OutSpatialReference = map1.SpatialReference;
  8. queryTask.ExecuteAsync(query);
  9. }

接下来就是点击不同的按钮进行查询了,并对查询的结果进行处理,例如在地图上显示查询的结果。

注:本文由于查询的是点要素,所以在查询的Completed事件完成函数中只对点进行了Symbol显示操作,如果查询的结果是面要素还需对面进行处理,读者可自行添加。

下面是查询完成对结果处理的代码:

  1. private void queryTask_ExecuteCompleted(object sender, QueryEventArgs e)
  2. {
  3. GraphicsLayer graphicsLayer = map1.Layers["QueryResultLayer"] as GraphicsLayer;
  4. graphicsLayer.ClearGraphics();
  5.  
  6. if (e.FeatureSet.Features.Count > )
  7. {
  8. foreach (Graphic resultFeature in e.FeatureSet.Features)
  9. {
  10. resultFeature.Symbol = new SimpleMarkerSymbol()
  11. {
  12. Color=new SolidColorBrush(Colors.Red),
  13. Size=,
  14. Style=SimpleMarkerSymbol.SimpleMarkerStyle.Circle,
  15. };
  16. graphicsLayer.Graphics.Add(resultFeature);
  17. }
  18. }
  19. else
  20. {
  21. MessageBox.Show("没有查询到目标要素!");
  22. }
  23. }

空间查询时在Draw的Competed事件中提交空间查询请求:

  1. private void myDraw_DrawComplete(object sender, DrawEventArgs e)
  2. {
  3. StartQueryBySpatial(e.Geometry);
  1. myDraw.IsEnabled = false;
  1. }

其他部分的代码就是对查询的输入进行的一下控制,以及对程序Bug的一些处理(当然依旧还有些bug没有修复,不过不影响查询的整体功能,读者可以自己再修改完善)。

下面给出完整的代码:Coding-Behind

MainPage.cs
AttributeString.cs

最后的效果示意图(结果用红色的点表示,点击要素可查看其属性列表):

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 进行复合多条件空间查询的更多相关文章

  1. ArcGIS api fo silverlight学习一(silverlight加载GeoServer发布的WMS地图)

    最好的学习资料ArcGIS api fo silverlight官网:http://help.arcgis.com/en/webapi/silverlight/samples/start.htm 一. ...

  2. ArcGIS API for Silverlight动态标绘的实现

    原文:ArcGIS API for Silverlight动态标绘的实现 1.下载2个dll文件,分别是: ArcGISPlotSilverlightAPI.dll 和 Matrix.dll 其下载地 ...

  3. ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题

    原文:ArcGIS API for Silverlight地图加载众多点时,使用Clusterer解决重叠问题 问题:如果在地图上加载成百上千工程点时,会密密麻麻,外观不是很好看,怎么破? 解决方法: ...

  4. ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法

    原文:ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法 群里好几个朋友都提到过这样的问题,说他们在Silverlight中调用了WebServi ...

  5. ArcGIS API for Silverlight 调用GP服务绘制等值面

    原文:ArcGIS API for Silverlight 调用GP服务绘制等值面 GP服务模型如下图: 示例效果图片如下:

  6. ArcGIS API for Silverlight代码中使用Template模板

    原文:ArcGIS API for Silverlight代码中使用Template模板 在项目开发中,会遇到点选中聚焦闪烁效果,但是因为在使用Symbol的时候,会设置一定的OffSetX和OffS ...

  7. ArcGIS API for Silverlight实现地图测距功能

    原文:ArcGIS API for Silverlight实现地图测距功能 问题:如何实现地图测距功能? 地图工具栏 <Grid x:Name="gToolMenu" Hei ...

  8. ArcGIS API for Silverlight 加载google地图

    原文:ArcGIS API for Silverlight 加载google地图 using System; using System.Net; using System.Windows; using ...

  9. ArcGIS API for Silverlight 绘制降雨路径动画

    原文:ArcGIS API for Silverlight 绘制降雨路径动画 #region 降雨动画演示 2014-04-16 List<Graphic> graphics = new ...

随机推荐

  1. NET开发者部署React-Native

    NET开发者部署React-Native 前情摘要 众所周知,有人说.net可以用Xamrian,呵呵,不习惯收费的好么?搞.Net的人设置一次java的环境变量,可能都觉得实在太麻烦了,可能是因为这 ...

  2. mysql 多个字段拼接

    Mysql的查询结果行字段拼接,能够用以下两个函数实现: 1. concat函数 mysql> select concat('1','2','3') from test ; +--------- ...

  3. 介绍一款替代SSMS的sqlserver管理工具 toad for sqlserver5.7

    原文:介绍一款替代SSMS的sqlserver管理工具 toad for sqlserver5.7 toad for sqlserver5.7 虽然SSMS很好很强大,不过有时候使用一些第三方工具可以 ...

  4. RH133读书笔记(9)-Lab 9 Installation and System-Initialization

    Lab 9 Installation and System-Initialization Goal: Successfully install Red Hat Enterprise Linux. Sy ...

  5. FPGA合成编码

    1 决策树 于FPGA推断使用if else报表及case达到. a) if else 是有特权的,类似于优先编码(当两个条件同一时候成立,仅推断条件靠前的成立),所以当有特权条件时应该採用if el ...

  6. iOS开发无第三方控件的援助达到的效果侧边栏

    最近的研究iOS程序侧边栏.渐渐的发现iOS该方案还开始采取风侧边栏格该,QQ,今日头条,Path(Path运营商最早的侧边栏app该,效果说成是Path效果),所以就研究了下. 然后发现Git Hu ...

  7. Android文本Flood it游戏源代码

    flood_it 流行的Flood it游戏的Android版 游戏玩法: 按下屏幕下方的颜色button,左上角的色块就会变颜色.仅仅要把整片色块变成同色就赢了. 效果图 <ignore_js ...

  8. Oracle左连接、右连接、全外连接以及(+)号用法(转)

    +:与附带的字段相连,和“+”相连的字段值,不管是否存在,都会展示 也就是带上相连接的字段 有数据了就显示,没数据就显示为null Oracle  外连接(OUTER JOIN) 左外连接(左边的表不 ...

  9. Javascript设计模式与开发实践读书笔记(1-3章)

    第一章 面向对象的Javascript 1.1 多态在面向对象设计中的应用   多态最根本好处在于,你不必询问对象“你是什么类型”而后根据得到的答案调用对象的某个行为--你只管调用行为就好,剩下的一切 ...

  10. X86在逻辑地址、线性地址、理解虚拟地址和物理地址

    参考:http://bbs.chinaunix.net/thread-2083672-1-1.html 本贴涉及的硬件平台是X86.假设是其他平台,不保证能一一对号入座.可是举一反三,我想是全然可行的 ...