ArcIMS 連接器--.NET Link 使用方法
??? 作者:Flyingis????
??? 前幾天馬維峰寫了一篇關(guān)于ArcIMS文章——《淺析ArcIMS》,主要分析了ArcIMS的基本體系結(jié)構(gòu)和幾種二次開(kāi)發(fā)模式的簡(jiǎn)單對(duì)比,比筆者之前的《ArcIMS體系結(jié)構(gòu)》分析的透徹許多。
??? ArcIMS二次開(kāi)發(fā),關(guān)注最多的無(wú)非是它的連接器(connector)和ArcXML。在這些連接器中,Servlet Connector通過(guò)純粹的ArcXML文件來(lái)傳輸請(qǐng)求和響應(yīng),ColdFusion Connector在其自身的運(yùn)行環(huán)境中使用自定義tags來(lái)產(chǎn)生ArcXML請(qǐng)求和響應(yīng),Java Connector和ActiveX Connector比較類似,通過(guò)一組API(Java Connector還有標(biāo)簽庫(kù))來(lái)產(chǎn)生ArcXML請(qǐng)求和響應(yīng),它們是面向?qū)ο蟮拈_(kāi)發(fā)方式,比較符合一般程序員的思維習(xí)慣。.NET Link比較特殊,最初我認(rèn)為它和Java Connector、ActiveX Connector一樣,通過(guò)一系列API來(lái)定義、生成ArcXML文件中的節(jié)點(diǎn)與屬性,但事實(shí)上并非如此,簡(jiǎn)單來(lái)說(shuō),它僅僅是對(duì)XML文件的一種搭配與組裝,使用.NET Framework中對(duì)XML文件的操縱方式拼裝出所需的ArcXML請(qǐng)求,并接受ArcIMS應(yīng)用服務(wù)器的響應(yīng),其參考手冊(cè)中只有服務(wù)連接和AxlRequest相關(guān)的幾個(gè)類的說(shuō)明,也難怪ESRI為什么要給它要取名為.NET Link,而不是.NET Connector。
??? 離ArcGIS 9.2正式發(fā)布已經(jīng)沒(méi)有多長(zhǎng)時(shí)間,.NET Link能否得到改進(jìn)至少像它的前輩ArctiveX Connector一樣還不清楚。.NET Link的這種開(kāi)發(fā)方式使得開(kāi)發(fā)人員需要更多的關(guān)注ArcXML_reference,下面將簡(jiǎn)單說(shuō)明.NET Link的使用方法。
??? 首先,需要將.NET Link的程序集引用到開(kāi)發(fā)環(huán)境中,我使用的是Visual Studio 2005,需要說(shuō)明的是ArcIMS 9/9.1 的.NET Link在VS2003和VS2005中都能工作的很好,兼容性不錯(cuò)。這樣ESRI.ArcIMS.Server.dll就加入了項(xiàng)目中。
??
??? 第二步,建立到ArcIMS應(yīng)用服務(wù)器的連接。
using?ESRI.ArcIMS.Server
……
ServerConnection?connection?=?new?ServerConnection();
connection.Host = "localhost";
connection.AppServerPort?=?5300;
connection.Scheme?=?Scheme.TCP;
??? 如果需要建立一個(gè)HTTP連接,端口為80,可以將以上語(yǔ)句改為
connection.Scheme?=?Scheme.HTTP;?
connection.Host?=?"http://www.yourdomain.com";
connection.URIPort?=?80;
??? 第三步,發(fā)送一個(gè)ArcXML請(qǐng)求。在.NET Link中發(fā)送ArcXML請(qǐng)求,其實(shí)質(zhì)就是對(duì)ArcXML文件的一種拼裝。
??
//?獲取默認(rèn)的地圖服務(wù)
connection.ServiceName?=?"ServerSample";
//?建立一個(gè)?XML?String,即?axl
string?sAXLText;
//?在?sAXLText?中寫入定制的?axl?文件
sAXLText?=?"<?xml?version=\"1.0\"?encoding=\"UTF-8\"?><ARCXML?version=\"1.1\">";
sAXLText?=?sAXLText?+?"<REQUEST><GET_IMAGE><PROPERTIES>";
sAXLText?=?sAXLText?+?"<IMAGESIZE?width=\"300\"?height=\"250\"/>";
sAXLText?=?sAXLText?+?"<ENVELOPE?minx=\"-132.0\"?miny=\"25.0\"?maxx=\"-57.0\"?maxy=\"50.0\"?/>";
sAXLText?=?sAXLText?+?"<LEGEND?display=\"false\"?/>";
sAXLText?=?sAXLText?+?"</PROPERTIES></GET_IMAGE></REQUEST></ARCXML>";
string?response?=?conArcIMS.Send(sAXLText);
??? 最后,需要處理ArcXML響應(yīng)。
System.Xml.XmlDocument?axlResponse?=?new?System.Xml.XmlDocument();
axlResponse.LoadXml(response);?
if?(axlResponse.GetElementsByTagName("OUTPUT").Count?==?1)
{?
????//?從?ArcIMS?應(yīng)用服務(wù)器響應(yīng)中獲取?"OUTPUT"?XmlNode?節(jié)點(diǎn)的集合,并且節(jié)點(diǎn)只有一個(gè)
????System.Xml.XmlNodeList?nodeOutput?=?axlResponse.GetElementsByTagName("OUTPUT");
????//?獲取這個(gè)節(jié)點(diǎn)的?url?屬性值
????imageURL?=?nodeOutput[0].Attributes["url"].Value;
}
??? 最后獲得的imageURL就是之前客戶端用戶發(fā)送請(qǐng)求需要服務(wù)器返回的圖片地址,用戶每次對(duì)地圖操作后看到的結(jié)果,其本質(zhì)就是一張張圖片。
??? 現(xiàn)在思路比較清晰了,ArcIMS地圖服務(wù)發(fā)布后,其展現(xiàn)的內(nèi)容主要是由開(kāi)發(fā)中所定制的ArcXML文件的內(nèi)容所決定,開(kāi)發(fā)人員需要面對(duì)大量ArcXML中的子元素及其屬性設(shè)置,對(duì)于面向?qū)ο蟮拈_(kāi)發(fā)而言顯然是笨了一些,但從原理上來(lái)說(shuō),還是比較簡(jiǎn)單的,關(guān)鍵就是要看開(kāi)發(fā)人員對(duì)ArcXML文檔的熟悉程度了。
??
??? 使用.NET Link進(jìn)行ArcIMS二次開(kāi)發(fā)的過(guò)程中,對(duì)ArcXML的子元素和屬性進(jìn)行操縱與設(shè)置不是一件令人愉快的事,但其中真正的困難還要數(shù)客戶端大量javascript腳本的應(yīng)用和數(shù)據(jù)傳遞,有機(jī)會(huì)拿一兩個(gè)簡(jiǎn)單例子討論一下。
??? 前幾天馬維峰寫了一篇關(guān)于ArcIMS文章——《淺析ArcIMS》,主要分析了ArcIMS的基本體系結(jié)構(gòu)和幾種二次開(kāi)發(fā)模式的簡(jiǎn)單對(duì)比,比筆者之前的《ArcIMS體系結(jié)構(gòu)》分析的透徹許多。
??? ArcIMS二次開(kāi)發(fā),關(guān)注最多的無(wú)非是它的連接器(connector)和ArcXML。在這些連接器中,Servlet Connector通過(guò)純粹的ArcXML文件來(lái)傳輸請(qǐng)求和響應(yīng),ColdFusion Connector在其自身的運(yùn)行環(huán)境中使用自定義tags來(lái)產(chǎn)生ArcXML請(qǐng)求和響應(yīng),Java Connector和ActiveX Connector比較類似,通過(guò)一組API(Java Connector還有標(biāo)簽庫(kù))來(lái)產(chǎn)生ArcXML請(qǐng)求和響應(yīng),它們是面向?qū)ο蟮拈_(kāi)發(fā)方式,比較符合一般程序員的思維習(xí)慣。.NET Link比較特殊,最初我認(rèn)為它和Java Connector、ActiveX Connector一樣,通過(guò)一系列API來(lái)定義、生成ArcXML文件中的節(jié)點(diǎn)與屬性,但事實(shí)上并非如此,簡(jiǎn)單來(lái)說(shuō),它僅僅是對(duì)XML文件的一種搭配與組裝,使用.NET Framework中對(duì)XML文件的操縱方式拼裝出所需的ArcXML請(qǐng)求,并接受ArcIMS應(yīng)用服務(wù)器的響應(yīng),其參考手冊(cè)中只有服務(wù)連接和AxlRequest相關(guān)的幾個(gè)類的說(shuō)明,也難怪ESRI為什么要給它要取名為.NET Link,而不是.NET Connector。
??? 離ArcGIS 9.2正式發(fā)布已經(jīng)沒(méi)有多長(zhǎng)時(shí)間,.NET Link能否得到改進(jìn)至少像它的前輩ArctiveX Connector一樣還不清楚。.NET Link的這種開(kāi)發(fā)方式使得開(kāi)發(fā)人員需要更多的關(guān)注ArcXML_reference,下面將簡(jiǎn)單說(shuō)明.NET Link的使用方法。
??? 首先,需要將.NET Link的程序集引用到開(kāi)發(fā)環(huán)境中,我使用的是Visual Studio 2005,需要說(shuō)明的是ArcIMS 9/9.1 的.NET Link在VS2003和VS2005中都能工作的很好,兼容性不錯(cuò)。這樣ESRI.ArcIMS.Server.dll就加入了項(xiàng)目中。
??
??? 第二步,建立到ArcIMS應(yīng)用服務(wù)器的連接。






??? 如果需要建立一個(gè)HTTP連接,端口為80,可以將以上語(yǔ)句改為



??? 第三步,發(fā)送一個(gè)ArcXML請(qǐng)求。在.NET Link中發(fā)送ArcXML請(qǐng)求,其實(shí)質(zhì)就是對(duì)ArcXML文件的一種拼裝。
??












??? 最后,需要處理ArcXML響應(yīng)。









??? 最后獲得的imageURL就是之前客戶端用戶發(fā)送請(qǐng)求需要服務(wù)器返回的圖片地址,用戶每次對(duì)地圖操作后看到的結(jié)果,其本質(zhì)就是一張張圖片。
??? 現(xiàn)在思路比較清晰了,ArcIMS地圖服務(wù)發(fā)布后,其展現(xiàn)的內(nèi)容主要是由開(kāi)發(fā)中所定制的ArcXML文件的內(nèi)容所決定,開(kāi)發(fā)人員需要面對(duì)大量ArcXML中的子元素及其屬性設(shè)置,對(duì)于面向?qū)ο蟮拈_(kāi)發(fā)而言顯然是笨了一些,但從原理上來(lái)說(shuō),還是比較簡(jiǎn)單的,關(guān)鍵就是要看開(kāi)發(fā)人員對(duì)ArcXML文檔的熟悉程度了。
??
??? 使用.NET Link進(jìn)行ArcIMS二次開(kāi)發(fā)的過(guò)程中,對(duì)ArcXML的子元素和屬性進(jìn)行操縱與設(shè)置不是一件令人愉快的事,但其中真正的困難還要數(shù)客戶端大量javascript腳本的應(yīng)用和數(shù)據(jù)傳遞,有機(jī)會(huì)拿一兩個(gè)簡(jiǎn)單例子討論一下。
posted on 2006-07-30 21:16 Flyingis 閱讀(6374) 評(píng)論(70) 編輯 收藏 所屬分類: ArcIMS