转自chanyinhelv原文Annotation研究的一些学习资料

下面是我最近对Annotation研究的一些学习资料,收集于此,供大家学习之用。

一、Annotation要素类介绍

在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。

接下来的四个参数的前三个就是关键了,可以说,整个要素类的正常显示就是依赖它们。

二、使用Annotation对象进行要素标注并设置标注位置

AO中有两种方法实现要素标注,一种是自己添加TextElement对象到文档对象中,另一种就是使用AO提供的Annotation对象,它的功能更加强大和丰富,它以更复杂的方法和属性对要素图层进行标注,标注的内容可以保存到地理数据库中。实现这个要素标注涉及到的对象包括IAnnotateLayerPropertiesCollection对象、IAnnotateLayerProperties对象和ILabelEngineLayerProperties对象,其实现代码如下:(c#)

public void CreateAnno(IFeatureLayer pFeatureLayer )

{

IGeoFeatureLayer pGeoFLayer = pFeatureLayer as IGeoFeatureLayer;
                //得到图层的标注属性集合对象
         IAnnotateLayerPropertiesCollection pAnnoLayerpRropColl = new AnnotateLayerPropertiesCollectionClass();
                pAnnoLayerpRropColl = pGeoFLayer.AnnotationProperties;

//清空这个集合中的对象
                pAnnoLayerpRropColl.Clear();

//新建一个图层标注引擎对象,设置它的属性
                ILabelEngineLayerProperties pLabelEngineLayerProp = new LabelEngineLayerPropertiesClass();
                pLabelEngineLayerProp.Expression = "[DYP]";

//创建注记文本的文本符号
                ITextSymbol pTextSym = new TextSymbolClass();
                pTextSym.Color = GeoTool.GetColor(255, 0, 0);
                pTextSym.Size = 10;
                IFont font = new StdFontClass();
                font.Name = "Times New Roman";
                pTextSym.Font = (IFontDisp)font;
                pLabelEngineLayerProp.Symbol = pTextSym;

//设置注记文本的位置
         IBasicOverposterLayerProperties pBasicOverposeterLayerProp = new BasicOverposterLayerPropertiesClass();
                pBasicOverposeterLayerProp.FeatureType = esriBasicOverposterFeatureType.esriOverposterPoint;
                pBasicOverposeterLayerProp.FeatureWeight = esriBasicOverposterWeight.esriNoWeight;
                pBasicOverposeterLayerProp.LabelWeight = esriBasicOverposterWeight.esriHighWeight;
                pBasicOverposeterLayerProp.BufferRatio = 0;

//方式一:标注位于点特征顶部
               //pBasicOverposeterLayerProp.PointPlacementOnTop = true;

//方式二:标注环绕点特征
   pBasicOverposeterLayerProp.PointPlacementMethod = esriOverposterPointPlacementMethod.esriAroundPoint;
                IPointPlacementPriorities pPointPlacement = new PointPlacementPrioritiesClass();
                pPointPlacement.AboveCenter = 0;
                pPointPlacement.AboveLeft = 0;
                pPointPlacement.AboveRight = 0;
                pPointPlacement.BelowCenter = 1;
                pPointPlacement.BelowLeft = 0;
                pPointPlacement.BelowRight = 0;
                pPointPlacement.CenterLeft = 0;
                pPointPlacement.CenterRight = 0;
                pBasicOverposeterLayerProp.PointPlacementPriorities = pPointPlacement;

//方式三:标准旋转一定角度
//pBasicOverposeterLayerProp.PointPlacementMethod = esriOverposterPointPlacementMethod.esriSpecifiedAngles;
                //double[] angle = new double[2];
                //angle[0] = 45;
                //angle[1] = 90;
                //pBasicOverposeterLayerProp.PointPlacementAngles = angle;
                
                pLabelEngineLayerProp.BasicOverposterLayerProperties = pBasicOverposeterLayerProp;

IAnnotateLayerProperties pAnnoLayerProp = (IAnnotateLayerProperties)pLabelEngineLayerProp;
                pAnnoLayerpRropColl.Add(pAnnoLayerProp);

pGeoFLayer.DisplayField = pLabelEngineLayerProp.Expression;
                pGeoFLayer.DisplayAnnotation = true;

}

三、使用TextElement对象进行要素标注

使用TextElement对象进行要素标注可以控制标注字体的样式,标注的流程是首先获取要素图层中所有要进行标注的要素,然后对各个要素创建TextElement对象,并将其Text设为要素的某个字段属性,而Geometry是要素包括线的中间点。一下是在三维GlobeControl中的实现代码如:(c#)

//获取图层要素对象

IFeatureCursor pFeatCurso = new FeatureCursorClass();
            pFeatCurso = pFeatClass.Search(null, true);
            IFeature pFeature = null;
            pFeature = pFeatCurso.NextFeature();
            while (pFeature != null)
            {
                //读取要素
                .........................

pFeature = pFeatCurso.NextFeature();
            }

以上是有关读取图层要素的过程,这里省略。

添加标注代码:

说明:pArray中存放的是IGeometry对象

public void AddElement(ArrayList pArray, IGlobeGraphicsLayer pGlobeGraphicsLayer)
        {
            //删除上次添加的element
            IGraphicsContainer pGraphicsContainer = pGlobeGraphicsLayer as IGraphicsContainer;
            pGraphicsContainer.DeleteAllElements();
            pGlobeGraphicsLayer.UpdateAllElements();

//设置显示属性
            IGlobeGraphicsElementProperties pGlobeGraphicsElementProperties = new GlobeGraphicsElementPropertiesClass();
            pGlobeGraphicsElementProperties.DrapeElement = true;
            pGlobeGraphicsElementProperties.FixedScreenSize = true;
            pGlobeGraphicsElementProperties.DrapeQuality = true;
            pGlobeGraphicsElementProperties.OrientationMode = esriGlobeGraphicsOrientation.esriGlobeGraphicsOrientationLocal;

int hh;

for (int i = 0; i < pArray.Count; i = i + 2)
            {
                IGeometry pGeometry = (IGeometry)pArray[i + 1];
                IPoint point = new PointClass();
                point = GeoTool.GetGeo(pGeometry);

//添加点element对象(设置标注对象形状)
                IElement pElement = new MarkerElementClass();              //定义为标注性对象方便后续设置
                ISimpleMarkerSymbol pSimpleMarkerSymbol = new SimpleMarkerSymbolClass();   //设置形状
                pSimpleMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSCircle;
                IMarkerSymbol pMarkerSymbol = pSimpleMarkerSymbol as IMarkerSymbol;        //设置颜色大小
                pMarkerSymbol.Color = GeoTool.GetColor(0, 255, 0);
                pMarkerSymbol.Size = 5;

pElement.Geometry = point as IGeometry;
                IMarkerElement pMarkerElement = pElement as IMarkerElement;
                pMarkerElement.Symbol = pMarkerSymbol;
                pGlobeGraphicsLayer.AddElement(pElement as IElement, pGlobeGraphicsElementProperties, out hh);

//添加文本element对象(标注的文字部分)
                ITextElement pTextElement = new TextElementClass();
                ITextSymbol pTextSymbol = new TextSymbolClass();
                pTextSymbol.Color = GeoTool.GetColor(255, 0, 0);
                pTextSymbol.Size = 10;
                IFontDisp pFontDisp = (IFontDisp)new StdFontClass();             //设置字体
                pFontDisp.Name = "Times New Roman";
                pFontDisp.Bold = true;
                pFontDisp.Size = 10;
                pTextSymbol.Font = pFontDisp;
                pTextSymbol.HorizontalAlignment = esriTextHorizontalAlignment.esriTHALeft;
                pTextElement.Symbol = pTextSymbol;
                pTextElement.Text = pArray[i].ToString();
                ((IElement)pTextElement).Geometry = point as IGeometry;
                pGlobeGraphicsLayer.AddElement(pTextElement as IElement, pGlobeGraphicsElementProperties, out hh);
            }
        }

对于二维中要加载TextElement标注,其创建TextElement的方法相同,主要是在于后面加载的方式不同而已,加载到的对象不同而已,三维GlobeControl中是加载到一个IGlobeGraphicsLayer中,二维中则是加载到MapControl的Map对象中。其核心代码如下:

IMap pMap = axMapControl1.Map;

IActiveView pActiveView = pMap as IActiveView;

IGraphicsContainer pGraphicsContainer = pMap as IGraphicsContainer;

//将元素添加进Map对象中

pGraphicsContainer.AddElement(pElement,0);

pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics,null,null);

Annotation研究的一些学习资料的更多相关文章

  1. arcengine Annotation研究的一些学习资料(转)FeatureWeight

    转自chanyinhelv原文Annotation研究的一些学习资料 下面是我最近对Annotation研究的一些学习资料,收集于此,供大家学习之用. 一.Annotation要素类介绍 在GeoDa ...

  2. 【干货分享】Node.js 中文学习资料和教程导航

    这篇文章来自 Github 上的一位开发者收集整理的 Node.js 中文学习资料和教程导航.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念,它的目标是帮助程 ...

  3. Android 学习资料收集

    收集整理这份资料灵感来自于 trip_to_iOS, 征得同意引用了该资料的开头描述 收集整理这份资料主要帮助初学者学习 Android 开发, 希望能快速帮助到他们快速入门, 找到适合自己学习资料, ...

  4. d3可视化实战00:d3的使用心得和学习资料汇总

    最近以来,我使用d3进行我的可视化工具的开发已经3个月了,同时也兼用其他一些图表类库,自我感觉稍微有点心得.之前我也写过相关文章,我涉及的数据可视化的实现技术和工具,但是那篇文章对于项目开发而言太浅了 ...

  5. ABP 教程文档 1-1 手把手引进门之 AngularJs, ASP.NET MVC, Web API 和 EntityFramework(官方教程翻译版 版本3.2.5)含学习资料

    本文是ABP官方文档翻译版,翻译基于 3.2.5 版本 转载请注明出处:http://www.cnblogs.com/yabu007/  谢谢 官方文档分四部分 一. 教程文档 二.ABP 框架 三. ...

  6. 学习资料分享:Python能做什么?

    最近一直忙着研究学习Python,很久没更新博客了,整理了一些Python学习资料,和大家分享一下!每天更新一篇~ 一.Python 特点 1.易于学习:Python有相对较少的关键字,结构简单,和一 ...

  7. 吐血整理:人工智能PDF中文教材资源包2.73G基本包含全部学习资料-人工智能学习书单

    吐血整理:人工智能PDF中文教材资源包2.73G基本包含全部学习资料 人工智能学习书单(关注微信公众号:aibbtcom获取更多资源) 文末附百度网盘下载地址 人工神经网络与盲信号处理 人工神经网络与 ...

  8. SLAM(二)----学习资料下载

    有位师兄收集了很多slam的学习资料, 做的很赞, 放到了github上, 地址:https://github.com/liulinbo/slam.git ruben update 0823 2016 ...

  9. ref:web security最新学习资料收集

    ref:https://chybeta.github.io/2017/08/19/Web-Security-Learning/ ref:https://github.com/CHYbeta/Web-S ...

随机推荐

  1. Zabbix监控Tomcat,Redis

    一 Tomcat监控 1.1.1 Tomcat 端配置 JMX 编辑catalina.sh文件,配置如下: CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.m ...

  2. golang API 例子实现

    golang API 例子实现 http://files.cnblogs.com/files/rojas/astaxie.zip

  3. ubuntu14.04 printk()默认打印的位置

    tail /var/log/syslog 即可显示printk打印的信息

  4. Python 之Numpy应用

    NumPy 数据类型 numpy 支持的数据类型比 Python 内置的类型要多很多,基本上可以和 C 语言的数据类型对应上,其中部分类型对应为 Python 内置的类型.下表列举了常用 NumPy ...

  5. TypeScript深入学习

    基础类型booleannumberstringstring[]//Array<string> 数组类型(ReadonlyArray<string>数组不能修改,也不允许被赋值给 ...

  6. [Javascript] Iterate Over Items with JavaScript's for-of Loop

    In this lesson we will understand the For Of loop in Javascript which was introduced in ES6. The for ...

  7. 解决浏览器不兼容websocket

    本例使用tomcat 7.0的websocket做为例子. 1.新建web project.2.找到tomcat 7.0 lib 下的 catalina.jar,tomcat-coyote.jar添加 ...

  8. 12. ZooKeeper之Java客户端API使用—创建会话。

    转自:https://blog.csdn.net/en_joker/article/details/78686649 客户端可以通过创建一个ZooKeeper(org.apache.zookeeper ...

  9. angular设置全局变量,可修改监听变量

    创建service.module.ts import { NgModule, ModuleWithProviders } from '@angular/core'; import { SomeShar ...

  10. 好记性不如烂笔头——datagridview相关

    DataGridViewTextBoxColumn dgv_IDY = new DataGridViewTextBoxColumn(); dgv_IDY.Visible = false; dgv_ID ...