ArcEngine TextElement 定位点的问题
做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 定位点的问题的更多相关文章
- Arcgis, ArcEngine, Arcgis Server使用开发汇总 索引
ArcGIS系列软件license及安装: Arcgis SDE10.1 和 Arcgis server10.1的授权文件license tnt_esri.dat Arcgis8.1安装license ...
- 【ESRI论坛6周年征文】ArcEngine注记(Anno/ Label/Element等)处理专题 -入门篇
原发表于ESRI中国社区,转过来.我的社区帐号:jhlong http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid=122097 ----------- ...
- 【转载】Arcengine效率探究之二——属性的更新
文转载自hymyjl2010<Arcengine效率探究之二——属性的更新> 修改一批要素的属性有多种方法,当数据量较大时,若选择不当可能会大大影响速度. 一.IRowBuffer 方 ...
- 创建文本注记TextElement
1.创建一个字体 /// <summary> /// 字体设置 /// </summary> /// <param name="size">Th ...
- ArcGIS 10与ArcEngine 10安装及破解
1 2 3 4 5 分步阅读 一键约师傅 百度师傅高质屏和好师傅,拯救你的碎屏机 百度经验:jingyan.baidu.com 现在常见的破解方法在下面的地址中已经详细附图说明了,但是这种破解方法,想 ...
- ArcEngine 岛状多边形内部环的获取
ArcEngine岛状多边形获取其内部环 查阅了帮助文档相关接口,内部环的获方法get_InteriorRingBag() 需要外部环作为参数.而外部环可以直接通过ExteriorRingBag属性获 ...
- ArcEngine 栅格数据
1.ArcEngine中的栅格数据组织方式(详细信息见:http://resources.arcgis.com/zh-cn/help/main/10.1/index.html#/na/009t0000 ...
- ArcEngine批量添加XY数据
使用ArcGIS Desktop “添加XY数据”或者“创建XY事件图层”工具 可以导入Excel坐标数据,生成临时图层并添加至ArcMap.ArcGlobe或者ArcScene中.在ArcEngin ...
- ArcEngine中打开各种数据源(WorkSpace)的连接
(SDE.personal/File.ShapeFile.CAD数据.影像图.影像数据集) ArcEngine 可以接受多种数据源.在开发过程中我们使用了如下几种数据源 1.企业数据库(SDE) 企业 ...
随机推荐
- 如何使用 MasterPage
MasterPageFile母版页 刚开始学,什么都不懂,看到了这段代码,才促使自己去研究MasterPageFile到底是什么含义.<%@ Page Language="C#&quo ...
- python--文件I/O--11
原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 本章只讲述所有基本的的I/O函数,更多函数请参考Python标准文档. 一.打印到屏幕 最简单的 ...
- MySQL数据库辅助类
/** *创建人:CalvinR *说明:数据库辅助类 **/ namespace Study.Utilities.MySql_Connect { /// <summary> /// My ...
- Python中的类(上)
在Python中,可以通过class关键字定义自己的类,然后通过自定义的类对象类创建实例对象. 例如,下面创建了一个Student的类,并且实现了这个类的初始化函数"__init__&quo ...
- iOS Runloop的超级讲解
这是目前看过的最好的一片中文讲解RunLoop的文章,推荐给大家看一下,原文链接:http://blog.ibireme.com/2015/05/18/runloop/ https://segment ...
- 【Android】ProgressBar
http://www.cnblogs.com/wangying222/p/5304990.html http://www.cnblogs.com/plokmju/p/android_ProgressB ...
- 虚拟机中多个Linux系统之间配置免秘钥访问
1.三个节点cdh1,cdh2,cdh3 2.在每个机器上分别生产公钥对 ssh-keygen -t rsa 3.复制公钥 cd .ssh cat id_rsa.pub >> auth ...
- 【代码审计】MIPCMS 远程写入配置文件Getshell
0x00 环境准备 MIPCMS官网:https://www.mipcms.cn 网站源码版本:MIPCMS内容管理系统 V3.1.0(发布时间:2018-01-01) 程序源码下载:http://w ...
- Unity透明Shader
Shader "Custom/Blocks" { Properties { _Color (,,,) _MainTex ("Albedo (RGB)", 2D) ...
- Python中字符串的intern机制
intern机制: 字符串类型作为Python中最常用的数据类型之一,Python解释器为了提高字符串使用的效率和使用性能,做了很多优化,例如:Python解释器中使用了 intern(字符串驻留)的 ...