加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

ArcGis 9.2客户端开发简介(1)

发布时间:2020-12-17 02:44:35 所属栏目:安全 来源:网络整理
导读:ArcGis 9.2客户端开发简介(1) ?? ?? ? Server/Client 方式 ArcGis 开发的模式如下图所示 ? ArcGis Server 方式 ???? WebService 方式 环境需要 ?????? ArcGis Server 开发方式主要是依靠服务器提供的 WebService 来实现功能,因此需要有一台安装有 ArcGis Se
  1. ArcGis 9.2客户端开发简介(1)??

    ??

    ?

    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

    ??????????????? {

    ??????????????????? 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,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 地图图形。?

    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1920285

    ?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读