转自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);

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。

永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧!

多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。

 
对象
pAnnoLayerpRropColl.Clear();
//新建一个图层标注引擎对象,设置它的属性
ILabelEngineLayerProperties pLabelEngineLayerProp = new LabelEngineLayerPropertiesClass();
pLabelEngineLayerProp.Expression = "[CJQYMC]";
//创建注记文本的文本符号
ITextSymbol pTextSym = new TextSymbolClass();
pTextSym.Color = ArcGISPub.ArcGISClassPub.ColorToIColor(Color.Blue);
pTextSym.Size = 10;
pLabelEngineLayerProp.Symbol = pTextSym;
//设置注记文本的位置
IBasicOverposterLayerProperties pBasicOverposeterLayerProp = new BasicOverposterLayerPropertiesClass();
pBasicOverposeterLayerProp.FeatureType = esriBasicOverposterFeatureType.esriOverposterPoint;
pBasicOverposeterLayerProp.FeatureWeight = esriBasicOverposterWeight.esriHighWeight;
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;
}

  

arcengine Annotation研究的一些学习资料(转)FeatureWeight的更多相关文章

  1. Annotation研究的一些学习资料

    转自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. selenium用jquery改变元素属性

    一.jQuery 语法 jQuery 语法是通过选取 HTML 元素,并对选取的元素执行某些操作. 1.基础语法: $(selector).action() 选择符(selector)即," ...

  2. Java 连接远程Linux 服务器执行 shell 脚本查看 CPU、内存、硬盘信息

    pom.xml jar 包支持 <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch& ...

  3. PHP时间戳和日期转换

    获取当前时间 <?php var_dump(time()); //获取当前时间戳 int(1502245603) 时间戳转换为时间,可以用date(‘Y-m-s h:i:s’, 具体时间戳来实现 ...

  4. 【linux】sed -e 's/-//g'

    sed是用来处理文本的 s/正则表达式/替换字符串/    :表示将正则表达式的内容替换为后面的字符串 g    :表示替换全部,即如果不加g,则只会替换第一个 -e    :多点编辑(这个没懂) 例 ...

  5. Luogu P1318 积水面积

    题目描述 一组正整数,分别表示由正方体迭起的柱子的高度.若某高度值为x,表示由x个正立方的方块迭起(如下图,0<=x<=5000).找出所有可能积水的地方(图中蓝色部分),统计它们可能积水 ...

  6. HttpClient 详解一《C#高级编程(第9版)》

    1.异步调用 Web 服务 static void Main(string[] args) { Console.WriteLine("In main before call to GetDa ...

  7. IDEA / WebStorm / PhpStorm 添加jQuery自动提示,自动补全,提醒文档

    应该是JetBrains系列IDE通用的方法,网上其他一些方法有的过时了,有的不全 默认情况下没有JQuery补全,按照以下方法添加 1. 打开Settings,Languages & Fra ...

  8. hdu 5428 质因子

    问题描述有一个数列,FancyCoder沉迷于研究这个数列的乘积相关问题,但是它们的乘积往往非常大.幸运的是,FancyCoder只需要找到这个巨大乘积的最小的满足如下规则的因子:这个因子包含大于两个 ...

  9. [转] 对vuex的表象理解(笔记)

    一个东西,首先要知道为什么用它,为什么要vuex,官方解释为了解决繁杂事件订阅和广播,那么事件的$dispatch,$on,怎么就复杂了?许多人是不是感觉后者还挺简单的,对的 如果简单小型项目,那么不 ...

  10. Android导入依赖appcompat-v7报错

    Android导入依赖appcompat-v7报错   导入appcompat-v7时报错了 导入的是implementation 'com.android.support:appcompat-v7: ...