程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> ArcGis 9.2客戶端開發簡介(1)

ArcGis 9.2客戶端開發簡介(1)

編輯:.NET實例教程

ArCGIsC/S模式有多種開發模式,在本文中將對基於ArCGIs ServerWebService方式和遠程Com調用方式以及基於ArCGIs Engine的開發方式做一個簡單的介紹。

 

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服務。在找到服務並建立了連接以後,在取得這個MapServerMapDescription。該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 mapi = map.GetServerInfo(m_sDataFrame);

取圖層

MapServerInfo則為取得的服務基本描述,在其中包含了大量的GISMap服務的基本信息。如果需要取得服務的圖層信息,取圖層有根據系統的需要基本有兩種方式。

1、讀取所有的圖層,並將其添加到相關的圖層顯示控件中。

public void AddLayToTree(TreeView m_TreeVIEw)

        {

            String m_sDataFrame = map.GetDefaultMapName();

            fuzhou.MapDescription pMapDescription;

            fuzhou.MapServerInfo mapi = map.GetServerInfo(m_sDataFrame);

            pMapDescription = m_sMapDesc;

            int m = 0;

            m_TreeVIEw.Nodes.Clear();

            TreeNode[] m_tree;

            for (int n = 0; n < mapi.MapLayerInfos.GetLength(0); n++)

            {

                if (mapi.MapLayerInfos[n].ParentLayerID == -1)

                {

                    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

                {

 &
nbsp;                  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控件中,並根據選擇能將圖層表中的各個字段添加到控件中:

       public void AddLayerToComb(ComboBox m_Comb)

        {

            String m_sDataFrame = map.GetDefaultMapName();

            fuzhou.MapDescription pMapDescription;

            fuzhou.MapServerInfo mapi = map.GetServerInfo(m_sDataFrame);

            pMapDescription = mapi.DefaultMapDescription;

            for (int n = 0; n < mapi.MapLayerInfos.GetLength(0); n++)

>            {

                if (mapi.MapLayerInfos[n].LayerType == "Feature Layer")

                    m_Comb.Items.Add (mapi.MapLayerInfos[n].Name);

            }

        }

 

     public void AddColumnToComb(String LayerName, ComboBox m_Comb)

        {

            String m_sDataFrame = map.GetDefaultMapName();

           

            fuzhou.MapServerInfo mapi = map.GetServerInfo(m_sDataFrame);

            //fuzhou.MapDescription pMapDescription = mapi.DefaultMapDescription;

            m_Comb.Items.Clear();

            m_Comb.Enabled = true;

            for (int i = 0; i < mapi.MapLayerInfos.GetLength(0); i++)

            {

                if (mapi.MapLayerInfos[i].Name == LayerName)

                {

                    for(int j=0 ;j<mapi.MapLayerInfos[i].Fields.FIEldArray.GetLength(0);j++)

                        m_Comb.Items.Add( mapi.MapLayerInfos[i].FIEldAliases[j].ToString()); 

                }

            }

            m_Comb.SelectedIndex = 0;

        }

顯示圖形

       當需要顯示取得的圖像的時候,可以使用下面的函數

              private void drawMap(ref fuzhou.MapDescription pMapDescriptoin, System.Windows.Forms.PictureBox m_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 pMI = map.ExportMapImage(pMapDescriptoin, pID);//將設置提交服務

            System.IO.Stream pStream = new System.IO.MemoryStream((byte[])pMI.ImageData);//取生成的圖片流

            pImage = Image.FromStream(pStream);

            PictureBox.Image = pImage;

            PictureBox.Refresh();

            return;

        }

鷹眼顯示

       public void EagerFresh(PictureBox m_eyePictureBox, Graphics g)

        {

            String m_sDataFrame = map.GetDefaultMapName();

            fuzhou.MapServerInfo mapi = map.GetServerInfo(m_sDataFrame);

            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 eWidth;

double eHeight;

            double xFactor;

            double yFactor;

            PointClass m_tmpPoint = new PointClass();

            m_tmpPoint.X = pEnvelope.XMax;

            m_tmpPoint.Y = pEnvelope.YMax;

            fuzhou.ImageDisplay idisp1;

            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 Xs);//將GIS圖形顯示控件顯示圖形的各個坐標轉換到鷹眼中對應的坐標

            int m_maxX = Ys[0];

            int m_maxY = Xs[0];

            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 Xs); //將GIS圖形顯示控件顯示圖形的各個坐標轉換到鷹眼中對應的坐標

            int m_minX = Ys[0];

            int m_minY = Xs[0];

            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();

        }

 

       以下是程序基本框架:

      

       界面左側是鷹眼和查詢工具欄,右側是GIS地圖圖形。 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved