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) 企业 ...
随机推荐
- 如何在Linux系统中安装VMware
首先打开vmware官网的下载链接:https://my.vmware.com/web/vmware/info/slug/desktop_end_user_computing/vmware_works ...
- python单例模式控制成只初始化一次,常规型的python单例模式在新式类和经典类中的区别。
单例模式的写法非常多,但常规型的单例模式就是这样写的,各种代码可能略有差异,但核心就是要搞清楚类属性 实例属性,就很容易写出来,原理完全一模一样. 如下: 源码: class A(object): d ...
- 创建Maven创建src/main/java提示反复
建立好一个Maven项目后.假设Java Resources资源文件下没有src/main/java目录,而且在手动创建这个文件时提示"已存在文件". 这说明,在这个项目配置中已经 ...
- PMP考试相关
知识点:http://www.cnblogs.com/allenblogs/tag/PMbook/ 读书笔记: http://www.cnblogs.com/lensin/category/45538 ...
- win7+ oracle +php环境的搭建
http://blog.csdn.net/chchmlml/article/details/6887326 先下载个wmpp1.7.5(之前在xp上也是这个,所以就继续),安装,一切顺利,打开phpi ...
- JavaScript-this理解
javascript this可以绑定到:全局对象,自己定义的对象,用构造函数生成的对象,通过call或者apply更改绑定的对象 1.全局对象 function globalTest(nam ...
- C语言中的static关键字
C语言代码是以文件为单位来组织的,在一个源程序的所有源文件中,一个外部变量(注意不是局部变量)或者函数只能在一个源程序中定义一次,如果有重复定义的话编译器就会报错.伴随着不同源文件变量和函数之间的相互 ...
- 采用get方式提交数据到服务器实例
GetDemo项目目录 一.编写StreamTools.java /** * */ package com.hyzhou.getdemo.utiils; import java.io.ByteArra ...
- java List分批处理
java List分批处理,例如对List中的数据进行批量插入. 方法一: /** * ClassName:Test List分批处理 * @author Joe * @version * @sinc ...
- zabbix监控第一台服务器
客户机的IP是192.168.0.80,主机名是wls12c 1. 安装客户端, 1.1 新建zabbix的用户 groupadd zabbix useradd -g zabbix zabbix 1. ...