ArcIMS 连接器--.NET Link 使用方法

 作者:Flyingis[url=http://www.blogjava.net/flyingis/][/url]

    前几天马维峰写了一篇关于ArcIMS文章——《[url=http://www.cnblogs.com/maweifeng/archive/2006/07/28/462417.html]浅析ArcIMS[/url]》,主要分析了ArcIMS的基本体系结构和几种二次开发模式的简单对比,比笔者之前的《ArcIMS体系结构》分析的透彻许多。

    ArcIMS二次开发,关注最多的无非是它的连接器(connector)和ArcXML。在这些连接器中,Servlet Connector通过纯粹的ArcXML文件来传输请求和响应,ColdFusion Connector在其自身的运行环境中使用自定义tags来产生ArcXML请求和响应,Java Connector和ActiveX Connector比较类似,通过一组API(Java Connector还有标签库)来产生ArcXML请求和响应,它们是面向对象的开发方式,比较符合一般程序员的思维习惯。.NET Link比较特殊,最初我认为它和Java Connector、ActiveX Connector一样,通过一系列API来定义、生成ArcXML文件中的节点与属性,但事实上并非如此,简单来说,它仅仅是对XML文件的一种搭配与组装,使用.NET Framework中对XML文件的操纵方式拼装出所需的ArcXML请求,并接受ArcIMS应用服务器的响应,其参考手册中只有服务连接和 AxlRequest相关的几个类的说明,也难怪ESRI为什么要给它要取名为.NET Link,而不是.NET Connector。

    离ArcGIS 9.2正式发布已经没有多长时间,.NET Link能否得到改进至少像它的前辈ArctiveX Connector一样还不清楚。.NET Link的这种开发方式使得开发人员需要更多的关注ArcXML_reference,下面将简单说明.NET Link的使用方法。

    首先,需要将.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就是之前客户端用户发送请求需要服务器返回的图片地址,用户每次对地图操作后看到的结果,其本质就是一张张图片。

    现在思路比较清晰了,ArcIMS地图服务发布后,其展现的内容主要是由开发中所定制的ArcXML文件的内容所决定,开发人员需要面对大量ArcXML 中的子元素及其属性设置,对于面向对象的开发而言显然是笨了一些,但从原理上来说,还是比较简单的,关键就是要看开发人员对ArcXML文档的熟悉程度了。

    使用.NET Link进行ArcIMS二次开发的过程中,对ArcXML的子元素和属性进行操纵与设置不是一件令人愉快的事,但其中真正的困难还要数客户端大量javascript脚本的应用和数据传递,有机会拿一两个简单例子讨论一下。posted on 2006-07-30 21:36 Flyingis 阅读(2355) 评论(29)  编辑  收藏 所属分类: ArcIMS

 

评论#1楼  2006-07-30 22:47 双鱼座 感觉.NET Link就是一鸡肋。当初我把它当着法宝一样推荐给了我的同事使用。呵呵,结果同事被这个东西折腾个半死。最后换成了System.Net下的对象来通信,既稳定又省事。   回复  引用  查看    
#2楼  2006-07-31 02:00 edison1024 靠。。。。我没怎么玩过arcims,不过我看这文章介绍后,这个所谓的.net link简直就是多此一举,画蛇添足。

如果web服务器与应用服务器部署在同一台机器,这多了一层的通讯完全是在走弯路。如果是异地部署,框架里大把通讯类可以轻松完成这种字符串的传送,封装这个ServerConnection没什么营养。而这种看似简单的封装如果在对网络异常考虑不足的时候,用他的人绝对被玩死。

哦?好像楼上和我想的一样,hehe
  回复  引用  查看    
#3楼  2006-07-31 02:02 edison1024 哦,顺便问一下,有没有谁了解arcims支不支持WMS,WFS   回复  引用  查看    
#4楼 [楼主] 2006-07-31 18:41 Flyingis @双鱼座
不是项目在.net平台下做,我肯定用javaconnector来实现了,.NET Link这种开发方式就是这么笨!

@edison1024
ArcIMS 有 wmsconnector 的支持,用JSP实现的,需要的话我把自带的例子发给你。   回复  引用  查看    
#5楼  2006-08-06 00:24 edison1024 哦,不用了,其实我一直在好奇ESRI对OGC规范支持的持一种什么态度,虽然它一只在推动OGC   回复  引用  查看    
#6楼 [楼主] 2006-08-07 22:16 Flyingis 一个不恰当的比方,这个就好比之前Oracle支持开源的态度,始终没办法像IBM一样来大力扶持开源,总希望靠开源来推动自己的商业市场。   回复  引用  查看

 

#7楼 [TrackBack] 2007-01-23 16:32 刚刚 本系列随笔将和大家一起来开发GIS中的项目中的某些环节。这次的随笔是关于使用VS.Net2003来编写ArcIMS中所用到的ArcXML文档的,不知道所提到的两种方法哪种更好?
[引用提示]刚刚引用了该文章, 地址: http://www.cnblogs.com/lijigang/archive/2007/01/23/628088.html   回复  引用  查看    
#8楼  2007-04-04 20:26 cindy [未注册用户] ShapeWorkspace("citiesWorkspace", @"C:\Inetpub\wwwroot\sample_data\NorthAmerica")


例子中有一个这样的函数,不太清楚这个函数是什么意思
是指将NorthAmerica李的.shp文件转换为一个叫citiesWorkspace的workspace吗?


我执行这一段代码之后发现地图上这个图层没有加载上来
不知道是什么原因

而且我并没有在axl文档中发现< MAP dynamic="true" >
所以我把axl文档中这一行给改成这样了,
不知道对不对
请你帮我解释一下
谢谢   回复  引用  查看    
#9楼 [楼主] 2007-04-05 09:26 Flyingis @cindy
1.ShapeWorkspace定义shape数据源的目录。
2.当需要加入新的动态图层时,需要在request中将map dynamic属性设置为true。   回复  引用  查看    
#10楼  2007-04-09 22:00 cindy [未注册用户] to flyinggis
使用9.2的控件toc
想达到这样的效果,点击checkbox,想作除了控制图层的显示之外的操作
比如说两个相互叠加的图层就不能同时显示
看到在toc的属性里有OnNodeLegendClicked属性,写了个函数




在javascript里是这样定义的


<script language="javascript" type="text/javascript">
function checkup()
{
for(int i=0;i<10;i++)
{
printf(i);
}
}

</script>


但是每次编译都会出错,说找不到checkuo函数的定义
是怎么回事?

这种OnNodeLegendClicked函数应该怎么定义呢?

esri公司应该包装的就是和html控件差不多的控件吧
我就是按照这种方式来作的啊

  回复  引用  查看

 

#11楼 [楼主] 2007-04-12 11:43 Flyingis @cindy
"两个相互叠加的图层就不能同时显示"
是两个什么类型的图层呢?点在面上就是很正常的显示方式。

js代码没有printf,只有alert。   回复  引用  查看    
#12楼  2007-06-01 15:30 皮皮 [未注册用户] 我在安装arcims9.0的时候,为什么会没有.net link runtime。   回复  引用  查看    
#13楼 [楼主] 2007-06-01 15:34 Flyingis @皮皮
需要先安装visual studio 2003 / 2005   回复  引用  查看    
#14楼  2007-06-01 15:36 皮皮 [未注册用户] 我想问一下,为什么在安装arcims9.0的时候,没有.net link runtime这一项啊。因为要用到,所以很急,能不能帮帮忙指点一下啊。谢谢了。   回复  引用  查看    
#15楼  2007-06-01 15:37 皮皮 [未注册用户] 我已经安装了visual studio 2005 ,可还是没有啊。   回复  引用  查看

 

#16楼 [楼主] 2007-06-01 21:23 Flyingis 必须先安装Visual Studio 2005,然后再安装ArcIMS。   回复  引用  查看    
#17楼  2007-06-04 08:57 皮皮 [未注册用户] 我的就是先安装了Visual Studio 2005后又安装的ArcIMS。我在别的网站上看到ArcIMS 9要求有.NET Framework 1.1和.NET Framework 1.1 SDK的情况下才能安装.NET Link和开发帮助。是这样吗??我这只有.NET Framework 2.0.没有.NET Framework 2.0 SDK,是不是需要安装.NET Framework 2.0 SDK??还有,安装.NET Framework 2.0 SDK会不会对vs2005的应用造成影响啊。
  回复  引用  查看    
#18楼  2007-06-04 09:25 @皮皮 [未注册用户] 你可能是选择的典型安装,要完全安装才有这个!你可以在安装向导中选择"修改(Modify)",下一步,然后选择点击"Application server connectors",就会看到.net link runtime,选中即可.我也遇到过这种问题,呵呵!   回复  引用  查看    
#19楼  2007-06-04 09:37 皮皮 [未注册用户] 你说的是在修改是在安装arcims还是vs2005中??   回复  引用  查看    
#20楼  2007-06-04 09:45 @皮皮 [未注册用户] 我的qq是26771237,在那里说好了.   回复  引用  查看

 

#21楼  2007-06-04 09:53 皮皮 [未注册用户] 那要不要安装.NET Framework 2.0 SDK??
我在安装的时候,出现这样的字句:the following features cannot be installed on this machine due to missing dependencies:.net link runtime and developer help.是不是因为没有安装.NET Framework 2.0 SDK??   回复  引用  查看    
#22楼  2007-06-04 09:59 @皮皮 [未注册用户] .net 也要安装,否则不叫.net link了,在arcims中有安装.net link中的选项(在server connector 中可以看到),默认是不安装的,要手动选择.   回复  引用  查看    
#23楼 [楼主] 2007-06-04 10:55 Flyingis @皮皮
典型安装里是没有选择.net link的,需要手动选择。你安装了vs2005就会自动安装.net framework sdk 2.0,你安装了vs2005为什么没有sdk呢?   回复  引用  查看    
#24楼 [楼主] 2007-06-05 10:11 Flyingis 想起来了,ims9.0需要.net framework sdk1.1   回复  引用  查看    
#25楼  2007-06-10 13:49 皮皮 [未注册用户] 我想问一下,怎么把arcims引用的vs2005里面。
哪有arcims中文教材??   回复  引用  查看

#26楼 [楼主] 2007-06-14 14:00 Flyingis @皮皮
在vs2005中添加引用,在ArcIMS目录中找到.net_link的dll。
中科永生有ArcIMS的中文教材,还有就是各种webgis书籍,最好还是看帮助文档,分析一下blueviewer或htmlviewer的代码。   回复  引用  查看    
#27楼  2007-09-25 00:06 sdf [未注册用户] @皮皮
  回复  引用  查看    
#28楼  2007-11-13 16:08 summershasha [未注册用户] 如何将ArcIMS与VS2003连接。我现在找不到ArcIMS怎样用C#来写程序。急于做一个信息服务,需要用C#写程序使ArcIMS发布的网络地图能够获取到数据库中数据,请帮帮忙啊!!   回复  引用  查看    
#29楼 [楼主] 2007-11-16 09:17 Flyingis @summershasha
将.net_link dll动态库添加到vs2003工程中,然后就可以调用连接arcims服务器的方法了,C#主要写的是arcxml。   回复  引用  查看


posted @ 2008-12-03 18:22  googlegis  阅读(277)  评论(0编辑  收藏  举报

坐标合肥,非典型GIS开发人员 GitHub