九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
WebGIS系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

[轉(zhuǎn)載說(shuō)明:本文謝絕非通告轉(zhuǎn)載,特此說(shuō)明。需要轉(zhuǎn)載請(qǐng)聯(lián)系筆者。]

什么是WebGIS?

WebGIS是Internet技術(shù)應(yīng)用于GIS開(kāi)發(fā)的產(chǎn)物。WebGIS,即互聯(lián)網(wǎng)地理信息系統(tǒng),以互聯(lián)網(wǎng)為環(huán)境,以Web頁(yè)面作為GIS軟件的用戶界面,把Internet和GIS技術(shù)結(jié)合在一起,為各種地理信息應(yīng)用提供GIS功能。GIS通過(guò)Web功能得以擴(kuò)展,通過(guò)Web發(fā)布地圖、瀏覽空間數(shù)據(jù),制作專(zhuān)題圖,例如大家熟悉的Go2Map、Google Map、MapBar等等。

[使用的技術(shù):GIS基本開(kāi)發(fā)、.net Remoting、ASP.net開(kāi)發(fā)和控件開(kāi)發(fā)、設(shè)計(jì)模式]

[代碼下載:/Files/maweifeng/WebGIS.rar]

WebGIS的基本原理

WebGIS的原理并不復(fù)雜,主要流程如下(下圖):
(1)首先,設(shè)計(jì)一個(gè)可以交互的Web頁(yè)(可以應(yīng)用ASP、PHP、ASP.net、JSP等,商用WebGIS大多選擇除了PHP的其他語(yǔ)言,而開(kāi)源WebGIS大都選擇了PHP),通過(guò)此Web頁(yè),向Web服務(wù)器提交有關(guān)GIS服務(wù)的請(qǐng)求;
(2)此請(qǐng)求會(huì)包含對(duì)地圖數(shù)據(jù)的請(qǐng)求,包括查詢等,請(qǐng)求會(huì)通過(guò)Web服務(wù)器提交給GIS應(yīng)用服務(wù)器;
(3)GIS應(yīng)用服務(wù)器可以使用幾種技術(shù),CGI、COM、Java Serverlet或者.net技術(shù)、Web Service技術(shù),通過(guò)這些組件包裝已有的GIS軟件,獲取客戶端的請(qǐng)求,將用戶需求轉(zhuǎn)化為具體的操作,返回需求的數(shù)據(jù)(一般是一個(gè)地圖圖片或者查詢的數(shù)據(jù)集),這個(gè)過(guò)程稱為地圖的Render,實(shí)際上也是最為耗時(shí)的操作;
(4)Web服務(wù)器獲取了GIS應(yīng)用服務(wù)器返回的圖片,然后作為一個(gè)Web頁(yè)返回給客戶。



這就是WebGIS的基本原理,另外一類(lèi)基于客戶端插件,如ActiveX或者Applet的WebGIS系統(tǒng),差別在于GIS服務(wù)器不生成圖片,而返回矢量數(shù)據(jù)集。

這樣,可以看出,WebGIS的關(guān)鍵是設(shè)計(jì)GIS應(yīng)用服務(wù)器,該服務(wù)器的性能和效率很大程度上決定了WebGIS的性能。

WebGIS的設(shè)計(jì)

接著我們來(lái)設(shè)計(jì)一個(gè)自己的WebGIS系統(tǒng)。我們的需求非常簡(jiǎn)單,可以將一個(gè)地圖以固定的分辨率顯示在Web瀏覽器,可以放大、縮小和移動(dòng)。這個(gè)功能雖然簡(jiǎn)單但五臟俱全,大概可以一窺WebGIS的基本原理。

我們選擇使用.net技術(shù),首先需要對(duì)系統(tǒng)進(jìn)行劃分,Web開(kāi)發(fā)使用ASP.net的Web Control來(lái)封裝一個(gè)簡(jiǎn)單的控件,ASP.net的Web頁(yè)通過(guò)此控件來(lái)顯示地圖,控件包括幾個(gè)主要操作的接口。此Control每次Render的時(shí)候都需要調(diào)用GIS服務(wù)器獲取需要的數(shù)據(jù),然后將此圖片Render為Web頁(yè)的一部分。

GIS服務(wù)器負(fù)責(zé)打開(kāi)GIS空間數(shù)據(jù),接受請(qǐng)求,生成圖片,然后返回之。我們知道,空間數(shù)據(jù)的打開(kāi)、關(guān)閉是非常耗時(shí)的操作,因此,GIS服務(wù)器應(yīng)該保證“一直開(kāi)著”,而不是一個(gè)簡(jiǎn)單的組件,每次請(qǐng)求時(shí)都打開(kāi)、關(guān)閉GIS數(shù)據(jù)。要獲得這樣的功能可以通過(guò)幾種方式:(1)使用一般控件或Web Service,在Global.asax中的 Application_Start 中啟動(dòng)打開(kāi)數(shù)據(jù);(2)使用Windows服務(wù)(CSDN的一篇翻譯文章對(duì)使用Windows服務(wù)有詳細(xì)說(shuō)明:http://editblog.csdn.net/msdncolumn/archive/2005/05/26/3710.aspx);(3)使用Remoting技術(shù),采用Singleton方式的服務(wù)器端,可以保證所有請(qǐng)求使用的都是同一對(duì)象,而且對(duì)象在生存期內(nèi)不會(huì)頻繁打開(kāi)和關(guān)閉。實(shí)際系統(tǒng)大概是同時(shí)使用了幾種技術(shù),例如使用Windows服務(wù)在開(kāi)機(jī)時(shí)啟動(dòng),然后創(chuàng)建Remoting服務(wù)器端。

一般來(lái)說(shuō),GIS服務(wù)器都使用了創(chuàng)建Map Service(地圖服務(wù))的方式,就是說(shuō),可以在GIS服務(wù)器創(chuàng)建多個(gè)Service,提供Map服務(wù)。這樣,前端的Web頁(yè)調(diào)用Map Service服務(wù),服務(wù)控制空間數(shù)據(jù),在Web程序調(diào)用之前,GIS服務(wù)器已經(jīng)打開(kāi)了空間數(shù)據(jù),等待提供服務(wù)。這樣,我們一方面對(duì)程序進(jìn)行了分層,另一方面通過(guò)分層,意外的獲得了可以通過(guò)在GIS服務(wù)器端控制Map Service的方式更新、修改地圖數(shù)據(jù),而不影響Web服務(wù)的好處。

以下即為一個(gè)基于.net設(shè)計(jì)的WebGIS的架構(gòu)示意,不同顏色表示可以部署于不同的機(jī)器。其中GIS應(yīng)用服務(wù)器上運(yùn)行Map Service,為前端的Web程序提供地圖數(shù)據(jù)。



詳細(xì)設(shè)計(jì)與系統(tǒng)實(shí)現(xiàn)

GIS服務(wù)器(基于.net Remoting)

在運(yùn)行于不同進(jìn)程中的對(duì)象之間建立通信(無(wú)論是在同一臺(tái)計(jì)算機(jī)上,還是在相距數(shù)千公里的計(jì)算機(jī)上)是常見(jiàn)的開(kāi)發(fā)目標(biāo)。通過(guò) .NET 遠(yuǎn)程處理,客戶端應(yīng)用程序可以使用同一臺(tái)計(jì)算機(jī)(或其網(wǎng)絡(luò)中其他任何可用的計(jì)算機(jī))上的其他進(jìn)程中的對(duì)象。可以從 Web 應(yīng)用程序、控制臺(tái)應(yīng)用程序、Windows 服務(wù)進(jìn)行通信。因此我們將基于.net Remoting技術(shù)實(shí)現(xiàn)GIS服務(wù)器。

MapRender接口

我們首先設(shè)計(jì)如下的一個(gè)MapRender接口,在服務(wù)器端實(shí)現(xiàn)之,客戶端則通過(guò)Remoting遠(yuǎn)程調(diào)用,使用Server端的服務(wù)。



MapService類(lèi)



MapService實(shí)現(xiàn)了MapRender接口,提供Map服務(wù),返回生成的Map的文件名。其實(shí)現(xiàn)是通過(guò)bridge模式,調(diào)用 _mapEngine 來(lái)完成具體的操作。在構(gòu)造函數(shù)(New)內(nèi),使用Factory模式初始化  _mapEngine,打開(kāi)數(shù)據(jù)(如下代碼),在Dispose中關(guān)閉數(shù)據(jù)。

 1
Dim strMapEngine As String
 2
strMapEngine = "Simple"
 3

 4
Select Case strMapEngine
 5
    Case "Simple"
 6
        _mapEngine = New SimpleMapEngine
 7
    Case "Mo"
 8
        _mapEngine = New MoMapEngine
 9
    Case "Supermap"
10
        _mapEngine = New SupermapMapEngine
11
    Case Else
12
End Select
13

14
_mapEngine = New SimpleMapEngine
15
_mapEngine.OpenMapDB("")
16

實(shí)際的程序可以從配置文件里讀入需要的數(shù)據(jù),然后初始化MapEngine,這里直接初始化為SimpleMapEngine。

MapEngine(具體的地圖引擎)



地圖引擎首先實(shí)現(xiàn)了一個(gè)基類(lèi),然后在此基礎(chǔ)上繼承不同的引擎。對(duì)于使用MO和SuperMap的引擎,可以使用Adapter模式來(lái)實(shí)現(xiàn)。本文實(shí)現(xiàn)了一個(gè)“假的”Simple引擎只是返回一個(gè)已有的圖片地址(Server Stub模式)。

[本來(lái)準(zhǔn)備使用SuperMap Object實(shí)現(xiàn)一個(gè)Map引擎,但有些COM互操作的問(wèn)題解決不了,暫時(shí)作罷,這樣也有一個(gè)好處,即任何人都可以測(cè)試此程序]

啟動(dòng)Map Service服務(wù)

我們?cè)贛ain函數(shù)內(nèi)啟動(dòng)MapService服務(wù):

1
Dim chan1 As TcpChannel
2
chan1 = New TcpChannel(8085)
3

4
ChannelServices.RegisterChannel(chan1)
5
RemotingConfiguration.RegisterWellKnownServiceType(GetType(MapService), "MapService", WellKnownObjectMode.Singleton)
6

7
System.Console.WriteLine("Hit <enter> to exit
")
8
System.Console.ReadLine()
9


實(shí)際的實(shí)現(xiàn),可以使用類(lèi)似代碼和配置文件,啟動(dòng)多個(gè)Map Service服務(wù),供不同的地圖程序調(diào)用。

測(cè)試Map Service服務(wù)

我們可以創(chuàng)建一個(gè)WinForm程序來(lái)測(cè)試此Map Service服務(wù),首先,添加MapRender接口IMapRender的引用,對(duì)在Form Load事件里初始化遠(yuǎn)程對(duì)象MapService:

1
Dim chan As TcpChannel
2
chan = New TcpChannel
3
ChannelServices.RegisterChannel(chan)
4
_map = CType(Activator.GetObject(GetType(IMapRender.MarsWebGIS.IMapRender), "tcp://localhost:8085/MapService"), IMapRender.MarsWebGIS.IMapRender)
5

6

這樣,我們就可以使用 _map 對(duì)象獲取Map Service服務(wù),返回需要的數(shù)據(jù)。

 1
Dim strFileName As String
 2
Dim img As Bitmap
 3
Dim l, t, r, b As Double
 4

 5
strFileName = _map.GetMap(t, l, r, b, _path)
 6
Me.lblImg.Text = strFileName
 7
img = New Bitmap(strFileName)
 8
Me.picMap.Image = CType(img, Image)
 9

10


運(yùn)行結(jié)果如下:



下面,我們就可以在使用ASP.net創(chuàng)建使用此遠(yuǎn)程服務(wù)的控件,在Web上使用GIS地圖服務(wù),實(shí)現(xiàn)WebGIS。

Map Control的創(chuàng)建和測(cè)試

現(xiàn)在,我們已經(jīng)可以在ASP.net開(kāi)發(fā)中直接使用上面實(shí)現(xiàn)的Map Service,我們可以通過(guò)控制GetMap的參數(shù),來(lái)實(shí)現(xiàn)移動(dòng)、大小縮放等基本功能。

為了文章的完整性,我們來(lái)封裝一個(gè)簡(jiǎn)單的Map Control控件。



該控件在New事件內(nèi)初始化 _map 調(diào)用遠(yuǎn)程的Remoting服務(wù)(Map Service),和前面的測(cè)試一樣,可以使用如下方法初始化:

_map = CType(Activator.GetObject(GetType(IMapRender.MarsWebGIS.IMapRender), "tcp://localhost:8085/MapService"), IMapRender.MarsWebGIS.IMapRender)

然后在Render事件內(nèi)調(diào)用GetMap。我們可以在此控件內(nèi)通過(guò)GetMap參數(shù)封裝移動(dòng)、大小縮放等基本功能。

下面我們測(cè)試一下此控件。新建一個(gè)ASP.net頁(yè),增加以下引用:

<%@ Register Assembly="MapControlLibrary" Namespace="MapControlLibrary" TagPrefix="MapControlLibrary" %>

然后就可以使用控件:

<MapControlLibrary:MapControl id="Map1" runat="server">
</MapControlLibrary:MapControl>

運(yùn)行結(jié)果如下:



這樣,我們就完成了一個(gè)簡(jiǎn)單的WebGIS框架。

總結(jié)

該框架可以算作WebGIS的一個(gè)簡(jiǎn)單的縱剖面,由此我們可以明白WebGIS系統(tǒng)的架構(gòu),需要的技術(shù),設(shè)計(jì)和設(shè)計(jì)模式的應(yīng)用。

由于筆者對(duì)于Remoting和ASP.net控件技術(shù)不太熟悉,文中難免有所疏漏,存在不少錯(cuò)誤和問(wèn)題,還歡迎大家一起討論。最后希望所有做GIS的同行可以更多關(guān)注架構(gòu)和模式,提高我們的設(shè)計(jì)能力。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
超圖地理信息系統(tǒng)(SuperMap GIS Technologies, Inc.)
地理信息系統(tǒng)GIS的前沿技術(shù)綜述
宋關(guān)福:面向服務(wù)的地理信息共享革命
ArcGIS Server中的各種服務(wù)
WebGIS的主要發(fā)展趨勢(shì)及前沿應(yīng)用[從論文中整理而得] ——嘿友,沒(méi)有陌生人的交友空間
GIS應(yīng)用新趨勢(shì)
更多類(lèi)似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服