WebGis应用系统中松散数据耦合的实现策略研究
2017-03-24曹忠
曹忠
摘要:数据耦合是应用系统开放与互连的重要保障机制,也是系统数据共享关键技术。本文作者结合基于WebGis的应用程序开发实践,探讨Arcgis Server9.2平台上的GIS数据与常见外部数据源之间进行松散数据耦合的方法与过程,给出具体的代码实现流程,以期对同类应用开发提供一定的指导与借鉴作用。
关键词:数据耦合;Arcgis Server9.2平台;GIS应用;实现策略
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)01-0224-03
Abstract:Data Coupling is a very important mechanism in Applications open and interconnected. It is else a key technology about system data sharing. The article based on Development practices in WebGis Applications, Discussed the Methods and Process in loosely data coupling about Gis data and common External data sources, and provide specific code and implementation process, wish to provide some guidance and reference in The development of similar applications.
Key words:Data Coupling; Arcgis Server9.2; Gis Application; Implementation strategy
1 引言
GIS[1-2]是一个时空一体的综合业务应用系统[5],地理信息系统中的所使用的数据一般包括GIS本身数据与外部数据,本身数据是指GIS地图中所带的空间位置数据、拓扑关系数据、基本属性数据,当然还包括部分存储在外部数据库(如Oracle数据库)中的扩展属性数据,也叫基础数据或系统数据[1-2]。外部数据则是指所有可能与GIS地图空间数据发生关系的各种应用系统的数据,也叫扩展数据或外延数据,是GIS系统集成其他已有应用系统数据信息,充分发挥GIS功能的平台特性的数据来源。ArcGIS Server是基于服务器的计算和空间服务的GIS基础平台,系统在支持高性能Web制图功能的同时,还提供了充分利用ArcGIS空间分析工具和功能实现的、面向服务的解决方案,为构建功能强大的企业应用软件提供了基础支持[3-4]。
在GIS平台中,就涉及一个如何调用外部数据、如何进行有效的数据关联的问题,这就是数据共享问题,而数据共享机制是开放系统的前提与基础,是网络综合应用平台的发展方向[4]。本文结合开发省际警务GIS平台的项目实践,较系统地介绍GIS平台数据与外部数据进行耦合关联的三种方式,并具体介绍每一种方式的技术实现方法。
2 图数耦合机制
数据耦合的主要目的是将地理信息系统中的内部数据和外部应用程序的数据建立出映射关系,主要包括:(1)一对一关系:GIS基础数据记录与外部应用数据记录间通过关键字段建立起一对一关系;(2)一对多关系:GIS是空间分层数据,有时一个点可表示一个位置(或一个对象),对象GIS基础数据的对象名与外部数据的记录间建立起一对多的关系。如GIS地图中的一个小区点对象,可通过小区点对象的名称属性与人口数据表中的居住地地址关联,就建立了一对多的关;(3) 个体关联:对于GIS中的特殊实体对象,可能只能与外部数据库中的实体对象联系起来,就必须要建立实体关联。如要将赣江实体与赣江水文数据库联系起来,而与其他的河流无关;(4)行为关联:实际上这是建立两个应用程序的接口,由GIS系统中某个对象的特定行为激发外部应用系统的相应操作。
对于上面的描述的关联,实质上就是构建GIS数据与外部数据之间的三种关联模式:结构(属性)关联、数据关联和行为关联。结构关联是指在数据表的结构层建立起关联关系,以达到表间的所有数据都建立起对应关系;而数据关联则是建立起空间表中某个对象与外部的联系,行为关联则是建立GIS特定对象上的某个操作所产生的外部应用程序行为。
3 数据耦合流程
数据关联的实现流程,主要包括以下几个步骤:
1)先设计好关联模型(是结构关联、数据关联还是行为关联)
2)选择需要关联的Map控件数据/Geodatabase数据对象;
3)选择需要关联的外部数据源或外部程序;
4)确定关联关系并存入关联数据表中;
5)写入用户工作日志。
在省警Gis信息平台中有关结构耦合与数据耦合设置的界面如图二、三所示。
對于内部关联的数据来源于当前GIS应用程序内部,可从map控件中获取;外部关联条件应先获取已设置好的数据源,可通过ODBC面版来设置关系数据源;对于结构关联属性之间必定是相等的关系;对于内部和外部关联条件设置时,各控件间应建立有连动机制,即选择数据源后,数据表的下拉列表中只有选中数据源的表格,而选择数据表后,属性字段也必须建立连动机制。
4 数据耦合实现的关键技术
4.1对Arcgis Server中的图层、字段及数据的获取方式
要创建内部数据和外部数据间的耦合,首先获取需要进行查询的内部图源,检查当前程序是否支持ArcGIS中的查询函数。如果支持则调用GetQueryableLayers图层查询函数对图层进行遍历,最后读取图层名并对图层选择下拉列表框ddlLayer进行填充。
ESRI.ArcGIS.ADF.Web.DataSources.ImapFunctionality mf = (ESRI.ArcGIS.ADF.Web.DataSources.IMapFunctionality)Map1.GetFunctionality(0);
ESRI.ArcGIS.ADF.Web.DataSources.IGISResource gisresource = mf.Resource; //获取内部数据源
bool supported = gisresource.SupportsFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality));
if (supported)
{
ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality qfunc = (ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality)gisresource.CreateFunctionality(typeof(ESRI.ArcGIS.ADF.Web.DataSources.IQueryFunctionality), null);
string[] lids;
string[] lnames;
qfunc.GetQueryableLayers(null, out lids, out lnames);//调用GetQueryableLayers函数
for (int i = 0; i < lnames.Length; i++)//对图层进行遍历
{ ddlLayer.Items.Add(lnames[i]); }//对图层选择下拉列表框进行填充
}
…
String[] pFields = qfunc.GetFields(null, lids[layer_index]);
for (int i = 0; i < pFields.Length; i++)//对图层的属性字段进行编历
{this.ddlField.Items.Add(pFields[i].ToString());}//对属性字段选择下拉列表框进行填充
…
sc.Add(this.ddlField.SelectedItem.Text.Trim());//获取所要查询数据的字段
pQF.SubFields = sc;
DataTable DT = pQueryFun.Query(null,lids[Convert.ToInt32(Session["CurrentLayer"])], pQF);//把数据存储到临时表DT中
Session.Remove("CurrentLayer");
int n = DT.Rows.Count;
for (int i = 0; i < n; i++)//对数据进行遍历
{this.ddlObject.Items.Add(DT.Rows[i][this.ddlField.SelectedItem.Text.Trim()].ToString());
}
4.2 外部数据源连接技术
在准备好了需要进行耦合的内部数据外,还要对外部数据源进行连接准备,包括设置连接对象、读取表名及读取字段结构等步骤,以连接Oracle10g为例进行说明:
(1) 连接Oracle数据库:
OracleConnection conn = new OracleConnection("Data Source=" + txtInstance.Text + ";User ID=" + txtUser.Text + ";Password=" + txtPwd.Text + ";Unicode=True;");
(2) 读取Oracle表名:
OracleCommand cmd = new OracleCommand("select table_name from all_tables where table_name not like '%$%'", conn);
OracleDataReader odr = cmd.ExecuteReader();
this.ddlTable.DataSource = odr;
this.ddlTable.DataTextField = "table_name";
(3) 读取Oracle表的字段名:
OracleCommand cmd = new OracleCommand("select A.column_name from user_tab_columns A where A.Table_Name='" + this.ddlTable.SelectedItem.Value + "'", conn);
OracleDataReader odr1 = cmd.ExecuteReader();
this.ddlProperty.DataSource = odr1;
this.ddlProperty.DataTextField = "COLUMN_NAME";
4.3 耦合條件生成
首先获取关联图层和关联信息内容,其中关联信息内容在结构关联中指图层结构字段,在数据关联和行为关联中指地图中的对象名称。通过关联图层和关联信息内容判断之前数据库中是否存有该条记录,若有,则直接获取该条记录的内部关联编号;若没有,则在原最大内部关联编号上加一,得到新记录的内部关联编号,并把格式统一为000X,如果内部关联信息表没记录,那么就把第一条记录的内部关联编号设为0001。最后把内部关联编号、关联图层、关联信息内容等插入到内部关联信息表中。
gltcbh = this.ddlLayer.SelectedItem.Value;//关联图层
glxxnr = this.ddlObject.SelectedItem.Value;//关联信息内容
OracleConnection conn = OracleDB.createConnection();
try
{
conn.Open();
string strSelect_nbgl = "select nbglbh from nbglxxb where gltcbh='" + gltcbh + "' and glxxnr='" + glxxnr + "'";
…
//没有读到则建立新的内部关联编号插入
string strSelect = "select nbglbh from nbglxxb";
OracleDataAdapter sda = new OracleDataAdapter(strSelect, conn);
DataSet ds = new DataSet();
sda.Fill(ds);
…
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "insert into nbglxxb values('" + nbglbh1 + "','" + gltcbh + "','" + glxxnr + "','"+txt_dx.Text+"')";
cmd.ExecuteNonQuery();
5 结束语
通过数据耦合的方式的设置,使本系统地理空间数据与外部相关的信息数据之间建立了增强型的联系,一方面,极大地扩展了系统原本拥有的信息量,为用户查询提供了更丰富的信息资源。同时,也为外界系统共享本系统的内容数据提供了一个良好的接口,为本系统成为一个真正开放共享的资源平台的一部分奠定了相应的技术基础。
从另一方面,GIS本身是一个时空系统[5][6],通过数据耦合等数据共享机制的探讨,对拓宽GIS系统数据的来源提供了另一思路,希望对后期同类软件的开发提供一定的借鉴与参考作用。
参考文献:
[1]陈显军,等.基于.NET的组件式WebGIS系统设计與实现[J].现代计算机,2012(17).
[2]谢安涛,唐建智,许文波.基于Hibernate Spatial构建松散耦合地图服务的技术方法[J].地理信息世界,2010(3).
[3]赵自力, 王东华, 周晓光.基于ArcGIS Server的网络GIS应用系统开发[J].遥感信息2007(1).
[4]吴功和, 丛明日.基于ArcGIS Server的分布式GIS应用[J].测绘科学技术学报,2006,23(1).
[5]王洪伟, 张立朝, 张海东.分布式ArcGIS Server体系结构的研究与开发[J].测绘科学技术学报,2007,24(2).
[6]CSDN-浩淼的天空ArcGIS Engine简介
http://blog.csdn.net/chiangbt/archive/2008/08/06/2775151.aspx
[7]林广发. 基于事件的时空数据模型研究[J].测绘学报,2004(3).
[8]龚健雅.GIS中面向对象的时空数据模型[J].测绘学报,1997(4).