《设计之AE开发初步.ppt》由会员分享,可在线阅读,更多相关《设计之AE开发初步.ppt(49页珍藏版)》请在三一办公上搜索。
1、GIS设计与应用,GIS设计之AE开发,本章内容,1.AE是什么?2.AE的功能 3.AE开发步骤,AE是什么?,ArcGIS Engine是用于构建定制应用的一个完整的嵌入式的GIS组件库。在ArcGIS Engine里面包含着两个部分:ArcGIS Engine开发包(Developer kit)被开发者用来构建客户化应用程序ArcGIS Engine运行时(Runtime)使得最终用户能在他们的计算机里运行包括ArcGIS Engine组件的应用程序,AE的功能,包装了AO的绝大部分功能,是ArcGIS推荐的首选二次开发平台。,AE开发步骤,1用AE 术语对问题进行描述和定义,合理地将大
2、任务合理划分为一些子任务;2理解AE 的层次组织关系,标识和明确各子任务的关键字;3决定在什么地方来编写代码,是VBA 呢,还是VB 或其它工具;4根据标识的关键字在AE Developer help 和其它开发资源中搜索有没有相关示例代码。5 打开正确的对象模型图(OMD),寻找所需要的类、接口。6 在AE Component Help 中浏览有关接口的详细说明及相关文档;7 在开发环境中使用确定的接口及其方法属性等,完成代码实现。,主要Library介绍,SystemSystem库是ArcGIS框架中最底层的一个库,它包含了一些被其他库使用的一些组件。SystemUISystemUI库定义
3、了一些在ArcGIS中被用户界面组件使用的类型。象Icommand和Itool这样的接口就在这里定义。,主要Library介绍,Geometry几何库包含了核心的几何对象,比如点,面,线等。在几何库中还定义和实现了空间参考的对象,包括投影坐标系和几何坐标系。Display显示库包含了支持在输出设备上显示图形的组件,屏幕显示,符号,颜色等都在这个库中定义。Controls控件库包含了应用程序开发中用到的控件,包括在控件中使用的命令和工具。,Geometry,主要对几何对象的处理,重要的几何对象包括Point,MultiPoint,PolyLine,PolyGon,还有Segment,Path和R
4、ing。所有这些几何对象都有Z,M和IDs属性值,并且支持Buffer,Clip的操作。,CartoCarto库包含了为数据显示服务的对象。PageLayout和Map对象在这个库中,以及支持各种数据类型的图层,渲染。这个库中也包括了MxdServer和MapServer对象,它们通常被Server用来显示地图数据。GeoDatabaseGeoDatabase包含了所有相关数据组织的定义类型。要素,表,网络,TIN都在这个库中定义。其中一些类型的实现在各自的数据来源的库中。,DataSourcesFileDataSourcesFile库包含了为支持的矢量数据格式提供的工作空间工厂和工作空间.D
5、ataSourcesGDBDataSourcesGDB 库包含了为存储在RDBMS中的矢量和栅格数据提供的工作空间工厂和工作空间。GeoDatabaseDistributedGeoDatabaseDistributed 库包含了需要执行checkout/checkin 的离线GeoDatabase的对象。DataSourcesOleDBDataSourcesOleDB 库为通过OleDB方式提供的数据提供空组空间。DataSourcesRasterDataSourcesRaster 包含了为基于文件方式的栅格数据提供的工作空间工厂和工作空间,GISClientGISClient库包含了作用于远
6、程GIS服务的对象。这些远程服务可以有ArcGIS Server和ArcIMS提供。Server库包含了连接ArcGIS Server的对象,以及管理这个连接的对象。,GeoAnalystGeoAnalyst库包含了核心的空间分析功能,这些功能是在spatialAnalyst和3DAnalyst扩展都会用到的功能。3DAnalyst3DAnalyst库包含了数据的3d分析对象,也包括显示3d数据,在这个库中有一个控件SceneControl可用。GlobeCoreGlobeCore库包含了globe数据分析的对象,也包含了显示globe数据,在这个库中有一个控件GlobeControl可用。S
7、patialAnalystSpatialAnalyst库包含了在栅格和矢量数据上执行空间分析的对象。,AE 开发实例二维开发,实现功能:1.实现地图控件的显示2.实现部分AE组件的调用3.实现地图中要素的查询,实现步骤:一、界面简单设计,1 新建工程,一、界面简单设计,2.添加菜单使用.Net的mainmenu控件,一、界面简单设计,3.拖拽Arc Engine的3个控件到Form界面上License Control(最好最先放在前面)、ToolBarControl、MapControl依次放在界面上,如图所示:,一、界面简单设计,4.把TabControl控件拖到界面适当位置:,一、界面简单
8、设计,5.在数据视图中放置MapControl,布局视图中放置PageLayoutControl:,二、设置控件属性,6.设置ToolBarControl的属性1)选择Buddy选项为axMapControl22)选择Preview in Design Mode复选框,如右上图。3)Items选项卡中点击Add按钮,添加一些ArcGIS控件到工具栏上,如右下图。,二、设置控件属性,7.设置TocControl的属性在buddy处选择axMapControl2选择Preview in Design Mode复选框,二、设置控件属性,10.设置控件锚位置选择每一个控件的Anchor属性,设置控件所
9、在位置,特别是窗口最大化后应向何方向延伸,比如ToolBarControl是top、left、right属性。,二、设置控件属性,9.运行可以看到没有写一行代码即可以使用工具条上按钮打开并浏览地图,最大化窗口查看是否正常缩放控件并调整。,三、添加代码,10.添加加载地图文档的代码在Form_Load中添加如下代码(可参考示例程序Exa_1_BasicQuery):,try string strFileName=Application.StartupPath+数据房地产策划信息系统.mxd;/在数据视图中加载地图,供查询操作 if(axMapControl2.CheckMxFile(strFil
10、eName)axMapControl2.LoadMxFile(strFileName);else MessageBox.Show(错误的数据路径:+strFileName);,/在布局视图中加载地图,供打印使用 if(axPageLayoutControl1.CheckMxFile(strFileName)axPageLayoutControl1.LoadMxFile(strFileName);else MessageBox.Show(错误的数据路径:+strFileName);catch(Exception ex)MessageBox.Show(Error01 in Form1.cs+ex.
11、Message);,四、实现查询功能,11.添加窗体frmInputQueryInfo设计界面进行查询,如图所示:,四、实现查询功能,12.对frmInputQueryInfo添加代码1.按钮处进行隐藏窗体操作2.添加返回私有字段textbox1值的方法getQueryKey,如下所示:,private void btnQuery_Click(object sender,EventArgs e)this.Hide();/自定义方法,获取查询的关键字 public string getQueryKey()return textBox1.Text;,四、实现查询功能,在查询菜单项的单击事件处理中添
12、加如下代码,代码说明参考注释:,/查询 private void menuItem3_Click(object sender,EventArgs e)frmInputQueryInfo myQueryInfo=new frmInputQueryInfo();myQueryInfo.ShowDialog();/获取线路名 string strBusLineName=myQueryInfo.getQueryKey();/开始显示该线路:/找到图层 IFeatureLayer pFeatureLayer=axMapControl2.get_Layer(1)as IFeatureLayer;/确定图层
13、为第2个图层,ArcMap中从上向下数/找到要素Feature IQueryFilter pQueryFilter=new QueryFilter();/查询过滤条件 pQueryFilter.WhereClause=BusLineName=+strBusLineName+;,IFeatureCursor pFeatureCur=pFeatureLayer.Search(pQueryFilter,false);IFeature pFeature=null;pFeature=pFeatureCur.NextFeature();if(null=pFeature)return;/在这里判断是否Sea
14、rch到,因为pFeatureCur没有查找到结果也不为空。/设定显示区域为要素的大小 IEnvelope pEnvelope;pEnvelope=pFeature.Shape.Envelope;axMapControl2.Extent=pEnvelope;axMapControl2.ActiveView.Refresh();Application.DoEvents();/开始闪烁 axMapControl2.FlashShape(pFeature.Shape,3,800,null);,小结,运行此程序,输入“38路”或“336路”即可实现对应公交线路的闪烁。至此,实现了一个简单的二维查询,查
15、询处的代码(幻灯片上一页)是一个经典并且常用的示例代码,请注意分析。,五、添加功能,13.添加数据表格1.在frmInputQueryInfo添加DataGridView控件.2.在代码中添加A访问数据库的代码。,/在 Form构造函数中添加如下代码:try/在构造函数中初始化成员变量 myCon=new OleDbConnection(Provider=Microsoft.Jet.OLEDB.4.0;Data Source=+Application.StartupPath+数据REALESTATEGDB.mdb);myCon.Open();string sql;sql=Select BusL
16、ineName,BusLineType,other from BusLine;myAda=new OleDbDataAdapter(sql,myCon);mySet=new DataSet();myCmd=new OleDbCommand(sql,myCon);myAda.SelectCommand=myCmd;myCbd=new OleDbCommandBuilder(myAda);catch(Exception ex)MessageBox.Show(ex.ToString();finally myCon.Close();,private void frmInputQueryInfo_Loa
17、d(object sender,EventArgs e)try myAda.Fill(mySet,BusLine);dataGridView1.DataSource=mySet.TablesBusLine;/Resize the DataGridView columns to fit the newly loaded content.dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);catch(Exception ex)MessageBox.Show(ex.Message);,/在 文本框控件输入
18、change事件中添加如下代码:private void textBox1_TextChanged(object sender,EventArgs e)try myCon.Open();string sql;sql=Select BusLineName,BusLineType,other from BusLine where BusLineName like%+textBox1.Text+%;myAda=new OleDbDataAdapter(sql,myCon);myTab=new DataTable();myAda.Fill(myTab);dataGridView1.DataSource
19、=myTab;/Resize the DataGridView columns to fit the newly loaded content.dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);catch(OleDbException ex)MessageBox.Show(ex.Message.ToString();finally myCon.Close();,运行界面如下所示:,14.当数据视图或布局视图中地图文档发生改变后做相应处理:在Form1.cs文件中添加如下代码:,/当数据视图文档发生
20、变化后,把文档加载到鹰眼视图的地图控件axMapControl1中 private void axMapControl2_OnMapReplaced(object sender,IMapControlEvents2_OnMapReplacedEvent e)/加载地图文档到MapControl中 axMapControl1.LoadMxFile(axMapControl2.DocumentFilename,null,null);/设置MapControl显示范围至数据的全局范围 axMapControl1.Extent=axMapControl1.FullExtent;/当布局视图文档发生变化
21、后,把文档加载到鹰眼视图的地图控件axMapControl1中 private void axPageLayoutControl1_OnPageLayoutReplaced(object sender,IPageLayoutControlEvents_OnPageLayoutReplacedEvent e)/加载地图文档到MapControl中 axMapControl1.LoadMxFile(axPageLayoutControl1.DocumentFilename,null,null);/设置MapControl显示范围至数据的全局范围 axMapControl1.Extent=axMap
22、Control1.FullExtent;,15 鹰眼视图功能的实现参考ArcGIS Engine开发实例讲解(pdf文档)(九)在MapControl 上绘制图形,15.1 为Form1类添加成员变量私有字段,namespace Exp_6_mg public partial class Form1:Form/自定义私有成员变量 private IToolbarMenu m_ToolbarMenu=new ToolbarMenuClass();/弹出式菜单 private IEnvelope m_Envelope;/MapControl 绘制的范围 private object m_FillS
23、ymbol;/在MapControl 上绘制范围使用的符号 private ITransformEvents_VisibleBoundsUpdatedEventHandler visBoundsUpdatedE;/PageLayoutControl 的焦点图事件 public Form1()InitializeComponent();,15.2创建一个叫CreateOverviewSymbol 的新函数:,private void CreateOverviewSymbol()/获取IRGBColor 接口 IRgbColor color=new RgbColor();/设置颜色属性 color
24、.RGB=255;/获取ILine 符号接口 ILineSymbol outline=new SimpleLineSymbol();/设置线符号属性 outline.Width=1.5;outline.Color=color;/获取IFillSymbol 接口 ISimpleFillSymbol simpleFillSymbol=new SimpleFillSymbolClass();/设置填充符号属性 simpleFillSymbol.Outline=outline;simpleFillSymbol.Style=esriSimpleFillStyle.esriSFSHollow;m_Fill
25、Symbol=simpleFillSymbol;,15.3.在Form1_Load 事件函数中调用CreateOverviewSymbol 函数。,catch(Exception ex)MessageBox.Show(Error01 in Form1.cs+ex.Message);/以上是加载文档的代码/创建MapControl 使用的符号,即鹰眼视图的矩形范围框 CreateOverviewSymbol();,15.4 增加下列OnVisibleBoundsUpdated 函数,/OnVisibleBoundsUpdated 函数。/此函数将与地图范围改变时触发的事件相连接,并用来设置新的地
26、图可见边界范围框。通过刷新MapControl,你强制它重绘其上显示的图形。private void OnVisibleBoundsUpdated(IDisplayTransformation sender,bool sizeChanged)/设置新的可见范围 m_Envelope=sender.VisibleBounds;/改变MapControl 的前景状态 axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewForeground,null,null);,15.5在PageLayoutControl_OnPag
27、eLayoutReplaced 事件处理中的加载文档代码前面增加以下代码。,/PageLayoutControl 默认的事件接口是IPageLayoutControlEvents。这些事件不告诉我们数据边框内的地图范围。/为此你需要使用PageLayoutControl的焦点地图的ItransformEvents 接口。/在PageLayoutControl_OnPageLayoutReplaced 事件处理中的加载文档代码前面增加获取焦点图的范围的代码。/当布局视图文档发生变化后,把文档加载到鹰眼视图的地图控件axMapControl1中 private void axPageLayoutC
28、ontrol1_OnPageLayoutReplaced(object sender,IPageLayoutControlEvents_OnPageLayoutReplacedEvent e)/获取PageLayoutControl 中焦点地图的IActiveView 对象 IActiveView activeView=(IActiveView)axPageLayoutControl1.ActiveView.FocusMap;/捕捉PageLayoutControl 的焦点图的ITransformEvents 事件 visBoundsUpdatedE=new ITransformEvents_
29、VisibleBoundsUpdatedEventHandler(OnVisibleBoundsUpdated);(ITransformEvents_Event)activeView.ScreenDisplay.DisplayTransformation).VisibleBoundsUpdated+=visBoundsUpdatedE;/获取焦点图的范围 m_Envelope=activeView.Extent;/后面是加载地图文档的代码,15.6在设计模式下显示窗体并从属性窗中选择axMapControl1,显示axMapControl 事件。双击OnAfterDraw 向代码窗口中增加事件
30、处理。15.7向axMapControl1_OnAfterDraw 事件处理中增加以下代码,使用前面创建的符号绘制MapControl 显示边框。,/使用前面创建的符号绘制MapControl 显示边框。private void axMapControl1_OnAfterDraw(object sender,IMapControlEvents2_OnAfterDrawEvent e)if(m_Envelope=null)return;/如果前景状态被重绘 esriViewDrawPhase viewDrawPhase=(esriViewDrawPhase)e.viewDrawPhase;if(
31、viewDrawPhase=esriViewDrawPhase.esriViewForeground)IGeometry geometry=m_Envelope;axMapControl1.DrawShape(geometry,ref m_FillSymbol);,15.8 添加数据视图和布局视图切换时的事件处理,/当切换tabControl控件时设定工具条对地图控件axMapControl2和布局控件axPageLayoutControl1的绑定。private void tabControl1_SelectedIndexChanged(object sender,EventArgs e)i
32、f(tabControl1.SelectedIndex=0)/设置绑定控件 axTOCControl1.SetBuddyControl(axMapControl2);axToolbarControl1.SetBuddyControl(axMapControl2);else/设置绑定控件 axTOCControl1.SetBuddyControl(axPageLayoutControl1);axToolbarControl1.SetBuddyControl(axPageLayoutControl1);,生成并运行应用程序。使用你先前已经加好的地图导航工具改变PageLayoutControl 中焦点地图的范围。新的范围被绘制在MapControl 上。,