在之前的查询中有部分的读者希望能够提供查询关联数据表的例子,今天有时间于是就来分享一下我自己的完整过程,本文将从数据的准备,创建要素与表之间的关系类,带有关联表的要素服务的发布,以及客户端调用实现关联数据的查询等来介绍实现的过程和细节。
本次主要介绍关系类以及服务的发布,在下一节将介绍查询的实现细节。
首先我们来看一个例子,这是我在学习以及项目中遇到的例子,通过这个例子我们来粗略的说一下什么是关系类以及我们可以用它来做什么。
我们知道一个污染源要素可能具备很多的要素属性,例如污染源信息,排放口数据,污染物数据等,简单可用下图表示:
而污染源基本信息有包含更多的信息,例如污染源的属性编码,污染物种类,排放量,负责人,联系电话,企业规模等,如下图所示:
同样排放口也具有很多的内容,如下图所示:
从上面我们可以知道,一个污染源具有丰富的信息,如果将一个点要素看作是一个污染源,那么这些应该都是点要素的属性,然而如果我们将这些信息都逐一添加到一个点要素的属性中(作为要素的一个字段),可见要素的字段有多么的庞大,这样看来是不可取的。
第一:一个要素的属性太多,展示给用户的数据就越多,这样就需要设置哪些向用户展示哪些不需要,因为不是所有的数据用户都可见,也不是所有的数据都需要一起展示。
第二:将要素的基本属性和污染源的属性分开可以提高不必要的数据访问,只有当用户需要知道的时候,选择查询即可,这样既能减少对数据的暴露,也能节省资源的开支。
因此有没有一种办法就是将污染源的一些常规属性(经纬度,总排放量,联系电话等)和其他属性(污染源具体信息,排放口信息,污染物具体信息等)分开,当用需要知道某一污染源的基本属性时就展示给用户关于污染源的基本属性,当用户需要知道排放口的数据时,就展示给用户排放口的数据呢?答案是肯定的,这就是关系类可以为我们做的事。
比如我们可以将经纬度等常用属性作为一个点要素的Attribute(要素本身的属性),而其他的信息做成一张表,然后将这张表和要素进行关联,如下图所示:
当要素和属性表关联之后,就相当于一个污染源对应了一张属性表(1- 1关系),或一个污染源对应了多个排放口(1-M一对多关系)。这种关系就可以通过关系类来实现,关于关系类的具体信息可以查看ArcGIS官网帮助文档,本文将介绍如何来创建一个要素的关系类,主要是介绍创建要素与表之间的关系。
既然是要素与表之间的关系,那么首先需要一个要素和一张表。
下面是本文使用的要素列表(关系类已经构建完毕了):
这个符号表示关系类。
下面就来看一下如何构建数据和关系类。
1.连接到ArcSDE数据库,在10.1版本中可用直连的方式连地理数据库,而不需要安装ArcSDE。
2.在ArcSDE数据库中新建点要素(以本文为例),在本文中即表示污染源的点要素(上面的数据列表中一个表示河流污染源一个表示大气污染源),右键地理数据库选择 新建(new)-FeatureClass(建表同样的操作)。
然后添加相应的属性,如下图所示:
同时新建两个表:污染源基本信息表,和排放口基本信息表,这里建两个表的用意是演示污染源1 -1(1对1)和1 - M(1对多)的关系。
污染源基本信息表:
排放口基本信息表:
新建数据之后,添加关系类,和上面新建要素的过程一样,选择Relationship Class即可。
点击下一步:
关联的关系类型:简单表示源与目标之间默认相互独立,即源删除,目标不会被删除,而复杂表示源删除则目标也会被删除,这里我们选择复杂,因为污染源删除了,污染源基本信息表和排放口基本信息表也会被删除(不是删除表而是删除相关联的数据)。
之后点击下一步:
输入源指向目标时和目标指向源时的名称以及消息传递的方向,具体可参考官网的帮助文档,之后点击下一步:
选择对应关系,即使1对1还是1对多,根据实际情况而定,这里是污染源与基本信息之间的关系,所以是1 对1,即一个污染源对应一张基本信息表(之后污染源与排放口的对应关系为1对多,因为一个污染源可以有多个排放口)。之后点击下一步:
是否将关联属性添加到关系类中,一般情况下选 NO.然后点击下一步,
设置源与目标关联的字段(主键和外键),这里我们将污染源编号设置为关联的字段(经测试发现关联的字段必须为ObjectID或integer数据类型,否则在Web端查询关联数据时无法查询到结果)
之后点击下一步,完成关系类的创建工作。同理重复污染源与排放口信息表的关系类的创建。
要素,表及关系类创建之后便是准备MXD文档,发布带关联数据表的要素服务。具体操作如下:
1.添加ArcSDE中的要素和表(即上述过程创建的污染源要素和表)。
右键图层-添加数据
浏览到数据库连接,打开地理数据库,选中要素和表:
然后定义一下污染源的样式:
保存文档,发布MXD文档:
在服务参数中勾选Feature Access,这样带有关联数据表的要素服务发布完成。打开GIS服务列表,即可参看到关联数据的相关信息:
点击大气污染源,可发现Relationships内容如下:
这样我们就可以将一个要素一起属性表关联起来,通过发布成要素服务,可在Web端进行查询访问。关于Web端的例子可参看官网的例子:
http://help.arcgis.com/en/webapi/silverlight/samples/start.htm#QueryRelatedRecords
官网带关系数据的要素服务:
http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Petroleum/KSPetro/MapServer/0
下一篇将介绍Web端对要素关系数据表的查询,当然从官网的例子你大概也知道实现的过程了,不过下篇主要介绍基于Windows Phone平台的信息查询和信息显示,由于Windows Phone 没有诸如Silverlight的DataForm,DataGrid控件,所以对数据的显示和Silverlight还不太一样,同时下篇的内容也是笔者本科毕业设计的部分内容,欢迎继续关注。