MO作為B/S服務器端的開發
本人從事MO開發有近兩年,現在已經轉向ArcGis Engine和ArcGis Server的開發。MO作為引導我進入GIS殿堂這樣的一個GIS組件,我花在它上面的心血確實太多了。回憶起以前用MO實現符號化,實現自定義出圖,實現投影,實現空間分析等功能所經歷過酸甜苦辣,真是愛恨交加,感慨萬千。現在我要告別MO了,于是我陸陸續續地寫了一些小文在講述我所做過的一些東西,以便我對這一段開發的歷史還有所記憶。本文會是我寫的最后一篇關于MO的文章了。
前面寫了一篇MO作為B/S客戶器端的開發的小文,其實MO還可以作為B/S服務器端的GIS支持平臺。要實現初級的功能如獲取地圖是比較簡單的,但要實現復雜功能的話,那就要花太多精力了,最后可能會得不償失,建議采用ArcIMS或ArcGis Server之類的平臺。好了,廢話少說,現在我們來看一看怎么樣用MO實現一個簡單的地圖獲取功能。
原理:在服務器端運行一個服務程序,該程序要有一個地圖控件,并且設置好加載的圖層以及符號化效果,然后打開一個端口并監聽,如果收到請求,則在服務器的一個臨時目錄下生成一個臨時圖片文件。(如果各位有興趣,我想可以做成一個WebService,這樣適應能力更強,擴展性也好)。網頁是能過Asp.net生成的,網頁上有一個Image組件,現在程序要做的是只是獲取這個圖片的URL,然后將其賦給Image組件的ImageUrl屬性就可以了。
第一步:服務程序的開發。
開發工具:VB。
步驟:首先在Form上放在一個Map組件和一個Winsock組件,然后在Form_Load中寫下代碼:
With WinSock1
.RemoteHost = "127.0.0.1"
.RemotePort = 4001
.Bind 4002
End With
并在Form_Load中進行地圖的初始化:加載圖層,以及符號化等。
然后在Winsock1的Data_Arrival事件中,接收客戶端的請求(實際是經過Asp.net處理過的,也就是說WinSock收到的數據是在服務器端發送的)。Data_Arrival的代碼大致是這樣的:
Dim strData() As Byte
Dim strRequest As String
Winsock1.GetData strData
strRequest = CStr(strData)
/////下面根據strRequest對地圖進行處理,并生成圖片
....................
....................
Dim strFile as String
//根據需求按一定規則生成一個文件名
..............
Map1.ExportJpeg(strFile);
第二步:在網頁中,請求生成圖片,并顯示出來。
開發工具:Asp.net,C#
首先,發送請求,請求的內容為一個字符串:
ShowLoading();
UdpClient udpClient = new UdpClient();
Byte[] sendBytes = Encoding.ASCII.GetBytes(strRequest);
try{
udpClient.Send(sendBytes, sendBytes.Length, HostIP, 4002);
}
服務器收到請求,會成一個圖片文件,假設文件的URL地址為strUrl, 現在將這個文件顯示在瀏覽器中。
Image1.ImageUrl = strUrl;
HideLoading();
經過這幾步之后,瀏覽器就可以看到服務器端MO生成的圖片了。
上面是一個簡單的例子,還可以擴展出比較強的功能,但工作量會比較大。如果要進行擴展,我認為還要做好以下幾個工作:
1、定義一個服務器與客戶端交互的規范,就像ArcIMS中通過規格定式的ArcXML來交互一樣;
2、確定服務器端的采用的技術,是DCOM,還是WebService等,確定服務該如何提供。上面例子中方式應該來說還是很不完善的;
3、定義一種地圖的工程文件,像ArcGis Desktop的MXD文件,或是ArcIMS中的axl文件。總之這種文件能夠定義地圖的圖層及顯示效果等,你的程序必須能夠加載種文件。
主要就是這幾條吧。我也沒有償試去做,因為我現在不需要用它了~呵呵。
浙公網安備 33010602011771號