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文件。总之这种文件能够定义地图的图层及显示效果等,你的程序必须能够加载种文件。
    主要就是这几条吧。我也没有偿试去做,因为我现在不需要用它了~呵呵。
   

原文地址:https://www.cnblogs.com/watsonyin/p/301897.html