做ArcGIS Add-In开发,需要在ArcMap中数据视图的左上角加一个上标,如果上标与数据中的地名图层重合,则放在右上角.

上标通过ITextElement,IElement,ITextSymbol等接口实现.

想当然的以为文本元素的定位点为左下角点或者右下角点,结果实验了半天,文字注记的位置一直匪夷所思.

以为之间的参数传输错误,下载了个像素三角尺,一边调试一边量屏幕的像素,发现这个定位点似乎是在文字的中下部的位置,

可是在ArcMap中用绘制工具绘制的文本,定位点似乎是在左下角点.

搞不明白,只能想办法解决,解决思路如下:

在屏幕的中间位置绘制TextElement,获取文本元素的Envelope对象,计算该Envelope对象的左上角点至ArcMap的左上角点

的像素坐标差,或Envelope的右上角点至ArcMap的右上角点的像素坐标差,根据计算出的像素坐标差,对之前绘制的TextElement

的定位点进行修正,更新TextElement.经过测试,结果满足要求.

核心代码如下:

IElement pEle = null;
pAv = pMap as IActiveView;
IGraphicsContainer pgc = pMap as IGraphicsContainer;
bool b_Cover = false;
if (SetPanel.addUpperTxt)
{
if (string.IsNullOrEmpty(SetPanel.locationTxt))
{
MessageBox.Show("无上标文字,请输入或选择字段后重新截图");
return;
}
//在当前视图位置左上角绘制上标文字
IPoint pntLocation = new PointClass(); int pixelY =; //SetPanel.VerOffset + (int)fontsize;
int pixelX =; //SetPanel.HorOffset + (SetPanel.locationTxt.Length) * (int)fontsize;
pntLocation = pAv.ScreenDisplay.DisplayTransformation.ToMapPoint(pixelX, pixelY); ITextElement pTxtEle = new TextElementClass();
ITextSymbol ptxtSymbol = new TextSymbolClass();
ptxtSymbol.Font.Name = "宋体";
IRgbColor pColor = new RgbColorClass();
pColor.Blue = ;
pColor.Red = ;
pColor.Green = ;
ptxtSymbol.Color = pColor;
ptxtSymbol.Size = fontsize;
ptxtSymbol.Font.Bold = true;
pTxtEle.Symbol = ptxtSymbol; pTxtEle.Text = SetPanel.locationTxt; pEle = pTxtEle as IElement;
pEle.Geometry = pntLocation;
pgc.AddElement(pEle, );
pAv.PartialRefresh(esriViewDrawPhase.esriViewGraphics,null,null);
IEnvelope pNewEnv = new EnvelopeClass();
pEle.QueryBounds(pAv.ScreenDisplay,pNewEnv);
int currentPixelX, currentPixelY;
pAv.ScreenDisplay.DisplayTransformation.FromMapPoint(pNewEnv.UpperLeft, out currentPixelX, out currentPixelY);
int txtLocationX = pixelX + SetPanel.HorOffset - currentPixelX;
int txtLocationY = pixelY + SetPanel.VerOffset - currentPixelY;
pEle.Geometry = pAv.ScreenDisplay.DisplayTransformation.ToMapPoint(txtLocationX, txtLocationY);
pAv.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
pEle.QueryBounds(pAv.ScreenDisplay, pNewEnv);
ISegmentCollection segCol = new PolygonClass();
segCol.SetRectangle(pNewEnv); //判断是否覆盖 if (IsCoverOrNot((IPolygon)segCol, pMap))
{
pAv.ScreenDisplay.DisplayTransformation.FromMapPoint(pNewEnv.UpperRight, out currentPixelX, out currentPixelY); ESRI.ArcGIS.esriSystem.tagRECT Rect = pAv.ExportFrame;
int activeViewWidth = Rect.right - Rect.left;
//定位点校正
txtLocationX = txtLocationX+activeViewWidth-SetPanel.HorOffset-currentPixelX;
//txtLocationY = pixelY + SetPanel.VerOffset - currentPixelY;
pEle.Geometry = pAv.ScreenDisplay.DisplayTransformation.ToMapPoint(txtLocationX, txtLocationY);
pEle.QueryBounds(pAv.ScreenDisplay, pNewEnv);
segCol = new PolygonClass();
segCol.SetRectangle(pNewEnv);
if (IsCoverOrNot((IPolygon)segCol, pMap))
{
b_Cover = true;
MessageBox.Show("注记与小地名图层存在压盖,请调整视图");
}
} pgc.UpdateElement(pEle);
}

ArcEngine TextElement 定位点的问题的更多相关文章

  1. Arcgis, ArcEngine, Arcgis Server使用开发汇总 索引

    ArcGIS系列软件license及安装: Arcgis SDE10.1 和 Arcgis server10.1的授权文件license tnt_esri.dat Arcgis8.1安装license ...

  2. 【ESRI论坛6周年征文】ArcEngine注记(Anno/ Label/Element等)处理专题 -入门篇

    原发表于ESRI中国社区,转过来.我的社区帐号:jhlong http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=122097 ----------- ...

  3. 【转载】Arcengine效率探究之二——属性的更新

    文转载自hymyjl2010<Arcengine效率探究之二——属性的更新>   修改一批要素的属性有多种方法,当数据量较大时,若选择不当可能会大大影响速度. 一.IRowBuffer 方 ...

  4. 创建文本注记TextElement

    1.创建一个字体 /// <summary> /// 字体设置 /// </summary> /// <param name="size">Th ...

  5. ArcGIS 10与ArcEngine 10安装及破解

    1 2 3 4 5 分步阅读 一键约师傅 百度师傅高质屏和好师傅,拯救你的碎屏机 百度经验:jingyan.baidu.com 现在常见的破解方法在下面的地址中已经详细附图说明了,但是这种破解方法,想 ...

  6. ArcEngine 岛状多边形内部环的获取

    ArcEngine岛状多边形获取其内部环 查阅了帮助文档相关接口,内部环的获方法get_InteriorRingBag() 需要外部环作为参数.而外部环可以直接通过ExteriorRingBag属性获 ...

  7. ArcEngine 栅格数据

    1.ArcEngine中的栅格数据组织方式(详细信息见:http://resources.arcgis.com/zh-cn/help/main/10.1/index.html#/na/009t0000 ...

  8. ArcEngine批量添加XY数据

    使用ArcGIS Desktop “添加XY数据”或者“创建XY事件图层”工具 可以导入Excel坐标数据,生成临时图层并添加至ArcMap.ArcGlobe或者ArcScene中.在ArcEngin ...

  9. ArcEngine中打开各种数据源(WorkSpace)的连接

    (SDE.personal/File.ShapeFile.CAD数据.影像图.影像数据集) ArcEngine 可以接受多种数据源.在开发过程中我们使用了如下几种数据源 1.企业数据库(SDE) 企业 ...

随机推荐

  1. 如何使用 MasterPage

    MasterPageFile母版页 刚开始学,什么都不懂,看到了这段代码,才促使自己去研究MasterPageFile到底是什么含义.<%@ Page Language="C#&quo ...

  2. python--文件I/O--11

    原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 本章只讲述所有基本的的I/O函数,更多函数请参考Python标准文档. 一.打印到屏幕 最简单的 ...

  3. MySQL数据库辅助类

    /** *创建人:CalvinR *说明:数据库辅助类 **/ namespace Study.Utilities.MySql_Connect { /// <summary> /// My ...

  4. Python中的类(上)

    在Python中,可以通过class关键字定义自己的类,然后通过自定义的类对象类创建实例对象. 例如,下面创建了一个Student的类,并且实现了这个类的初始化函数"__init__&quo ...

  5. iOS Runloop的超级讲解

    这是目前看过的最好的一片中文讲解RunLoop的文章,推荐给大家看一下,原文链接:http://blog.ibireme.com/2015/05/18/runloop/ https://segment ...

  6. 【Android】ProgressBar

    http://www.cnblogs.com/wangying222/p/5304990.html http://www.cnblogs.com/plokmju/p/android_ProgressB ...

  7. 虚拟机中多个Linux系统之间配置免秘钥访问

    1.三个节点cdh1,cdh2,cdh3 2.在每个机器上分别生产公钥对 ssh-keygen -t rsa 3.复制公钥 cd .ssh cat  id_rsa.pub  >> auth ...

  8. 【代码审计】MIPCMS 远程写入配置文件Getshell

    0x00 环境准备 MIPCMS官网:https://www.mipcms.cn 网站源码版本:MIPCMS内容管理系统 V3.1.0(发布时间:2018-01-01) 程序源码下载:http://w ...

  9. Unity透明Shader

    Shader "Custom/Blocks" { Properties { _Color (,,,) _MainTex ("Albedo (RGB)", 2D) ...

  10. Python中字符串的intern机制

    intern机制: 字符串类型作为Python中最常用的数据类型之一,Python解释器为了提高字符串使用的效率和使用性能,做了很多优化,例如:Python解释器中使用了 intern(字符串驻留)的 ...