AjaxMap的开发接口与SuperMap IS原有的WebControl开发的接口非常相似,它提供了SuperMap GIS的传统功能,从基本的地图操作,到强大的空间分析,几乎囊括了GIS系统的所有主要功能。对于熟悉脚本语言的开发人员来说,从使用WebControl开发转向使用AjaxMap,只需要理解Ajax模式,而这个需求,也主要是为了将GIS系统与业务系统更好的融合。
字串3
与使用WebControl开发不同的是,AjaxMap目前并未提供对地图对象进行编辑的功能接口。因此,如果要提供修改AjaxMap上地物的服务,就需要根据实际的应用去自定义程序逻辑。由于没有接口可以去更改AjaxMap由地图服务获得的图片,实现编辑地图的功能,因此需要通过AjaxMap提供的自定义层——CustomLayer。同时,因为不能直接访问和修改SuperMap的空间数据,需要自定义数据存储结构来存放这些地物的相关信息——包括空间信息和属性数据。此时,CustomLayer就是将开发人员自定义的空间信息与原有地图服务相融合的平台(如图1所示)。 字串9

图1自定义地图对象数据流结构图 字串8
通过CustomLayer可以将自定义的空间信息绑定到原有地图上。由于这些空间信息有独立的存储逻辑,开发人员可以灵活的设计数据的来源和结构,以及各种各样的数据更新策略,从而及时响应数据的变化。因此,虽然自定义空间信息不能直接参与基于SuperMap格式的空间分析,但是能够更灵活的与业务逻辑相融合,并反映数据的实时变化。在数据结构的设计上,只需要保持能够定位一个几何图形的空间信息,就能够将相应的数据记录表示在地图上。 字串9
以最常用的点数据为例,应用系统经常需要将临时设置的特殊位置在地图上标示出来,这些信息都是以一条数据记录对应地图上的一个位置点来表示。此时,来自业务逻辑的这些信息,组合相对应的位置点坐标,就构成了自定义的空间信息。通过CustomLayer就能将这些位置点在地图上标示出来。
同时,由于添加在CustomLayer中的地图对象是由开发人员来控制其呈现的逻辑和样式,并且具有自定义的存储逻辑,对这些地图对象的源数据的更新,就可以直接被反映在地图呈现上,从而及时响应数据的更新。 字串9
下面详细说明如何在AjaxMap中实现对自定义的动态位置点进行在线编辑的功能。
程序分成两个部分:呈现层与数据持久层,其结构如图2所示:

图2 点编辑模块结构图 字串6
这样的结构是与AjaxMap无关的,它更多的受到系统自身的业务逻辑影响。其中呈现层主要是客户端脚本,定义了相应的数据信息在页面上呈现的逻辑;数据持久层采用服务端脚本的形式,定义了与数据库交互的逻辑;XMLDOM对象执行对两层之间的数据交互和解析。 字串2
数据持久层与呈现层通过明确定义的接口进行交互,从而使两者实现各自的分离。数据持久层与数据结构定义相关联,由具体的数据结构来决定其采用的动作。持久层将交互的结果以标准XML格式向客户端输出,呈现层解析来自持久层的输出,以获取需要的信息。数据保存在Access数据库中,持久层通过构建SQL语句操作数据。
表一 自定义数据存储的表结构
字串2
字串4
持久层定义:
持久层由两部分构成:1、查询;2、编辑。
查询模块负责在页面初始化时从数据库中读出所需信息,并以XML格式输出到客户端。
示例代码如下:
<%
dim conn, mdbfile, rs, connstr, rs1
dim strResult
dim strID, strDx, strDy, strName 字串2
mdbfile = server.mappath("db1.mdb")
set conn = server.createobject("adodb.connection") 字串2
connstr="DBQ="+mdbfile+";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};"
conn.open connstr
strResult = "<queryresult>"
字串9
set rs = server.createobject("adodb.recordset")
connstr = "select * from [mypoint] where valid='yes'"
rs.open connstr, conn
while not rs.eof
strID = rs("id").value
strDx = rs("dx").value
strDy = rs("dy").value
strName = rs("name").value
strResult = strResult & "<item id='" & strID & "' dx='" & strDx & "' dy='" & strDy & "' name='" & strName & "' type='1' />" 字串8
rs.movenext
wend
rs.close 字串2
set rs1 = server.createobject("adodb.recordset")
connstr = "select * from [mypoint1] where valid='yes'"
rs1.open connstr, conn
while not rs1.eof
strID = rs1("id").value
strDx = rs1("dx").value
strDy = rs1("dy").value
strName = rs1("name").value
strResult = strResult & "<item id='" & strID & "' dx='" & strDx & "' dy='" & strDy & "' name='" & strName & "' type='2' />" 字串2
rs1.movenext
wend
rs1.close
conn.close 字串1
strResult = strResult + "</queryresult>"
response.write strResult
%>
在查询模块中,首先建立与数据库的连接:
mdbfile = server.mappath("db1.mdb")
set conn = server.createobject("adodb.connection") 字串3
connstr="DBQ="+mdbfile+";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};"
conn.open connstr
随后从数据库中读出符合需求的信息,并将取出的信息组织成XML格式写在变量strResult中,最后输出到客户端:
response.write strResult
编辑模块根据客户端提交的动作参数,对数据库进行相应操作,并将完成状态的数据再组织成XML格式,输出到客户端,使呈现层能够及时体现数据的更新动作。编辑模块是整个功能实现的重点区域,它需要根据客户端的行为来操作数据库,这就需要能够分辨客户端动作。这与整个系统的业务逻辑是紧密相关的。同时,编辑模块的接口定义也决定了持久层的可扩展性与可重用性,并直接影响客户端业务逻辑的设定。
示例代码如下:
<%
dim conn, mdbfile, rs, connstr, rs1
dim strResult, strSql, strReq
dim strID, strDx, strDy, strName
dim tem1, tem2, tem3, tem4
mdbfile = server.mappath("db1.mdb")
set conn = server.createobject("adodb.connection") 字串5
strReq = request("sql")
sqlCase = Split(strReq, ",")
select case sqlCase(0)
case "1"
strSql = "insert into mypoint (dx,dy,name,valid) values (" & sqlCase(1) & "," & sqlCase(2) & ",'test','yes')"
case "2"
tem1 = sqlCase(1) - 10
tem2 = sqlCase(1) + 10
tem3 = sqlCase(2) - 10
tem4 = sqlCase(2) + 10
strSql = "update mypoint set valid='no' where dx>" & tem1 & " and dx<" & tem2 & " and dy>" & tem3 & " and dy<" & tem4
case else
end select
connstr="DBQ="+mdbfile+";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};"
conn.open connstr
conn.execute strSql 字串5
编辑模块首先接收客户端的参数:
strReq = request("sql") 字串9
这个参数的形式和意义就是编辑模块提供给客户端的调用接口。然后对参数进行解析。
sqlCase = Split(strReq, ",")
这个参数由3个部分构成,由”,”分隔开。参数的第一部分sqlCase(0)指明了客户端的动作标识,后面的部分是操作的参数,在这里是一个点的坐标。根据操作标识,编辑模块将接收到的点坐标组织成相应的SQL语句,执行对数据库的更新。

| 最新评论: |