Annotation要素类介绍[1]
在GeoDatabase中有五种类型的要素类,即点、线、面、标注要素类和注记要素类。注记要素类涉及的较少,这里不谈。本文主要讨论标注要素类的特征,即Annotation FeatureClass的特性。
标注要素类是一种专门用于存储和显示文本或图形元素的数据结构,在这之前,我们只谈过文本或图像只能通过MXD的方式来存储。标注要素类可以是独立的,也可以与一个要素类相关联。如果是独立standalone的要素类,它就是其它要素类的一种背景;一旦与某个要素类相联系link,那么标注要素显示的内容就取决于与之相关的要素。
如果要新建一个标注要素类,无论是直接在工作空间中还是在一个要素数据集中,都需要使用到IFeatureWorkspaceAnno的接口,下面我们通过这个接口的CreateAnnotationClass方法来介绍标注要素类的一系列特性:
public IFeatureClass CreateAnnotationClass (
string Name,
IFields Fields,
UID CLSID,
UID EXTCLSID,
string ShapeFieldName,
string ConfigKeyword,
IFeatureDataset dstFeatureDataset,
IFeatureClass srcFeatureClass,
object annoProperties,
object referenceScale,
object symbolCollection,
bool autoCreate
);
Name是新建的标注要素类的名称,这个字符串可以随意设置。
Fields是标注要素类的字段,与其它要素类不同的是,标注要素类的系统字段相当的多,这是因为标注字段涉及到存储字符和修饰字符的Symbol样式,因此,我们也不建议用户自己添加这些难以记忆的字段,在这种情况下,我们可以使用一种简单的方式实现:
IObjectClassDescription pOCDesc=New AnnotationFeatureClassDescription;
Fields=pOCDesc.RequiredFields;
也许有人会问,如果除了这些系统字段外,我们还有自己的字段怎么办?这个很简单,使用IFieldsEdit的方法再加自定义字段就可以了。
CLSID和EXTCLSID两个参数也是必须的,它们的含义非常有趣。我们知道,GeoDatabase中的每个对象都有个唯一标识符UID,系统是靠认证这个64位的随机值来区分不同对象的,同样的,要素类和要素类的扩展部分也有这么个标识,只不过在一般情况下我们无法看到这个UID值而已。如何产生这两个值呢,也很简单,使用:
CLSID=pOCDesc.InstanceCLSID;
EXTCLSID=pOCDesc.ClassExtensionCLSID;
ShapeFieldName是指一个要素类的Shape字段名,一般都是"SHAPE"。
ConfigKeyword一般不用设置,可以设置为空字符串。
dstFeatureDataset是指一个标注要素类被放置的要素数据集,当然,如果这个标注要素类直接放在工作空间中,这个参数将被设置为null即可。
srcFeatureClass是标注要素类关联的要素类,如果标注要素类是独立的,则这个参数也可以为null。
接下来的四个参数的前三个就是关键了,可以说,整个要素类的正常显示就是依赖它们,下一篇我们将讲解这三个参数的特别之处。
Related Items
Comments
我估计还是license的问题,因为我看到VB6的程序可以实现新建版本的功能,而且在HELP中看到如下信息:
If your application/site is not appropriately licensed, CreateVersion can return an Err.Number of FDO_E_NO_OPERATION_LICENSE.
你好,我想问一下怎么讲cad里面的annotation层导入到geodatabase中去,用ao或ae
将Annotation层数据导入GeoDB中,除了简单字段的拷贝,最重要的是使用IAnnotationFeature 接口将源要素的Annotation对象复制到目标要素中,这是一个Element对象。
好的 谢谢蒋老师的回复,我研究一下,一直没有思路来着
你好!请教两个问题
1.在个人GDB中新建了一个Annotation 的Feature Class,依以下过程:
ITextElement TxtEle = new TextElementClass();
ITextSymbol TxtSym = new TextSymbolClass();
TxtEle.Text = “待显示的文字”;
TxtEle.Symbol = TxtSym;
TxtEle.ScaleText = true;
IGroupElement GrpEle = new GroupElementClass();
GrpEle.AddElement((IElement)TxtEle);
AnnoFtr.Annotation = (IElement)GrpEle;
pFtr.Store(); 将anno 要素保存到该Anno表中,但是添加该anno 要素图层并没有显示出来。是我上面那个过程中少了什么东西了吧?
2.怎样获取在personal GDB新建anno 要素图层中的SymbolColletion,我用IAnnoClass,但是不知道将如何实例化以便获取其SymbolCollection属性,因为新建向导中加载了很多anno类及textelement,我想获得这些symbol.
谢谢!
哦。对了,上面过程中的TxtSym只是简单赋予了颜色值,简单地进行了初始化而已
我正在实现创建Annotation Class,很期待您的下一篇讲解!
注记层创建,是不是先 将每个注记的Symbol都获得并添加进去,再创建Annotation FeatureClass? 和创建点.线.面的顺序不同? 是这样吗?
创建的顺序差不多,将你要使用的每一个Symbol放到symbolCollection中即可。
您好!我也在做标注,但是我的代码在运行到pFWSAnno.CreateAnnotationClass(Name, pFields, pOCDesc.InstanceCLSID, pOCDesc.ClassExtensionCLSID, srcFeatureClass.ShapeFieldName, "", null, null, pAnnoPropsColl, pGLS, pSymbolColl, true);这句时就会报错,说:在这个集合项目中找不到该项。大概就是这个意思了,请问这是什么原因阿?
谢谢赐教!
Leave a comment
Or, take a look at Archives and Categories
你好,上次在开发数据库导入功能时,遇到过License的问题,后来在帮助中找到了初始化方法,就解决了。这次是开发基于ArcSDE的版本管理,独立组件,同样遇到license的问题,但是初始化似乎毫无效果,不知道是开发的问题还是我的ArcObjects开发版真的没有创建版本的权限。但使用Catalog是可以创建、删除和修改版本的,为什么开发里就不行呢。用VBA也可以实现这些版本创建和删除等功能