文章正文

在AjaxMap上实现地图编辑

文章来源: 文章作者: 2007-10-05  字体:[ 我要投稿!
SuperMap IS .NET 提供的 AjaxMap ,采用了目前流行的最新 WEB 应用交互模式—— Ajax 架构模式。这种架构模式的技术最先由 GoogleMap 引入 WebGIS 开发中,并为 WEB 应用的架构与开发模式开辟了全新的视野,让 WEB 开发者们开始更多的思考和关注交互接口与用户感受。 SuperMap IS 果断的引入 Ajax 模式,并很好的与原有开发模式相融合,通过一致的接口形式,保持了 SuperMap IS 一贯的简洁、高效,为 WebGIS 的开发者们提供了一个强大的基于 Ajax 架构的 WebGIS 构建工具。


  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就能将这些位置点在地图上标示出来。

字串3

  同时,由于添加在CustomLayer中的地图对象是由开发人员来控制其呈现的逻辑和样式,并且具有自定义的存储逻辑,对这些地图对象的源数据的更新,就可以直接被反映在地图呈现上,从而及时响应数据的更新。 字串9

  下面详细说明如何在AjaxMap中实现对自定义的动态位置点进行在线编辑的功能。

字串2

  程序分成两个部分:呈现层与数据持久层,其结构如图2所示:

字串1



图2 点编辑模块结构图 字串6

  这样的结构是与AjaxMap无关的,它更多的受到系统自身的业务逻辑影响。其中呈现层主要是客户端脚本,定义了相应的数据信息在页面上呈现的逻辑;数据持久层采用服务端脚本的形式,定义了与数据库交互的逻辑;XMLDOM对象执行对两层之间的数据交互和解析。 字串2

  数据持久层与呈现层通过明确定义的接口进行交互,从而使两者实现各自的分离。数据持久层与数据结构定义相关联,由具体的数据结构来决定其采用的动作。持久层将交互的结果以标准XML格式向客户端输出,呈现层解析来自持久层的输出,以获取需要的信息。数据保存在Access数据库中,持久层通过构建SQL语句操作数据。

字串7

表一 自定义数据存储的表结构

字串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
%>

字串6

  在查询模块中,首先建立与数据库的连接:
mdbfile = server.mappath("db1.mdb")
set conn = server.createobject("adodb.connection") 字串3

connstr="DBQ="+mdbfile+";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};"
conn.open connstr

字串4

  随后从数据库中读出符合需求的信息,并将取出的信息组织成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

字串9

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语句,执行对数据库的更新。

共3页: 上一页 1 [2] [3] 下一页

上一篇:vs.net中使用SuperMap需要注意的问题
下一篇:RIA(Rich Internet Application)介绍
收藏本文: Del.icio.us Google书签 Digg Live Bookmark 365Key网摘 天极网摘 和讯网摘 QQ书签 Digbuzz我挖网 该页面添加到 Mister Wong
精彩图片推荐
今日推荐
用户名:新注册) 密码: 匿名评论
评论内容:不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 最新评论
搜索:
  • 第一视频联播网广告联盟 群视传播文内广告联盟
  • 通过BackLinks卖链接赚美元 注册Text Link Ads 就送25美元
   网站首页 -  关于我们 -  联系我们 -  网站地图 -    RSS订阅 - 网站博客 -  网站投稿 -  链接申请 -  网站留言
Copyright 2007 www.gispark.com All Rights Reserved 闽ICP备06027130号