开发Engine应用程序的基本原理课件

上传人:仙*** 文档编号:241335782 上传时间:2024-06-19 格式:PPT 页数:39 大小:1.13MB
返回 下载 相关 举报
开发Engine应用程序的基本原理课件_第1页
第1页 / 共39页
开发Engine应用程序的基本原理课件_第2页
第2页 / 共39页
开发Engine应用程序的基本原理课件_第3页
第3页 / 共39页
点击查看更多>>
资源描述
2-1课程2vArcObjects librariesvArcObjects Engine APIsv开发 Engine 应用程序v许可2-2ArcGIS 结构v所有产品共享ArcObjectsvEngine包括核心 ArcObjects的功能ArcGIS DesktopArcGIS EngineArcGIS Server2-3ArcGIS 库v所有产品共享库v一些特定库不被共享例如:esriArcMapUIv明确哪些库是属于不同产品v理解库的互依赖性v开发工具ArcGIS Developer HelpESRI 自动提及的附加资源2-4ArcGIS Engine library 体系结构2-5ArcObjectsv所有ArcGIS产品都是由ArcObjects组成vArcObjects都是C+对象v通过不同的应用程序接口(API)来进行调用v本身其就是COM组成2-6COMv连接一个软件模型和另一个软件模型的一种协议独立的一种语言 二进制规范运用界面或组件来开发、配置程序模型v客户端调用服务器并且服务给予响应v所有通讯是通过接口进行的2-7ArcObjects和COM API(应用编程接口)v所有ArcObjects COM 类型都已在类型库里定义好v并且类型库是通过二进制文件来进行描述类:CLSIDs 和ProgIDs接口:IIDs常量和列举v执行DLL和 EXE文件v开发工具ArcGIS Developer Help(VB6 or VC+)LibraryLocator,EOBrowser and OleView*ArcObjects C+*.dll files*COM Type Libraries*.olb files2-8COM 类vCOM类执行接口v所有类执行 IUnknown管理所有对象的产生、终结成员:QueryInterface,AddRef 和 ReleasevCoclasses 是可创建的Public Sub mapName()Dim pMap As IMap 你能通过一个接口来创建一个实例 Set pMap=New MapEnd SubIUnknown2-9COM 接口v定义一组逻辑的方法和属性v从 IUnknown(default)继承vArcObjects 支持客户化接口通过 QueryInterface(QI)访问接口Public Sub mapName()Dim pMap As IMap Set pMap=New Map 通过定义的pMap你可以有权使用其的properties and methods MsgBox pMap.NameEnd Sub2-10COM 外部连接的一些接口v提供跟客户端来进行交换的一些事件的途径v通过连接对象并接收它外部接口v许多不同的事件在ArcObjects都是可用的例如:document load events,map drawing events,editing events,Private WithEvents MxDocEvents As MxDocumentPrivate Sub setNewValues().Set MxDocEvents=pMxDoc.FocusMap Now can access eventsEnd SubPrivate Function MxDocument_NewDocument()As Boolean MsgBox New ArcMap documentEnd Function2-11其他v类型库中包含了所有COM类v每个类型都有全球唯一标识(GUID)比如:CLSID,IID,Progid,v使用esriSystem.UID就可以代表一个对象GUID详细描述CLSID或ProgID(ProjectName.ClassName)Dim u As New UIDu.Value=4FDD8858-DF31-4D6B-8679-1FED633262DA CLSID of ControlsMapRotateToolDim u As New UIDu.Value=esriControlCommands.ControlsMapRotateTool“ProgID of ControlsMapRotateToolDim command As ICommandcommand=AxToolbarControl1.CommandPool.FindByUID(u)If Not command Is Nothing Then MsgBox(command.Name)End If2-12ArcObjects和.NET API(应用编程接口)v所有ArcObjects类型 在.NET 集合中都有定义v主要的存储方式都是 importing the COM type librariesvPIA exposes all classes,interfaces and constants as managed.NET types v需要.NET Framework 1.1v开发工具ArcGIS Developer Help(.NET)ILDASM.exeArcObjects C+COM Type Libraries.NET AssembliesInterop2-13ArcGIS.NET 集合 和命名空间v所有.NET项目都必须引用 ESRI集合比如:ESRI.ArcGIS.Carto.dllv导入命名空间访问ArcObjects.NET 类型比如:ESRI.ArcGIS.Cartov集合具有互依赖性Visual Basic.NET使用 Imports 关键字Imports ESRI.ArcGIS.esriSystemImports ESRI.ArcGIS.SystemUIImports ESRI.ArcGIS.CartoImports ESRI.ArcGIS.Display2-14.NET 类v被管理.NET类表示ArcObjects 对象v两种类型是可用的”Class”:执行所有接口和以及类的成员:代表真实的ArcObjects对象 v创建.NET类 实例化实际的COM对象Dim map as MapClass 注意map没有声明成IMapmap=New MapClass()map.Extent=envelope Extent是IActiveView的属性,2-15.NET 接口v.NET接口代表ArcObjects接口vQueryInterface的不同技术Implicit castingExplicit castingv使用TypeOf 防止使用Implicit casting而出现InvalidCastException错误geometry=point Implicit cast in VB.NET(QI)geometry=CType(point,IGeometry)Explicit cast in VB.NET(QI)Dim point As New PointClassDim geometry As IGeometryIf(TypeOf point Is IGeometry)Then geometry=pointEnd If2-16.NET 外接口v可以连接COM对象并且接收其事件使用.NET 类型v挂起“Event”到外接口比如:IActiveViewEvents_Eventv技术WithEvents:用于默认外接口Delegates:用于连接非默认外接口 Private SelectionChanged As IActiveViewEvents_SelectionChangedEventHandlerPublic Overrides Sub OnClick()创建一个Delegates的实例,并添加其到SelectionChanged事件 SelectionChanged=New IActiveViewEvents_SelectionChangedEventHandler(AddressOf OnSelectionChanged)AddHandler map.SelectionChanged,SelectionChangedEnd SubPrivate Sub OnSelectionChanged()Event handler MessageBox.Show(Selection Changed)End Sub2-17其他vExecptions handling除所有COM之外应该声明的 handlev对象处理许多handle都要调用 ReleaseCOMObject进行释放Exception handling and garbage collection(ReleaseCOMObject)in disposeTry Dim env As IEnvelope=New EnvelopeClass()env.PutCoords(0D,0D,10D,10D)Dim trans As ITransform2D=env trans.Rotate(env.LowerLeft,1D)Catch ex As System.Exception MessageBox.Show(Error:+ex.Message)完成所有事理的代码.End Try2-18ArcObjects和Java APIv在ArcObjects开发包里解压缩所有Java类和接口v通过使用标准JAVA类型产生一个interop层访问所有COM类型v需要 JDK 1.4.2v开发工具ArcGIS Developer Help(Java Doc)ArcObjects C+(*.dll)COM Type Libraries(*.olb)Java Classes(*.jar)Interop2-19ArcObjects Java开发包和JAR 文件v应用程序必须引用ArcObjects JARsarcobjects.jar:Non-UI JNI equivalentsjintegra.jar:Runtime library that handles COM interoparcgis_visualbeans.jar:UI Java beans for controls(optional)v导入一个或多个开发包或独立类型.esri.arcgis.carto.Map;com.esri.arcgis.carto.*;import com.esri.arcgis.system.*;import com.esri.arcgis.systemUI.*;import com.esri.arcgis.carto.*;import com.esri.arcgis.display.*;2-20Java类vJava类允许实例化并访问ArcObjects COM对象vClasses:不可创建的vCoClasses:使用“new”创建Publicly类/*下列方法不能创建类/FeatureClass fc=new FeatureClass();/*比如通过FeatureWorkspace创建要素类*/IFeatureClass fc=fw.openFeatureClass(featureclass name);/*直接通过NEW创建类*/Envelope env=new Envelope();2-21Java 接口vJava 接口可以表示ArcObjects接口v两类型Java 接口=ArcObjects 接口Java proxy class=此类用于执行 Java 接口v不能通过默认proxy class访问对象IPointProxy proxyPoint=new IPointProxy();/错误interface IArea:IUnknown public interface IAreapublic class IAreaProxy implements IArea2-22在Java 中创建接口及访问接口v通过Java API访问接口有两种方法vClass cast:使用对象构造器 vCross-cast(QI):使用proxy classIFeature feature=featureClass.getFeature(i);IGeometry geom=feature.getShape();if(geom.getGeometryType()=esriGeometryType.esriGeometryPolygon)/*Note:“Polygon p=(Polygon)geom;”will give ClassCastException*/Polygon poly=new Polygon(geom);doSomeProcessingOnPolygon(poly);IFeature feature=featureClass.getFeature(i);IGeometry geom=feature.getShape();/*Note:“IArea area=(IArea)geom;”will give ClassCastException*/IArea area=new IAreaProxy(geom);doSomeProcessingOnArea(area);2-23在Java中外接口和事件v使用Java监听器可以连接到COM事件v添加 to 外部接口v技术添加和移除listener类如果要使用控件必须使用event adaptor class/Wire up the events for MapControl map.addIMapControlEvents2Listener(new IMapControlEvents2Adapter()public void onAfterDraw(IMapControlEvents2OnAfterDrawEvent evt)throws IOException if(evt.getViewDrawPhase()=esriViewDrawPhase.esriViewForeground)try /draw the shape on the MapControl map.drawShape(currentExtent,fillSymbol);catch(Exception e)System.err.println(Error in drawing shape on MapControl);2-24其他vAll other types handled as classes or interfacesStructuresEnumerationsvVariants are defined as ObjectsReturn as Object type in order to downcast as type/Structure WKSPointZpublic class _WKSPointZ public double x;public double y;public double z;/Enumeration esri3DAxispublic interface esri3DAxis public static final int esriXAxis=0;public static final int esriYAxis=1;public static final int esriZAxis=2;ICursor spCursor=spTable.ITable_search(spQueryFilter,false);IRow spRow=spCursor.nextRow();/Iterate over the rowswhile(spRow!=null)Short ID=(Short)(spRow.getValue(1);String name=(String)(spRow.getValue(2);Short baseID=(Short)(spRow.getValue(3);System.out.println(“ID=”+ID+”t name=”+name+”tbaseID=”+baseID);spRow=spCursor.nextRow();/Move to the next row2-25vArcGIS Engine和Desktop 类似v两层许可产品vArcView,ArcEditor 和 ArcInfovEngine standard 和GDB Update扩展vSpatial,3D,StreetMap USAArcGIS 产品许可模型DesktopExtensionsArcSDE EditArcInfoArcEditorGeodatabaseUpdate OptionStandardArcViewStandardEngine3DAnalyst3DAnalystEngine2-26ArcGIS Engine runtime 许可:产品v在运行时,所有应用程序都必须初始化产品许可v使用 esriSystem:AoInitialize初始化产品许可v可编写的产品ArcViewArcEditorArcInfoEngine EngineGeoDBPrivate m_pAoInitialize As IAoInitializePrivate Sub Form_Load()Set m_pAoInitialize=New AoInitialize m_pAoInitialize.Initialize esriLicenseProductCodeEngine End SubPrivate Sub Form_Unload(Cancel As Integer)m_pAoInitialize.ShutdownEnd Sub2-27ArcGIS Engine runtime 许可:扩展v应用程序还可以初始化扩展许可v使用AoInitialize管理扩展的许可v可编写的扩展3DAnalyst,SpatialAnalyst,和StreetMapPrivate m_pAoInitialize As IAoInitializePrivate Sub Form_Load()Set m_pAoInitialize=New AoInitialize m_pAoInitialize.Initialize esriLicenseProductCodeEngine m_pAoInitialize.CheckOutExtension esriLicenseExtensionCode3DAnalystEnd SubPrivate Sub Form_Unload(Cancel As Integer)m_pAoInitialize.CheckInExtension(esriLicenseExtensionCode3DAnalyst)m_pAoInitialize.ShutdownEnd Sub2-28区别ArcGIS Engine和 Desktop许可 v应用程序能初始化ArcGIS Engine或Desktop许可v使用IAoInitialize:IsProductCodeAvailablev可以使用License来对用户进行选择 Try to check out Engine license firstIf m_pAoInitialize.IsProductCodeAvailable(esriLicenseProductCodeEngine)=esriLicenseAvailable Then m_pAoInitialize.Initialize esriLicenseProductCodeEngine Try to check out Desktop license nextElseIf m_pAoInitialize.IsProductCodeAvailable(esriLicenseProductCodeArcView)=esriLicenseAvailable Then m_pAoInitialize.Initialize esriLicenseProductCodeArcViewEnd If 2-29The runtime license 生命周期v步骤1.Check if the product is available with the IsProductCodeAvailable method.2.Check what extensions are available with the IsExtensionCodeAvailable method.3.Initialize the application with the product license.4.As required,执行 extension check outs and check ins with the CheckOutExtension and CheckInExtension methods.5.Shutdown the product license.2-30Licensing 规则v在执行任何ArcObjects code 之前都必须对License initialization v在应用程序还在持续的时候,应用程序都将检查 license 是否存在v所有扩展 licenses 都要被登记并且是合格的才能使用vCannot combine or mix product and extension licensesvShould write code to query the level of licensing available and 检查Licenses的来源v尽量初始化使用中用到的最小化的 licensing2-31创建Engine应用程序:.NETv步骤1.创建一个项目2.引用ArcGIS库3.初始化许可 2-32步骤1:创建一个独立项目v创建一个Windows应用程序VB.NET或C#v项目名称是一个namespaceEngineLicenseApp2-33步骤2:引用ArcGIS库v手动引用ESR集合引用v开发工具ESRI Automatic References add-inv在所有类里导入引用Imports ESRI.ArcGIS.esriSystemPublic Class frmEngineClient Inherits System.Windows.Forms.Form2-34步骤3:初始化许可v手动实现这段代码vDeveloper toolsESRI License Initializer add-inPrivate m_pAoInitialize As IAoInitializePrivate Sub Form_Load()Set m_pAoInitialize=New AoInitialize m_pAoInitialize.Initialize esriLicenseProductCodeEngine End SubPrivate Sub Form_Unload(Cancel As Integer)m_pAoInitialize.ShutdownEnd Sub2-35创建Engine应用程序:Javav步骤:1.创建一个新的项目2.引用ArcGIS libraries3.初始化ArcGIS Engine for Java4.初始化许可 2-36步骤1:创建一个独立项目v设置目录位置C:StudentDAAEv选择Jframe窗口v设置名字和位置比如:DaaeEngineClientv定义开发包名字比如:com.esri.arcgis.daae.engine2-37步骤2:引用ArcGIS librariesv激活ESRI 开发包v可以访问所有类v在所有类中导入引用package com.esri.arcgis.daae.engine;import javax.swing.*;import java.io.IOException;import com.esri.arcgis.system.*;2-38步骤3:初始化ArcGIS Enginev添加代码到主要函数初始化ArcObjectsv初始化COM runtime for Javav允许调用ArcGIS Engine Java API types public static void main(String args)/Initialize ArcGIS Engine for Java API usage.EngineInitializer.initializeEngine();.2-39步骤4:初始化许可v手动执行代码Manually implement the codevDeveloper toolsESRI License Initializer add-in public DaaeEngineClient()initComponents();this.show();try DisableCommandButtons();m_aoInitialize=new AoInitialize();m_isProductInitialized=false;initArcObjects();UpdateStatus();catch(Exception ex)ex.printStackTrace();
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!