阅读:1123回复:0
利用MOIMS实现WEBGIS
<P>一个简单的WebGIS系统实现(利用MOIMS)
4.1 地图应用开发及地图网络发布 地图数据的网络发布是本系统的基本组成部分,因为地图是服务器与客户机的纽带。 在网络发布的基础上,我们可以开发一些地图的简单应用,如响应客户端用户的操作; 还可以附加专题地图数据,进行专题分析,如在地图发布时同时发布公交车线路图,就 可以进行公交线路的有关查询及分析。 本系统主要应用MapObjects以及它的扩展模块MOIMS来进行开发,主要由以下几个方 面来组成: 4.1.1 数据的加载 作为一个地图相关的应用,地图数据的加载自然就成为最先必须解决的问题。在本例 中,我们才用动态加载的方式,有程序将系统所需要用到的城市背景图以及公交车运行 线路图进行了动态加载。如下列程序: Private Sub Form_Load() ' 消息响应端口的设定 WebLink1.MapPort = 5062 ' 开始响应用户操作(实际上是响应端口) If Not WebLink1.Start Then MsgBox "Can not start Weblink control, unloading form..." Exit Sub End If ' 设置地图的背景色 Map1.BackColor = 15663103 ' ' 设置系统窗口标题 frmMain.Caption = "南京公交查询系统(Server)--" ; WebLink1.MapPort ' ' 加载地图数据(城市背景图) Dim strDataPath As String, pLayer As MapObjects2.MapLayer strDataPath = "E:\NJBUS\DATA" AddShapeFile Map1, strDataPath, "街区", moPaleYellow AddShapeFile Map1, strDataPath, "街区2", moPaleYellow AddShapeFile Map1, strDataPath, "湖泊及双线河", 16761220 AddShapeFile Map1, strDataPath, "草坪绿地", vbGreen AddShapeFile Map1, strDataPath, "道路", moDarkGray ' ' 检验数据加载的正确性 If Map1.Layers.Count < 4 Then MsgBox "Could not load all specified data." ElseIf Map1.Layers.Count = 0 Then MsgBox "No data loaded. Check Data paths." End End If ' ' 将放大设为缺省工具 m_bZoomInSelected = True ' ' 设置标注字体等信息 Set m_pSym = New MapObjects2.Symbol With m_pSym .SymbolType = moFillSymbol .Style = moSolidFill .Color = moYellow .OutlineColor = RGB(200, 200, 0) End With Set m_pFnt = New StdFont With m_pFnt .Name = "宋体" .Bold = False .Size = 9 End With End Sub 4.1.2 用户操作的消息传递 在上一段程序中我们看到,在程序运行的初期我们进行了了以下操作 WebLink1.MapPort = 5062 WebLink1.Start</P> <P> 实际上是由WebLink实现了服务端与客户端相互联系。这个联系主要表现为由WebLink 来实现服务器对客户端的监听,我们在这儿设定了监听端口为5062。监听主要完成的 任务就是获取用户在地图上的各种操作,有利于我们对用户的操作做出响应。如下列 程序: Private Sub WebLink1_Request(ByVal arguments As Object, ByVal values As Object) ' ' 解析字符串的内容 Dim strCMD As String, strTmp As String strTmp = FindArgValue("left", arguments, values) ' ' 如果传入了矩形参数,创建这个矩形 ' Dim pRectExt As New MapObjects2.Rectangle If strTmp <> "" Then With pRectExt .Left = CDbl(strTmp) .Bottom = CDbl(FindArgValue("bottom", arguments, values)) .Right = CDbl(FindArgValue("right", arguments, values)) .Top = CDbl(FindArgValue("top", arguments, values)) End With Else Set pRectExt = Map1.FullExtent End If ' ' 获取用户在地图上单击是鼠标的位置 Dim lClickX As Long, lClickY As Long, lTemp As String lTemp = FindArgValue("click.x", arguments, values) If lTemp <> "" Then lClickX = CLng(lTemp) lTemp = FindArgValue("click.y", arguments, values) If lTemp <> "" Then lClickY = CLng(lTemp) ' ' 获取用户命令 strCMD = FindArgValue("cmd", arguments, values) If strCMD = "" Then CreateError "Invalid argument." Exit Sub End If ' ' 根据用户命令,执行相应的处理程序 Select Case strCMD Case "map" '全景显示 DoMapExtent pRectExt Case "zoomin" '放大 DoZoomIn pRectExt, lClickX, lClickY Case "zoomout" '缩小 DoZoomOut pRectExt, lClickX, lClickY Case "pan" '平移 DoPan pRectExt, lClickX, lClickY Case "identify" '标识 DoIdentify pRectExt, lClickX, lClickY Case Else CreateError "Invalid Cmd value." End Select Set m_pRecs = Nothing End Sub 4.1.3 用户操作响应 在上述程序中,主要是对用户的操作进行了捕获,但具体实施还是根据用户不同 的命令做出不同的响应。一个地图应用的最基本的操作应该是对地图的放大、缩小、 漫游等操作,下面与放大为例进行说明: Private Sub DoZoomIn(pRectExt As Rectangle, lngX As Long, lngY As Long) ' ' 用户命令为放大 m_bZoomInSelected = True m_bZoomOutSelected = False m_bPanSelected = False m_bIdentifySelected = False ' ' 根据鼠标位置常见点(以点为中心进行放大) Dim pPoint As MapObjects2.Point Set pPoint = ConvertClick(pRectExt, lngX, lngY) Dim pPntCenter As MapObjects2.Point Set pPntCenter = pRectExt.Center pRectExt.ScaleRectangle 0.5 pRectExt.Offset pPoint.X - pPntCenter.X, pPoint.Y - pPntCenter.Y ' ' 将结果反馈给用户 CreateHTML pRectExt End Sub 4.1.4 创建HTML 由于我们的应用是基于网络运行的,客户端通过IE来进行数据访问,所以我们 将服务端的响应反馈给用户时必须采用HTML来进行,即我们必须在程序里面生成浏 览器所需要的HTML文件。 Private Sub CreateHTML(pRectExt As Rectangle) ' ' 创建HTML要引用的图象(存放与浏览器能访问的虚拟目录) Dim strImgURL As String strImgURL = "/temp/" ; CreateMap(pRectExt) ' ' 写HTML文件 With WebLink1 ' ' HTML所必须的相关信息 .WriteResponseHeader "Content-type: text/html" + vbCrLf + vbCrLf .WriteString "<HTML><HEAD>" ; vbCrLf .WriteString "<TITLE>南京公交车查询系统</TITLE> </HEAD>" ; vbCrLf .WriteString "<BODY BGCOLOR=#FFFFEE>" ; vbCrLf .WriteString " <P><H2>南京公交车查询系统</H2>" .WriteString "本系统采用MapObjects 2.1与MOIMS 2.0开发</P>" ; vbCrLf ' ' 加入HTML FORM .WriteString "<FORM ACTION=/scripts/esrimap.dll>" ; vbCrLf .WriteString "<INPUT TYPE=hidden NAME=name Value=NJBUS>" ; vbCrLf .WriteString "<CENTER>" ; vbCrLf .WriteString "<STRONG>在地图上单击进行: </STRONG>" ; vbCrLf ' ' 加入用户命令选择框 .WriteString "<INPUT TYPE=RADIO NAME=cmd VALUE=zoomin " ; _ IIf(m_bZoomInSelected, "CHECKED", "") ; "> 放大" ; vbCrLf .WriteString "<INPUT TYPE=RADIO NAME=cmd VALUE=zoomout " ; _ IIf(m_bZoomOutSelected, "CHECKED", "") ; "> 缩小" ; vbCrLf .WriteString "<INPUT TYPE=RADIO NAME=cmd VALUE=pan " ; _ IIf(m_bPanSelected, "CHECKED", "") ; "> 平移" ; vbCrLf .WriteString "<INPUT TYPE=RADIO NAME=cmd VALUE=identify " ; _ IIf(m_bIdentifySelected, "CHECKED", "") ; "> 标识" ; vbCrLf ' ' 加入矩形参数(隐藏方式) ' .WriteString "<INPUT TYPE=hidden NAME=left Value=" ; _ pRectExt.Left ; ">" ; vbCrLf .WriteString "<INPUT TYPE=hidden NAME=bottom Value=" ; _ pRectExt.Bottom ; ">" ; vbCrLf .WriteString "<INPUT TYPE=hidden NAME=right Value=" ; _ pRectExt.Right ; ">" ; vbCrLf .WriteString "<INPUT TYPE=hidden NAME=top Value=" ; _ pRectExt.Top ; ">" ; "<P>" ; vbCrLf ' ' 加入地图引用 .WriteString "<INPUT TYPE=image NAME=click SRC=" ; Chr(34) _ ; strImgURL ; Chr(34) ; "><BR>" ; vbCrLf ' ' 加入全景显示命令 .WriteString "<P><A HREF=""esrimap.dll?" ; _ "Name=NJBUS;cmd=map" ; Chr(34) ; ">全景显示</A></P>" ; vbCrLf ' ' FORM与HTML文件结束 .WriteString "</CENTER>" ; vbCrLf .WriteString "</FORM>" ; vbCrLf .WriteString "</BODY>" ; vbCrLf .WriteString "</HTML>" ; vbCrLf End With End Sub 4.1.5 创建地图 MOIMS是基于CGI原理的 WebGIS,它是以图象作为它传输地图的方式 。在程序中 实际上我们是将MapObjects里显示的地图作为一张BMP图象输出,然后将它转换为 网上常用的JPG格式图形,嵌在HTML文件中反馈给用户。 Private Function CreateMap(pRectExt As Rectangle) As String ' ' 生成唯一的图象文件名(本机实际路径) Dim strJpegFile As String, strFile As String strFile = WebLink1.MapPort ; Format(Now, "h_m_s") ; m_lCounter strJpegFile = m_strRealPath ; "\" ; strFile ; ".jpg" ' ' 设置图象范围并输出BMP图象 ' Set Map1.Extent = pRectExt Map1.ExportMapToJpeg strJpegFile, 85, True, 1, moLineSymbolsNotScaled ' ' 生成JPG图象 CreateMap = strFile ; ".jpg" m_lCounter = m_lCounter + 1 End Function</P> |
|