GIS开发随笔(3)——ArcXML和NET_Link方法
生活随笔
收集整理的這篇文章主要介紹了
GIS开发随笔(3)——ArcXML和NET_Link方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在ArcIMS中似乎有兩種連接方法,一種是在.Net工程用引用StudioAT.MapNet.DLL文件,還有一種是在.Net工程中引用ArcIMS在完全安裝后(非默認安裝)的ESRI.ArcIMS.Server.DLL文件。這兩種方法都能產生一個ArcXML文檔發送給圖形服務,后者的方法在Flyingis的博客中有介紹,文章地址為:http://www.cnblogs.com/flyingis/archive/2006/07/30/463510.html
????? 我個人看了這兩處的代碼并對比后,有些被ArcInfo這些產品提供的東西弄糊涂了,為什么ArcIMS生成ArcXML有兩種解決方法呢,都有什么作用呢,那一種更好用更適合呢?
????? 下面將這兩處的代碼對比如下(其中Flyingis所說的方法在我這里并沒有運行成功,不知道還需要注意什么地方的設置或編碼):
1、在.Net工程中引用StudioAT.MapNet.DLL文件,下面的代碼為頁面上的MapNet控件的點擊事件(MapNet控件為可視化控件,也是通過添加StudioAT.MapNet.DLL文件獲得的,至于如何添加.Net以外的控件,我這里就不多說了。)
?1using?System;
?2using?System.Collections;
?3using?System.ComponentModel;
?4using?System.Data;
?5using?System.Drawing;
?6using?System.Web;
?7using?System.Web.SessionState;
?8using?System.Web.UI;
?9using?System.Web.UI.WebControls;
10using?System.Web.UI.HtmlControls;
11using?System.Xml;
12using?StudioAT.IMS;
13using?StudioAT;
14
15……
16
17/**////?<summary>
18///?單擊地圖時顯示相關的屬性信息和坐標信息
19///?</summary>
20///?<param?name="rct">點的大小范圍信息</param>
21private?void?MapNet1_Click(StudioAT.IRect?rct)
22????????{
23????????????IMapNet?myMapNet?=?this.MapNet1;
24????????????XmlElement?myXmlEle?=?null;
25????????????XmlDocument?myXmlDoc?=?(XmlDocument)ArcXML.BuildRequest(ArcXML.enuRequest.GET_FEATURES,?ref?myXmlEle);
26????????????myXmlEle.SetAttribute(ArcXML.AttributeOutputmode,"newxml");
27????????????myXmlEle.SetAttribute(ArcXML.AttributeGeometry,?"true");
28????????????myXmlEle.SetAttribute(ArcXML.AttributeEnvelope,?"true");
29????????????myXmlEle.SetAttribute(ArcXML.AttributeCompact,?"true");
30????????????XmlElement?xmlELayer?=?myXmlDoc.CreateElement(ArcXML.NodeLayer);
31????????????xmlELayer.SetAttribute(ArcXML.AttributeId,?this.DDL_Layer.SelectedValue);
32????????????myXmlEle.AppendChild(xmlELayer);
33????????????XmlElement?xmlESQ?=?myXmlDoc.CreateElement(ArcXML.NodeSpatialquery);
34????????????xmlELayer.SetAttribute(ArcXML.AttributeId,?this.DDL_Layer.SelectedValue);
35????????????myXmlEle.AppendChild(xmlESQ);
36????????????XmlElement?xmlESF?=?myXmlDoc.CreateElement(ArcXML.NodeSpatialfilter);
37????????????xmlESF.SetAttribute(ArcXML.AttributeRelation,?"area_intersection");
38????????????xmlESQ.AppendChild(xmlESF);
39????????????XmlElement?xmlEEnv?=?(XmlElement)ArcXML.CreateExtent(ref?myXmlDoc,rct);
40????????????xmlESF.AppendChild(xmlEEnv);
41????????????string?strResponse?=?myMapNet.RequestArcXML(myXmlDoc.InnerXml,?ArcXML.enuCustomService.Query);
42????????????myXmlDoc?=?new?XmlDocument();
43????????????myXmlDoc.LoadXml(strResponse);
44????????????if(myXmlDoc.GetElementsByTagName("FIELD").Count?>?2)
45????????????{
46????????????????this.TB_BZ.Text?=?myXmlDoc.InnerXml;
47????????????}
48????????}
49
50…… 上面的代碼是當在地圖中點擊一點,顯示地圖中該點的屬性。
2、在.Net工程中引用ESRI.ArcIMS.Server.DLL文件,在一個頁面Button控件的單擊事件被觸發后,將獲得的ArcXML給一個TextBox控件的Text屬性。采用了Flyingis所說的方法,但未成功。將Flyingis所寫的代碼同時粘貼出來做個對比。
????? 首先,需要將.NET Link的程序集引用到開發環境中,我使用的是Visual Studio 2005,需要說明的是ArcIMS 9/9.1 的.NET Link在VS2003和VS2005中都能工作的很好,兼容性不錯。這樣ESRI.ArcIMS.Server.dll就加入了項目中。
??
???? ?第二步,建立到ArcIMS應用服務器的連接。
using?ESRI.ArcIMS.Server
……
ServerConnection?connection?=?new?ServerConnection();
connection.Host = "localhost";
connection.AppServerPort?=?5300;
connection.Scheme?=?Scheme.TCP;
???? ?如果需要建立一個HTTP連接,端口為80,可以將以上語句改為
connection.Scheme?=?Scheme.HTTP;?
connection.Host?=?"http://www.yourdomain.com";
connection.URIPort?=?80;
????? 第三步,發送一個ArcXML請求。在.NET Link中發送ArcXML請求,其實質就是對ArcXML文件的一種拼裝。
??
//?獲取默認的地圖服務
connection.ServiceName?=?"ServerSample";
//?建立一個?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響應。
System.Xml.XmlDocument?axlResponse?=?new?System.Xml.XmlDocument();
axlResponse.LoadXml(response);?
if?(axlResponse.GetElementsByTagName("OUTPUT").Count?==?1)
{?
????//?從?ArcIMS?應用服務器響應中獲取?"OUTPUT"?XmlNode?節點的集合,并且節點只有一個
????System.Xml.XmlNodeList?nodeOutput?=?axlResponse.GetElementsByTagName("OUTPUT");
????//?獲取這個節點的?url?屬性值
????imageURL?=?nodeOutput[0].Attributes["url"].Value;
}
????? 最后獲得的imageURL就是之前客戶端用戶發送請求需要服務器返回的圖片地址,用戶每次對地圖操作后看到的結果,其本質就是一張張圖片。
????? 上面是Flyingis在《ArcIMS 連接器--.NET Link 使用方法》所提到的代碼。下面是我的代碼:
?1using?System;
?2using?System.Collections;
?3using?System.ComponentModel;
?4using?System.Data;
?5using?System.Drawing;
?6using?System.Web;
?7using?System.Web.SessionState;
?8using?System.Web.UI;
?9using?System.Web.UI.WebControls;
10using?System.Web.UI.HtmlControls;
11using?System.Xml;
12using?ESRI.ArcIMS.Server;
13
14……
15
16private?void?Btn_SS_Click(object?sender,?System.EventArgs?e)
17????????{
18????????????ServerConnection?mySerCon?=?new?ServerConnection();
19????????????mySerCon.Scheme?=?Scheme.HTTP;
20????????????mySerCon.Host?=?"http://localhost";
21????????????mySerCon.URIPort = 80;
22????????????mySerCon.ServiceName?=?"DemoMap";
23????????????string?SendArcXMLText?=?"<?xml?version=\"1.0\"?encoding=\"UTF-8\"?><ARCXML?version=\"1.1\"><REQUEST><GET_FEATURES?outputmode=\"newxml\"?geometry=\"true\"?envelope=\"true\"?compact=\"true\"><LAYER?id=\"18\"?/><SPATIALQUERY><SPATIALFILTER?relation=\"area_intersection\"><ENVELOPE?minx=\"87.6087292191028\"?miny=\"43.7877048007505\"?maxx=\"87.6092644218237\"?maxy=\"43.7882400034714\"?/></SPATIALFILTER></SPATIALQUERY></GET_FEATURES></REQUEST></ARCXML>";
24????????????string?InceptArcXMLText?=?mySerCon.Send(SendArcXMLText);
25????????????this.TB_BZ.Text?=?InceptArcXMLText;
26????????????XmlDocument?InceptXmlDoc=?new?XmlDocument();
27????????????InceptXmlDoc.LoadXml(InceptArcXMLText);
28????????????if?(InceptXmlDoc.GetElementsByTagName("OUTPUT").Count?==?1)
29????????????{
30????????????????XmlNodeList?NodeOutPut?=?InceptXmlDoc.GetElementsByTagName("OUTPUT");
31????????????????this.MapNet1.ImageUrl?=?NodeOutPut[0].Attributes["url"].Value;
32????????????}
33????????}
34
35…… ????? 上面是我使用情況的代碼但是在運行觸發事件后,第24行報錯,錯誤提示為:“無效的 URI: 無法分析主機名。”。錯誤圖片如下:
應該是在“mySerCon.Host?=?"http://localhost";”里有什么錯誤了,但不太清楚如何改為正確的URL。不知道是否有人清楚呢?盼望回答
????? 我個人看了這兩處的代碼并對比后,有些被ArcInfo這些產品提供的東西弄糊涂了,為什么ArcIMS生成ArcXML有兩種解決方法呢,都有什么作用呢,那一種更好用更適合呢?
????? 下面將這兩處的代碼對比如下(其中Flyingis所說的方法在我這里并沒有運行成功,不知道還需要注意什么地方的設置或編碼):
1、在.Net工程中引用StudioAT.MapNet.DLL文件,下面的代碼為頁面上的MapNet控件的點擊事件(MapNet控件為可視化控件,也是通過添加StudioAT.MapNet.DLL文件獲得的,至于如何添加.Net以外的控件,我這里就不多說了。)
?1using?System;
?2using?System.Collections;
?3using?System.ComponentModel;
?4using?System.Data;
?5using?System.Drawing;
?6using?System.Web;
?7using?System.Web.SessionState;
?8using?System.Web.UI;
?9using?System.Web.UI.WebControls;
10using?System.Web.UI.HtmlControls;
11using?System.Xml;
12using?StudioAT.IMS;
13using?StudioAT;
14
15……
16
17/**////?<summary>
18///?單擊地圖時顯示相關的屬性信息和坐標信息
19///?</summary>
20///?<param?name="rct">點的大小范圍信息</param>
21private?void?MapNet1_Click(StudioAT.IRect?rct)
22????????{
23????????????IMapNet?myMapNet?=?this.MapNet1;
24????????????XmlElement?myXmlEle?=?null;
25????????????XmlDocument?myXmlDoc?=?(XmlDocument)ArcXML.BuildRequest(ArcXML.enuRequest.GET_FEATURES,?ref?myXmlEle);
26????????????myXmlEle.SetAttribute(ArcXML.AttributeOutputmode,"newxml");
27????????????myXmlEle.SetAttribute(ArcXML.AttributeGeometry,?"true");
28????????????myXmlEle.SetAttribute(ArcXML.AttributeEnvelope,?"true");
29????????????myXmlEle.SetAttribute(ArcXML.AttributeCompact,?"true");
30????????????XmlElement?xmlELayer?=?myXmlDoc.CreateElement(ArcXML.NodeLayer);
31????????????xmlELayer.SetAttribute(ArcXML.AttributeId,?this.DDL_Layer.SelectedValue);
32????????????myXmlEle.AppendChild(xmlELayer);
33????????????XmlElement?xmlESQ?=?myXmlDoc.CreateElement(ArcXML.NodeSpatialquery);
34????????????xmlELayer.SetAttribute(ArcXML.AttributeId,?this.DDL_Layer.SelectedValue);
35????????????myXmlEle.AppendChild(xmlESQ);
36????????????XmlElement?xmlESF?=?myXmlDoc.CreateElement(ArcXML.NodeSpatialfilter);
37????????????xmlESF.SetAttribute(ArcXML.AttributeRelation,?"area_intersection");
38????????????xmlESQ.AppendChild(xmlESF);
39????????????XmlElement?xmlEEnv?=?(XmlElement)ArcXML.CreateExtent(ref?myXmlDoc,rct);
40????????????xmlESF.AppendChild(xmlEEnv);
41????????????string?strResponse?=?myMapNet.RequestArcXML(myXmlDoc.InnerXml,?ArcXML.enuCustomService.Query);
42????????????myXmlDoc?=?new?XmlDocument();
43????????????myXmlDoc.LoadXml(strResponse);
44????????????if(myXmlDoc.GetElementsByTagName("FIELD").Count?>?2)
45????????????{
46????????????????this.TB_BZ.Text?=?myXmlDoc.InnerXml;
47????????????}
48????????}
49
50…… 上面的代碼是當在地圖中點擊一點,顯示地圖中該點的屬性。
2、在.Net工程中引用ESRI.ArcIMS.Server.DLL文件,在一個頁面Button控件的單擊事件被觸發后,將獲得的ArcXML給一個TextBox控件的Text屬性。采用了Flyingis所說的方法,但未成功。將Flyingis所寫的代碼同時粘貼出來做個對比。
????? 首先,需要將.NET Link的程序集引用到開發環境中,我使用的是Visual Studio 2005,需要說明的是ArcIMS 9/9.1 的.NET Link在VS2003和VS2005中都能工作的很好,兼容性不錯。這樣ESRI.ArcIMS.Server.dll就加入了項目中。
??
???? ?第二步,建立到ArcIMS應用服務器的連接。
using?ESRI.ArcIMS.Server
……
ServerConnection?connection?=?new?ServerConnection();
connection.Host = "localhost";
connection.AppServerPort?=?5300;
connection.Scheme?=?Scheme.TCP;
???? ?如果需要建立一個HTTP連接,端口為80,可以將以上語句改為
connection.Scheme?=?Scheme.HTTP;?
connection.Host?=?"http://www.yourdomain.com";
connection.URIPort?=?80;
????? 第三步,發送一個ArcXML請求。在.NET Link中發送ArcXML請求,其實質就是對ArcXML文件的一種拼裝。
??
//?獲取默認的地圖服務
connection.ServiceName?=?"ServerSample";
//?建立一個?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響應。
System.Xml.XmlDocument?axlResponse?=?new?System.Xml.XmlDocument();
axlResponse.LoadXml(response);?
if?(axlResponse.GetElementsByTagName("OUTPUT").Count?==?1)
{?
????//?從?ArcIMS?應用服務器響應中獲取?"OUTPUT"?XmlNode?節點的集合,并且節點只有一個
????System.Xml.XmlNodeList?nodeOutput?=?axlResponse.GetElementsByTagName("OUTPUT");
????//?獲取這個節點的?url?屬性值
????imageURL?=?nodeOutput[0].Attributes["url"].Value;
}
????? 最后獲得的imageURL就是之前客戶端用戶發送請求需要服務器返回的圖片地址,用戶每次對地圖操作后看到的結果,其本質就是一張張圖片。
????? 上面是Flyingis在《ArcIMS 連接器--.NET Link 使用方法》所提到的代碼。下面是我的代碼:
?1using?System;
?2using?System.Collections;
?3using?System.ComponentModel;
?4using?System.Data;
?5using?System.Drawing;
?6using?System.Web;
?7using?System.Web.SessionState;
?8using?System.Web.UI;
?9using?System.Web.UI.WebControls;
10using?System.Web.UI.HtmlControls;
11using?System.Xml;
12using?ESRI.ArcIMS.Server;
13
14……
15
16private?void?Btn_SS_Click(object?sender,?System.EventArgs?e)
17????????{
18????????????ServerConnection?mySerCon?=?new?ServerConnection();
19????????????mySerCon.Scheme?=?Scheme.HTTP;
20????????????mySerCon.Host?=?"http://localhost";
21????????????mySerCon.URIPort = 80;
22????????????mySerCon.ServiceName?=?"DemoMap";
23????????????string?SendArcXMLText?=?"<?xml?version=\"1.0\"?encoding=\"UTF-8\"?><ARCXML?version=\"1.1\"><REQUEST><GET_FEATURES?outputmode=\"newxml\"?geometry=\"true\"?envelope=\"true\"?compact=\"true\"><LAYER?id=\"18\"?/><SPATIALQUERY><SPATIALFILTER?relation=\"area_intersection\"><ENVELOPE?minx=\"87.6087292191028\"?miny=\"43.7877048007505\"?maxx=\"87.6092644218237\"?maxy=\"43.7882400034714\"?/></SPATIALFILTER></SPATIALQUERY></GET_FEATURES></REQUEST></ARCXML>";
24????????????string?InceptArcXMLText?=?mySerCon.Send(SendArcXMLText);
25????????????this.TB_BZ.Text?=?InceptArcXMLText;
26????????????XmlDocument?InceptXmlDoc=?new?XmlDocument();
27????????????InceptXmlDoc.LoadXml(InceptArcXMLText);
28????????????if?(InceptXmlDoc.GetElementsByTagName("OUTPUT").Count?==?1)
29????????????{
30????????????????XmlNodeList?NodeOutPut?=?InceptXmlDoc.GetElementsByTagName("OUTPUT");
31????????????????this.MapNet1.ImageUrl?=?NodeOutPut[0].Attributes["url"].Value;
32????????????}
33????????}
34
35…… ????? 上面是我使用情況的代碼但是在運行觸發事件后,第24行報錯,錯誤提示為:“無效的 URI: 無法分析主機名。”。錯誤圖片如下:
應該是在“mySerCon.Host?=?"http://localhost";”里有什么錯誤了,但不太清楚如何改為正確的URL。不知道是否有人清楚呢?盼望回答
轉載于:https://www.cnblogs.com/lijigang/archive/2007/01/23/628088.html
總結
以上是生活随笔為你收集整理的GIS开发随笔(3)——ArcXML和NET_Link方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 协议开发 中移动CMPP2.0协议API
- 下一篇: 自动登录DISCUZ,发帖的代码(部分)