Arcengine二次开发的宝典级电子书
ArcGIS Engine开发-自定义图层类型3 ArcGIS Engine开发-取得ArcMap文档缩略图3 ArcSDE中直接取得图层几何类型4 ArcGIS Server常见问题之一5 IFeatureLayer.DataSourceType Property [C]11 IQueryFilter接口中的SubFileds属性的使用12 用程序实现从带高程的点数据到等高线的转换13 空间查询的实现14 创建带Z值的Feature15 在AO或者ENGINE中为SHAPEFILE添加SPATIAL INDEX19 把一个图层ILayer数据COPY到三维Scenecontrol控件中(进行相关操作)20 vb arcgis engine 用raster生成等值线源码22 关于IIdentify定义时只能找到面而不能找到点和线的问题31 使用ArcGIS Engine来实现地图的点击查询并闪烁32 空间查询的实现34 如何在同一图层中做缓冲选择35 怎么样使用Engine来保存Mxd文件(几种情况)36 在ArcGIS Engine开发时如何改变标注字段37 对shape文件添加字段38 在ArcGisEngine 开发中如何在Toolbar控件上添加Combobox等其他控件40 自相交对象的处理41 在图中加入采集点42 创建拓扑类、投影等等。43 如何解决shapefile和coverage出现无法导入SDE数据库现象44 怎么显示布局控件的标尺45 把shapefile polygons转为polylines45 为什么不能编辑raster属性表或添加字段46 使用ArcGIS将GTOPO30 DEM数据转换到栅格数据47 旋转地图47 给geodatabase或shapefile定义一个投影49 ArcGIS Engine中Undo、Redo命令的使用50 创建带Z值的Feature50 在Ao中如何通过查询获得ITable53 关于多个实体联合union的使用54 在Ao中如何通过查询获得ITable55 在Visual Basic中实现ICommand接口56 使用ArcObjects程序按照顶点来分割一条线58 使用AO加载Raster Catalog61 把不同层的几次的选择结果加到一个选择集中61 如何为ArcObjects扩展出“GroupRenderer“的效果来62 在AO或者ENGINE中为SHAPEFILE添加SPATIAL INDEX68 如何ArcObject的环境中用程序实现3D环境中的查询功能69 截取任意范围地图区域71 使用AO新增记录的3种方法74 如何在ArcEngine环境中的SceneControl中实现查询功能75 删除FeatureClass中满足一定条件的Feature问题及解决办法77 创建孤立的要素类和数据集中的要素类78 SUM Color of vertex symbols in edit80 要素动态跟踪的算法83 同时闪烁满足条件的记录n次86 旋转地图89 转载-AO代码〔Display)94 在arcEngine中标注字段属性数据99 IfeatureSelectionSelectFeatures方法介绍100 AO基本函数集合(很多函数功能)103 AO画一个多边形110 AO画带节点的线111 AO计算Polygon的面积112 AO缓冲区查询113 AO画一个圆114 AO查询被选中的实体116 AO绘制带节点橡皮筋线条117 AO绘制橡皮筋多边形123 AO绘制缓冲区126 vbao鹰眼图代码127 如何利用ao编辑shape文件的某个属性的属性值129 MO作为B/S客户端控件的开发130 MO作为B/S服务器端的开发133 两点间画线135 创建Personal Geodatabase136 ArcObject学习的重要工具--Object Model Diagrams137 ArcObject学习的重要工具--Object Model Diagrams 二139 AO开发感想141 AO中的组件库(1)143 ArcGIS Engine开发-自定义图层类型 用ArcGIS Engine开发的一个特别就是面向接口编程,每组接口代表了对象在某个方面的特性,表现为一个方法、属性或事件。要定义自己的图层类型,实际上只需要实现ILayer接口就可以了。该接口的主要方法或属生包括 public IEnvelope AreaOfInterest {get;} public void Draw esriDrawPhase DrawPhase, IDisplay Display, ITrackCancel trackCancel public void SpatialReference {set;} public string get_TipText double x, double y, double Tolerance ; 等等,请直接查阅帮助。 但实现了该接口,图层只是能加入以地图中,并显示出来而已。如果你要自定义的图层类型是矢量要素的话,最好直接实现IFeatureLayer。由于IFeatureLayer从ILayer继承而来,所以也包含了上述方法或属性。同时还可以支持选择,查询等操作了。 实现了IFeatureLayer,还不能支持图层渲染功能。要想支持图层渲染,得实现IGeoFeatureLayer接口,该接口从IFeatureLayer继承而来,所以也包含IFeatureLayer所支持的所有方法属性。 如果要支持属性表功能的话,得实现ITable接口。 如果希望图层信息能保存到MXD文档中,得实现IPersistStream接口。 由此可见,在ArcGIS Engine中,要实现自定义图层类型,并不是一件不可能的事。虽然会比较烦琐,但思路却非常清晰。本人就通过这种思路设计了一种组合图层,可以同时包含点线面多种图形,但在TOCControl中只表现为一个图层。当然,这个工作要简单轻松一些,但还是富有乐趣的~ ArcGIS Engine开发-取得ArcMap文档缩略图 ArcObjects提供了一个IMapDocument接口,可以实现对ArcMap文档的读写操作。该接品其中有一个属性是Thumbnail。当我们保存文档,使用了保存缩略选项时,会在文档中保存一个缩略图。我们可以通过Thumbnail来读取这个缩略图。 Thumbnail的类型是stdole.IPicture,所以要使用它,首先要引用stdole。 private void System.Drawings.Image GetThumbnailIMapDocument pMapDoc { return System.Drawing.Image.FromHbitmapIntPtrpMapDoc.Thumbnail.Handle; } 一行代码搞定,哈哈。本来就很简单嘛。 好久没写了。先写这么一点吧。 ArcSDE中直接取得图层几何类型 要取得SDE图层要素类型,一个方法就是打开该图层,然后通过取得DataSetType属性和FeatureType属性来判断,但这样做效率比较低。能不能通过SDE的系统表来获得呢,答案是可以的。 要有到两张系统表GDB_OBJECTCLASSES和GDB_FEATURECLASSES。 其中GDB_OBJECTCLASSES表中相关字段有ID、Name,GDB_FEATURECLASSES表的相关字段是ObjectClassID、FeatureType、GeometryType,两个表的关联关系是GDB_OBJECTCLASSES.IDGDB_FEATURECLASSES.ObjectClassID。通过这两个表的关联,就可以取得指定图层要素类型了。 我们可以先通过SQL语句根据图层名称来获取GDB_FEATURECLASSES表中字段FeatureType、GeometryType的值,然后将其转化为对应的要素类型。转换关系请参照下面的代码 public enum GeoType{Point,Line,Polygon,Anno,Raster,AttrTable,Unknown}; public static GeoType GetGeoTypeobject GeometryType,object FeatureType { if GeometryType DBNull.Value return GeoType.AttrTable; else ifGeometryType.ToString “2“ { return GeoType.Point; } else if GeometryType.ToString “3“ { return GeoType.Line; } else ifGeometryType.ToString “4“ { if FeatureType.ToString “1“ return GeoType.Polygon; else if FeatureType.ToString “11“ return GeoType.Anno; else if FeatureType.ToString “14“ return GeoType.Raster; else return GeoType.Unknown; } else { return GeoType.Unknown; } } 通过这种方式,速度很快,而且可以一次读出所有图层的图层基本信息和要素类型,速度极快。如果这些信息要经常使用的话,可以保存到一个哈希表中,这样只用连接一次数据库就OK了。 ArcGIS Server常见问题之一 摘自ESRI网站,有些内容是有限制的,要会员才能看到。目前关于ArcGIS Server开发的资料非常少,就这么一点文档,还要限制,不能让大家共享,实在是罪过。现在我贴出来,希望这些资料对一起学习AGS的朋友有所帮助。 错误描述 在ArcCatalog中,当成功的创建了server object之后,server object不能被预览。ArcCatalog显示下面的错误信息 “你的选择不能在当前视图中显示.” 导致原因 server属性中被指定的输出值和http位置可能不正确。 解决办法 所有的创建的ArcGIS Server Objects需要被停止。 1 在ArcCatalog中,右击已经添加的ArcGIS Server,并选择Server属性。 2 在目录页中,选中已经添加的输出目录并点击编辑。 3 输出目录字段应该指向一个有效的目录,比如 C\ArcGIS\Output。 如果一个虚拟目录已经被指定,确认它是有效的,并且看上去和下面的格式一样, http///output 4 如果有错请更改,然后重新创建server object来确认更改是否有效。 错误描述 当在Visual Studio.NET 2003上使用ArcGIS Server .NET 的ADF模板创建一个项目时,返回如下错误信息 “在服务器上的Web站点不可用(Web Site on server is not available)” 导致原因 该模板包含了调用 http//localhost 这一URL的属性。如果在IIS中禁用了本地主机的服务,则显示该错误信息。禁用本地服务可能是因为你的Web站点已经为其指定了一个IP地址或者是因为安全方面的考虑。 解决办法 启用对 http//localhost的访问决定于您安装的是哪种类型的操作系统,是服务器还是非服务器。 对于非服务器的操作系统 1.点击Internet信息服务控制台,右键选择默认站点的属性,打开属性对话框,并选择网站标签页。 2.修改IP地址栏为“全部未分配“。 3.重启IIS。 在IE浏览器中浏览刚刚启用的 http//localhost 服务,在Visual Studio .NET 2003 中用模板创建项目,现在应该是成功的了。 对于Windows Server操作系统 1. 在Internet信息服务控制台上创建一个新的Web站点。 2. 为其分配IP地址127.0.0.1。意味着只能在本地计算机上启用该站点。 3. 浏览Web站点的根目录,比如C\Inetput\wwwroot 。 此时在Visual Studio .NET 2003 中用模板创建项目应该没有问题。 错误描述 当启动一个服务对象时,出现下述错误信息“在机器XXX上创建Server 环境(Context)失败。拒绝访问output文件夹。” 导致原因 ArcGIS Server Object Container的帐号必须拥有虚拟文件夹的写权限。例如虚拟文件夹为 c\inetpub\wwwroot\temp 解决办法 执行如下步骤 右键点击虚拟文件夹如 c\inetpub\wwwroot\temp 1.选择属性-安全标签页. 2.添加帐号并赋予写权限,使其可以读写图片. 3.点击OK,关闭属性对话框. 错误描述 使用下面的代码,来进行使用字体中的符号进行点要素渲染的时候,会出现地图消失的问题。 下面的代码是用来生成需要在渲染过程中使用的点符号的,使用的是宋体中index为21的字作为符号。 private static ICharacterMarkerSymbol GetMarkerSymbolIServerContext pServerContext,PowerNet.GISCommon.SymbolClass pSymbolClass { System.Drawing.Font drawFont new System.Drawing.Font“宋体“, 21; ICharacterMarkerSymbol charMarker pServerContext.CreateObject“esriDisplay.CharacterMarkerSymbol“ as ICharacterMarkerSymbol; charMarker.Font stdole.IFontDisp OLE.GetIFontDispFromFontdrawFont; charMarker.CharacterIndex pSymbolClass.CharacterIndex; IRgbColor pRGB pServerContext.CreateObject“esriDisplay.RgbColor“ as IRgbColor; pRGB.RedpSymbolClass.SymbolColorR; pRGB.GreenpSymbolClass.SymbolColorG; pRGB.BluepSymbolClass.SymbolColorB; charMarker.Color pRGB as IColor; charMarker.Size pSymbolClass.SymbolSize; return charMarker; } 导致原因 使用ArcGIS Engine进行开发时,对于点要素类,是可以使用指定字体中的符号作为渲染的符号的,但是在arcgis server的应用中来实现这个过程,就稍微有点不同,导致的原因还是本地对象和远程对象进行了混用对于ao对象,可能大家都已经有这个概念,就是一般不在本地创建对象,但是对于其它的对象,比如.net中的对象,可能就没有太注意了,所以才导致了这个问题的出现。 解决办法 这个问题的解决办法是这样的,为了避免在程序中使用下面这句代码 System.Drawing.Font drawFont new System.Drawing.FontpSymbolClass.FontSymbolName, 21; 可以采用先在*.Style文件中把符号都配好,然后转成*.ServerStyle文件,然后使用下面的代码得到相应的符号 private IMarkerSymbol createSymbolIServerContext pServerContext,string index { IStyleGallery pSGallery pServerContext.CreateObject“esriDisplay.ServerStyleGallery“ as IStyleGallery ; IStyleGalleryStorage pSGStorage pSGallery as IStyleGalleryStorage ; pSGStorage.TargetFile “D\xjw.ServerStyle“; pSGStorage.AddFile “D\xjw.ServerStyle“; IEnumStyleGalleryItem pEnumGItem pSGallery.get_Items“MarkerSymbols“,“D\xjw.ServerStyle“,index; pEnumGItem.Reset ; IStyleGalleryItem pSGItem pEnumGItem.Next; IMarkerSymbol pMSymbol pSGItem.Item as IMarkerSymbol; IRgbColor pRGB pServerContext.CreateObject“esriDisplay.RgbColor“ as IRgbColor; pRGB.Red255; pRGB.Green 0; pRGB.Blue0; pMSymbol.ColorpRGB; pMSymbol.Size18; pEnumGItemnull; pSGItemnull; return pMSymbol; } 错误描述 这个错误可能发生在.net中的ArcGIS Primary Interop AssembliesPIA。在错误信息中的CLSID可能会变化 “COM object with CLSID {XXXX} is either not valid or not registered“ 导致原因 在ArcGIS安装中选择安装.NET的支持,PIAs就会为所有的ArcGIS库而安装上。 当在尝试使用一个对象库的PIA时,而这个对象库根本就没有安装时,错误就会发生,因为Com对象不能被初始化。 例如,3DAnalyst扩展模块没有被安装,而尝试使用ESRI.ArcGIS.Analyst3D命名空间中的对象,使用如下代码 ESRI.ArcGIS.Analyst3D.IAnimationTrack aTrack new ESRI.ArcGIS.Analyst3D.AnimationTrackClass; 一个错误就会发生 “Error number -2147221164 COM object with CLSID {4FEDC9CB-A7BE-11D5-B2A0-00508BCDDE28} is either not valid or not registered.“ 解决办法 编程只能使用安装了的对象库。为了开发使用一个特殊的库,那就需要重新安装ArcGIS产品,确保所需的扩展模块都被安装,以及所有的.NET的支持选项。额外的许可会被需要。 1 识别使用的对象,以及这些对象所属的命名空间。 2 识别命名空间所属的产品。例如,为了使用ESRI.ArcGIS.Analyst3D命名空间中的对象,在开发帮助中浏览库总体说明那一页。会有注解说明这个命名空间是有ArcGIS Engine产品的3D扩展模块,ArcGIS desktop 3D扩展模块,以及ArcGIS Server的3D扩展模块支持。 3 重新安装产品,确保所需的扩展模块得到安装,且保证.Net支持选项被选中。 错误描述 当使用ArcGIS开发者控件开发应用程序、控件拖放于窗体上的时候,出现以下错误信息 “该控件需要一个ESRI Designer 许可。请从工程中移除该控件。“ 导致原因 出现这个信息是因为ArcGIS Engine Developer Kit 这个产品未在机器上安装并授权。 ArcGIS Desktop 安装了以下控件 -MapControl -PageLayoutControl -GlobeControl -ReaderControl -SceneControl -TOCControl -ToolbarControl ArcGIS Desktop 许可仅允许使用MapControl 和 PageLayoutControl 进行开发或设计应用程序。 剩下的其它控件许可给ArcGIS Engine,并仅能在ArcGIS Engine Developer Kit 已安装并授权时用于开发。 解决办法 购买ArcGIS Engine Developer Kit 产品,并在机器上授权以下任意控件 -GlobeControl -ReaderControl -SceneControl -TOCControl -ToolbarControl 有关如何使用这些控件的详细信息,以及哪些控件需要对应哪些许可,请参考ArcGIS Developer Help。例如, TOCControl CoClass 帮助主题提到,该控件只在有ArcGIS Engine 产品时才可用。 错误描述 安装出错1935 当安装ArcGIS Server, ArcGIS Desktop, including ArcView, ArcEditor, ArcInfo; or ArcIMS, 都可能发生如下错误 “Error 1935 An error occured during the installation of assembly component {303994BA-6487-47AE-AF1D-7AF6088EEBDB}. HRESULT -2147024894.“ 之后点击 OK 安装回滚退出. 导致原因 导致原因 这个错误发生在系统安装(Microsoft XML Parser 4 )更新.这现同样的错误信息将发生在试图安装(Microsoft XML Parser 4.0)的时候; 这也可能修改,但是经常会因为其他产品的安装而影响系统文件破坏。 解决办法 步骤 1. 尽可能停止一些后台程序,例如adware 或 spyware. 有可能也停止Adwatch,在机器上删除所有的 adware.; 2. 尽可能停止一些Windows服务,控制面板 管理员工具 服务; 3. 检查Internet Explorer 6.0的安装. 检验Microsoft service 安装包和安装更新; 4. 在安装产品前请先安装Microsoft XML 4.0 SP2,这有可能下载其相关联的一部分; 5. 接着安装ESRI软件产品在第4步安装成功; 错误描述 在操作系统是Windows XP SP2、CPU为 AMD Athlon 64系列或 Pentium 4 和 Celeron-D 的机器上安装ArcGIS 9.0时,出现1904错误,系统无法注册一些 dll 文件。 导致原因 在Windows XP SP2 中, DEP(数据执行保护)选项默认情况下是打开的, AMD和Intel新的CUP系列中包含这个选项。数据执行保护是一套硬件和软件技术用于执行对内存的额外检查,以保护电脑遭受恶意代码的破坏。 解决办法 方法一移除Windows XP的SP2,然后安装ArcGIS 9.0。 方法二关闭DEP(数据执行保护),安装ArcGIS 9.0,安装完再激活数据执行保护。具体如下 1. 以管理员权限登陆Windows XP。 2. 鼠标邮件点击“我的电脑”,选择“属性”菜单 3. 点击“高级”页。 4. 选择“启动与恢复”下的“设置”按钮。 5. 选择默认操作系统,如下 “Microsoft Windows XP Professional“ /fastdetect /NocuteOptIn 6. 点击“编辑” 按钮打开boot.ini 文件,将其中的“”/NocuteOptIn”改为“/NocuteAlwaysOff”。 7. 保存文件,重新启动计算机。 8. 安装ArcGIS,此时应该就不会出现1904错误了 9. 安装完ArcGIS以后,将 boot.ini 文件设置改回来,以重新激活数据执行保护的安全选项。 IFeatureLayer.DataSourceType Property [C] See Also IFeatureLayer Interface Language · C · Visual Basic .NET · Show All Data source type. [Visual Basic .NET] Public Property DataSourceType As String [C] public string DataSourceType {get; set;} Product Availability Available with ArcGIS Engine, ArcGIS Desktop, and ArcGIS Server. Description Describes the type of data referenced by the feature layer. In ArcMap and ArcCatalog this description appears on the layer s properties dialog on the Source tab after “Data Type“ Remarks By default, the DataSourceType for a layer matches the value returned by IDatasetCategory when you access the layer s feature class through IDataset. You can set a layer s DataSourceType to any string. Here is a list of default values for DataSourceType for common feature layer types Layer Type Value Personal Geodatabase “Personal Geodatabase Feature Class“ SDE “SDE Feature Class“ Shapefile “Shapefile Feature Class“ ArcInfo or PC ArcInfo Coverage annotation “Annotation Feature Class“ ArcInfo or PC ArcInfo Coverage point “Point Feature Class“ ArcInfo or PC ArcInfo Coverage line “Arc Feature Class“ ArcInfo or PC ArcInfo Coverage polygon “Polygon Feature Class“ Edge “StreetMap Feature Class“ CAD annotation “CAD Annotation Feature Class“ CAD point “CAD Point Feature Class“ CAD line “CAD Polyline Feature Class“ CAD polygon “CAD Polygon Feature Class“ 把这个图层强制转换成IFeatuerLayer,如果转换失败就不是shape几何类型图层。如IFeatureLayer iFeatureLyr iLyr as IFeatureLayer; ifiFeatureLyr null... IQueryFilter接口中的SubFileds属性的使用 通过一定的属性条件来查询数据是在处理数据中经常会用到的。当表中的字段非常多,而且很多的属性字段对于这一次查询而言是多余的,因此带着全部字段返回只会减慢查询的速度,如果想返回符合条件的数据,并且只需要带其中某几个自己就可以,那么可以通过SubFields来指定需要的返回字段。下面的是例子代码及注释。 注意在取回来的要素的FieldCount数量还是和原来表的字段一样多,但是没有在subfields中指定过的字段的值是没有返回的。 过程描述 Dim pFLayer As IFeatureLayer Dim pLayer As ILayer Set pLayer MapControl1.Layer0 Set pFLayer pLayer Dim pFeatureClass As IFeatureClass Set pFeatureClass pFLayer.FeatureClass Dim pQueryFilter As IQueryFilter Set pQueryFilter New QueryFilter 设置SubFields和查询条件 pQueryFilter.SubFields “STATE_NAME,STATE_ABBR“ pQueryFilter.WhereClause “STATE_NAME California “ 进行查询 Dim pFeatureCursor As IFeatureCursor Set pFeatureCursor pFeatureClass.SearchpQueryFilter, False Dim pFeature As IFeature Set pFeature pFeatureCursor.NextFeature Dim pFields As IFields Set pFields pFeature.Fields Debug.Print pFields.FieldCount 用程序实现从带高程的点数据到等高线的转换 内容摘要 从高程点到等高线不是一步实现的,而是先把高程点先插值生成TIN,然后再从TIN生成等高线。在从TIN到等高线的生成过程中8.3和9.0上还有点区别,请看代码注释。下面的是整个过程的代码实例。 过程描述 打开高程点数据 Dim pFeatureLayer As IFeatureLayer Set pFeatureLayer MapControl1.Map.Layer0 If pFeatureLayer Is Nothing Then Exit Sub Dim pFeatureClass As IFeatureClass Set pFeatureClass pFeatureLayer.FeatureClass 生成TIN Dim pTinEdit As ITinEdit Dim pTinSurface As ISurface Dim pTable As ITable Set pTinEdit New Tin Set pTable New FeatureLayer pTinEdit.InitNew MapControl1.ActiveView.Extent Dim pField As IField Set pField pFeatureClass.Fields.FieldpFeatureClass.Fields.FindField“Well_Dpth“ pTinEdit.AddFromFeatureClass pFeatureClass, Nothing, pField, Nothing, 18 Set pTinSurface pTinEdit 打开已经创建好的空的等高线数据也可以在此时创建一个要素类9,如果是9.0版本的话,在空等高线数据中预先需要建一个字段来存储高 程值,如果是8.3版本的话就不可以预先创建这样的一个高程字段,而是在生成等高线过程中根据你指定的 字段名称实时创建 Dim pPropset As IPropertySet Set pPropset New PropertySet Dim pFact As IWorkspaceFactory Dim pWorkspace As IWorkspace pPropset.SetProperty “DATABASE“, App.Path “data“ Set pFact New ShapefileWorkspaceFactory Set pWorkspace pFact.OpenpPropset, Me.hWnd Dim