1. ArcGis 9.2客户端开发简介(1)   <script src="" type="text/javascript"></script>

Server/Client方式ArcGis开发的模式如下图所示

ArcGis Server方式

     WebService方式

环境需要

       ArcGis Server开发方式主要是依靠服务器提供的WebService来实现功能,因此需要有一台安装有ArcGis Server的服务器为开发提供WebService支持。在ArcGis Server上发布了相关的MapServer资源后,便可以对该WebService服务进行开发。

       开发机上需要安装Visual Studio 2005软件开发平台。

流程描述

       ArcGis Server的基本开发方式是首先在ArcGis Server服务器上取得某一个GIS图形服务的MapServer服务。在找到服务并建立了连接以后,在取得这个MapServer的MapDescription。该MapDescription中描述了MapServer服务的众多内容,包括MapServer服务中包含了多少个图层、图层的名称,详细描述等等内容。在取得MapDescription后,根据显示图形的范围大小,向服务器提交服务,从而取得服务生成的图像,再将图像在程序中进行绘制。

       当对GIS图形进行操作的时候,将相关的变动、修改在MapServer服务图形描述MapDescription中得到反映,并提交到服务器中,从而可以实现对GIS图形的修改操作。

开发步骤

       打开VS2005,新建一个工程。在工程建立完毕以后,为该工程引用MapServer服务,如下图:

在Web引用名中输入FuzhouWS,然后点击添加引用,便可将某机器上发布的WapServer服务引用在例子工程中。

       WapServer服务建立成功以后,在Web引用中可以看到如下窗口

       在建立了服务引用以后,需要在程序中实现与MapServer服务的连接,以及取得该服务中GIS图形的基本描述。程序如下:

                 

FuzhouWs.fuZhouGis_MapServer map = new FuzhouWs.fuZhouGis_MapServer() ; 
     
                m_sDataFrame = map.GetDefaultMapName(); 
     
                FuzhouWs.MapServerInfo
取图层 
      
MapServerInfo则为取得的服务基本描述,在其中包含了大量的GISMap服务的基本信息。如果需要取得服务的图层信息,取图层有根据系统的需要基本有两种方式。
1、读取所有的图层,并将其添加到相关的图层显示控件中。
publicvoid AddLayToTree(TreeView
        { 
     
            String
            fuzhou.MapDescription
            fuzhou.MapServerInfo
            pMapDescription = m_sMapDesc; 
     
            int
            m_TreeView.Nodes.Clear(); 
     
            TreeNode[] m_tree; 
     
            for (int
            { 
     
                if
                { 
     
                    m_TreeView.Nodes.Add(mapi.MapLayerInfos[n].LayerID.ToString(), mapi.MapLayerInfos[n].Name); 
     
                    m_TreeView.Nodes[m].Checked = pMapDescription.LayerDescriptions[n].Visible; 
     
                    m = m + 1; 
     
                } 
     
                else 
      
                { 
     
                    if (mapi.MapLayerInfos[n].LayerType == "Group Layer") 
     
                    { 
     
                        m_tree = m_TreeView.Nodes.Find(mapi.MapLayerInfos[n].ParentLayerID.ToString(), true); 
     
                        m_tree[0].Nodes.Add(mapi.MapLayerInfos[n].LayerID.ToString(), mapi.MapLayerInfos[n].Name); 
     
                        m_tree[0].Nodes[m_tree[0].Nodes.Count - 1].Checked = pMapDescription.LayerDescriptions[n].Visible; 
     
                    } 
     
                    else 
      
                    { 
     
                        m_tree = m_TreeView.Nodes.Find(mapi.MapLayerInfos[n].ParentLayerID.ToString(), true); 
     
                        m_tree[0].Nodes.Add(mapi.MapLayerInfos[n].Name); 
     
                        m_tree[0].Nodes[m_tree[0].Nodes.Count - 1].Checked = pMapDescription.LayerDescriptions[n].Visible; 
     
                    } 
     
                } 
     
            } 
     
        }
       2、将某些特征图层根据需要添加到某个控件中,本实例中是将Feature图层添加到ComboBox控件中,并根据选择能将图层表中的各个字段添加到控件中:
       publicvoid AddLayerToComb(ComboBox
        { 
     
            String
            fuzhou.MapDescription
            fuzhou.MapServerInfo
            pMapDescription = mapi.DefaultMapDescription; 
     
            for (int
            { 
     
                if (mapi.MapLayerInfos[n].LayerType == "Feature Layer") 
     
                    m_Comb.Items.Add (mapi.MapLayerInfos[n].Name); 
     
            } 
     
        } 
     
     public void AddColumnToComb(String LayerName, ComboBox
        { 
     
            String
            fuzhou.MapServerInfo
            //fuzhou.MapDescription pMapDescription = mapi.DefaultMapDescription; 
      
            m_Comb.Items.Clear(); 
     
            m_Comb.Enabled = true; 
     
            for (int
            { 
     
                if
                { 
     
                    for(int
                        m_Comb.Items.Add( mapi.MapLayerInfos[i].FieldAliases[j].ToString());  
                } 
     
            } 
     
            m_Comb.SelectedIndex = 0; 
     
        }
显示图形
       当需要显示取得的图像的时候,可以使用下面的函数
              privatevoid drawMap(ref fuzhou.MapDescription pMapDescriptoin, System.Windows.Forms.PictureBox
        { 
     
            FuzhouWs.fuZhouGis_MapServer map = new FuzhouWs.fuZhouGis_MapServer();//取MapServer 
      
            FuzhouWs.ImageType it = new FuzhouWs.ImageType();//取该服务生成图片的类型及大小 
      
            it.ImageFormat = FuzhouWs.esriImageFormat.esriImageJPG; 
     
            it.ImageReturnType = FuzhouWs.esriImageReturnType.esriImageReturnMimeData; 
     
            idisp = new FuzhouWs.ImageDisplay(); 
     
            idisp.ImageHeight = PictureBox.Height ;//根据显示控件的大小调整生成图片的大小 
      
            idisp.ImageWidth = PictureBox.Width ; 
     
            idisp.ImageDPI = 150;//设置生成图片的分辨率 
      
            FuzhouWs.ImageDescription pID = new FuzhouWs.ImageDescription(); 
     
            pID.ImageDisplay = idisp; 
     
            pID.ImageType = it; 
     
            FuzhouWs.MapImage将设置提交服务 
      
            System.IO.Stream pStream = new System.IO.MemoryStream((byte[])pMI.ImageData);//取生成的图片流 
      
            pImage = Image.FromStream(pStream); 
     
            PictureBox.Image = pImage; 
     
            PictureBox.Refresh(); 
     
            return; 
     
        } 
     
鹰眼显示 
      
       publicvoid EagerFresh(PictureBox m_eyePictureBox, Graphics
        { 
     
            String
            fuzhou.MapServerInfo
            m_sEyeMapDesc = mapi.DefaultMapDescription; 
     
            fuzhou.EnvelopeN EagerpEnvelope = m_sEyeMapDesc.MapArea.Extent as fuzhou.EnvelopeN; 
     
            fuzhou.EnvelopeN pEnvelope = m_sMapDesc.MapArea.Extent as fuzhou.EnvelopeN; 
     
            double
            double
            double
            double
            PointClass m_tmpPoint = new PointClass(); 
     
            m_tmpPoint.X = pEnvelope.XMax; 
     
            m_tmpPoint.Y = pEnvelope.YMax; 
     
            fuzhou.ImageDisplay
            idisp1 = new fuzhou.ImageDisplay(); 
     
            idisp1.ImageHeight = m_eyePictureBox.Height; 
     
            idisp1.ImageWidth = m_eyePictureBox.Width; 
     
            idisp1.ImageDPI = 150; 
     
            fuzhou.PointN pnt=new fuzhou.PointN()  ; 
     
            pnt.X =m_tmpPoint.X; 
     
            pnt.Y = m_tmpPoint.Y; 
     
            fuzhou.MultipointN mpnt = new fuzhou.MultipointN(); 
     
            fuzhou.Point[] pnta =new  fuzhou.Point[1]; 
     
            pnta[0] = pnt; 
     
            mpnt.PointArray = pnta; 
     
            int[] Xs; 
     
            int[] Ys = map.FromMapPoints(m_sEyeMapDesc, idisp1, mpnt, out将GIS图形显示控件显示图形的各个坐标转换到鹰眼中对应的坐标 
      
            int
            int
            m_tmpPoint.X = pEnvelope.XMin ; 
     
            m_tmpPoint.Y = pEnvelope.YMin ; 
     
            pnt.X = m_tmpPoint.X; 
     
            pnt.Y = m_tmpPoint.Y; 
     
            pnta[0] = pnt; 
     
            mpnt.PointArray = pnta; 
     
            Ys = map.FromMapPoints(m_sEyeMapDesc, idisp1, mpnt, out将GIS图形显示控件显示图形的各个坐标转换到鹰眼中对应的坐标 
      
            int
            int
            xFactor = m_minX; 
     
            yFactor = m_maxY; 
     
            eWidth = Math.Abs(m_maxX - m_minX); 
     
            eHeight = Math.Abs(m_maxY - m_minY); 
     
            Pen redPen = new Pen(Color.Red, 2); 
     
            Rectangle rect = new Rectangle((int)xFactor, (int)yFactor, (int)eWidth, (int)eHeight);//得出GIS图形在鹰眼中的显示范围 
      
            g.DrawRectangle(redPen, rect);//在鹰眼中画出范围 
      
            m_eyePictureBox.Invalidate(); 
     
        }

       以下是程序基本框架:

  1.        界面左侧是鹰眼和查询工具栏,右侧是 GIS 地图图形。 

Trackback: