毕业半年,又总结了一下之前的工作,发现很多知识不复习都忘记了。最近新闻总是报道北京的空气污染,各种雾霾,各种PM X超标,然后想到以后我们有饭吃了(俺也算是搞环境的科班出身,本科环境科学专业),然后联系到本科的毕业论文,刚好做的是大气污染相关的,于是闲来和大家分享一下,也算是对自己的之前工作的一个总结。
论文主要做的一个基于Web和Windows Phone平台的污染预测和污染源管理的应用,大体的功能就是根据污染物的扩散模型,对大气污染的扩散,浓度分布进行模拟和可视化表达,同时对排放污染物的污染源进行在线的管理和监测。
这里分享一下我的Windows Phone部分的毕设内容,主要实现的就是污染源的管理,例如污染源信息的增删改查。废话少说,下面就进入正题:
本次的主要内容大致有以下几个部分:
1.GIS服务部分,如何搭建GIS服务环境,如发布带有关系类的要素服务,及其注意事项
2.ArcGIS API for Windows Phone中的数据绑定,如要素信息的显示。
3.ArcGIS API for Windows Phone中要素信息的管理(添加要素,删除要素,编辑要素属性,查询属性)
4.ArcGIS API for Windows Phone中如何查询要素关联的数据表(非要素本身)
首先看一下最终的效果:
主界面,及查询页面
要素信息显示:
点击跟多查询污染源详细信息和排放口信息
添加或删除要素:
以上的内容大致就是毕设做的,其中还包括了GPS定位导航等,由于是模拟器,所以无法实现定位的功能。在此就不再多言。
一、ArcGIS API For Windows Phone 的地理要素属性编辑
在这里主要实现的功能是实现移动智能终端对污染源数据的访问及查询。这里采用中国ArcGIS Online所提供的中国地图作为本程序的底图,并在底图上加载污染源数据图层。污染源的数据图层类型应为FeatureLayer,其Url地址应指向ArcGIS Server发布的FeatureService中的地理要素资源。下面示例代码声明了一个FeatureLayer的图层:
<esri:FeatureLayer ID="ConverntionalSourceLayer" Url="http://qzj-pc/ArcGIS/rest/services/PollutionSourceInfo/FeatureServer/1" AutoSave="True" OutFields="*" MouseLeftButtonDown="FeatureLayer_MouseLeftButtonDown" />
在ArcGIS API for Windows Phone 中可以通过Editor组件完成要素的编辑工作。Editor编辑的对象要求是FeatureService中的要素资源。
如下所示声明了一个Editor:
<esri:Editor x:Key="MyEditor" LayerIDs="ConverntionalSourceLayer" GeometryServiceUrl= "http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer" EditCompleted="Editor_EditCompleted"/>
Editor组件包含以下编辑命令:
功能名称 | 功能说明 |
Add | 绘制并添加一个Graphic |
CancelActive | 取消编辑功能中所有激活的操作 |
ClearSelection | 取消选择所有已选择的Graphic |
DeleteSelected | 删除一个Graphic,如果此Graphic与可编辑的FeatureLayer关联,则该Graphic也会从地理数据库中删除 |
Cut | 通过一个geometry service服务剪辑某一Graphic |
EditVertices | 编辑Graphic的顶点,该功能针对多变要素的编辑 |
Reshape | 通过geometry service重新绘制某一选定的Graphic的形状 |
Save | 保存所有的编辑操作 |
Union | 通过geometry service连接所有选定的Graphic |
Select | 选择一个Graphic |
Editor中的每一个命令都包含了两个方法,一个是 CanExecute,一个是Execute方法,前一个方法用来判断该命令是否可以执行,当确认可以执行时,便开始执行相关操作。例如对于Add命令来说,其示例代码如下:
if (editor.Add.CanExecute("ConventionalSource")) editor.Add.Execute("ConventionalSource");
这里CanExecute以及Execute函数中的参数为编辑图层中特定模版的名称或者类型的ID值。图5.15显示了要素服务图层中的Templates属性。
其他操作类似于添加操作,不一样的地方为函数的输入参数不同,因此在此不再叙述。
在建立好编辑的图层以及声明了编辑的工具之后,下一步便是通过编辑工具对图层的信息进行查看和编辑。下图显示了移动终端访问地理数据库中相关要素的过程。
这里实现访问和编辑的核心是GIS服务,所有的操作都是通过GIS服务来完成的,其中GIS服务包含了常用的FeatureService,GeometryService,MapService等。
下图说明了移动终端访问的过程,以及Windows
Phone手机上的操作界面。
在设置好Edior工具之后,本文还定义了一个ListBox的控件,用来将污染源的属性绑定到ListBox的内容,这样当修改ListBox的内容时,同时也会更改污染源的属性,并将更改更新到后台的数据库中,从而达到对污染源属性进行编辑的效果。此外结合之前的Add方法以及删除方法,通过添加或删除一个污染源,那么就可以很好的完成关于污染源数据编辑以及数据提交的功能。最后的效果图如下所示:
二、ArcGIS API For Windows Phone 的地理要素属性查询
在本文中提供了两种查询方式,一种是按属性查询,一种是空间查询。两种查询的基本原理是一致。其查询的过程和原理与ArcGIS API for
Silverlight一致。都是通过QueryTask来实现查询的功能。
对于属性查询来说,是给定了查询的属性条件,例如我们只查询污染物排放量大于100kg的污染源,那么只需通过设置Query的where属性即可。
query.Where="PS_PollutionQ >100"; queryTask.ExecuteAsync(query);
对于空间查询实际上是通过设置Query的Geometry属性。首先通过一个Draw事件捕捉用户绘制的图形,然后将此图形赋值给Query的Geometry,最后执行查询,代码如下所示:
SpatialQuery.Geometry = e.Geometry;
queryTask.ExecuteAsync(SpatialQuery);
下图显示了按属性条件查询和按空间查询的效果图:
三、ArcGIS API For Windows Phone 的地理要素关联属性表查询
在关联属性表查询中和Silverlight同样是类似的,都是通过指定RelationshipParameter,来进行查询,例如下面声明的一个RelationshipParameter :
RelationshipParameter relationshipParameters = new RelationshipParameter() { //通过Source_ID字段来查询关联的数据 //需要注意的是用于查询的字段必须为Integer类型的(String类型的将查询不到结果) ObjectIds = new int[] { Convert.ToInt32(_SelectedGraphic.Attributes["Source_ID"])}, RelationshipId = _relationshipId, OutFields = outFildes, OutSpatialReference = BaseMap.SpatialReference, ReturnGeometry=true }; //UserToken指定为关联的ID值,这样可用来判断查询的结果是那一张表 queryTask.ExecuteRelationshipQueryAsync(relationshipParameters,_relationshipId);
最后即可查询关联的数据信息,最后的示意图:
PS:代码上传了好久没有成功,蛋疼的校园网啊,有需要代码的可以留言....我会将代码和测试数据发送到您的邮箱,关于GIS服务的发布,可以参见之前的系列博文,欢迎关注我的博客.....您的支持是我坚持不懈的动力。