arcengine cliasic code(转)基于ArcGIS Engine + C#实现用户自定义动态电力符号
基于ArcGIS Engine + C#实现用户自定义动态电力符号
华立电网北京研发中心 阿文
ArcGIS Engine二次开发一般需要通过桌面产品来制作这些符号,然后通过专门的转换工具转换以后供AE使用。电力GIS应用当中,电力设备种类繁多,设备状态比较复杂,需要用不同的符号来表现电力设备的不通状态,此外电力技术的更新速度很快,新设备种类也不断推陈出新,用户往往要求提供符号定义工具以满足这些需求。本文以配电变压器为例,介绍一种使用ArcGIS Engine + C#二次开发模式下,可以让用户自己定义设备符号的一种方法。
一、符号定义
配电变压器符号如下图所示:
此主题相关图片如下:
可以将这个符号分解成四个图元,两段线段,两个圆(圆弧)。用以下结构来描述图元:
public struct MetaData
{
public int Typ; // 图形类型 3:圆弧,0:线段
public double Scale; // 缩放
public int OffsX ; // 偏移(x)
public int OffsY; // 偏移(y)
public double Angle; // 旋转
public int x1; // 图元的第一点位置(x)
public int y1; // 图元的第一点位置(y)
public int x2; // 图元的第二点位置(x)
public int y2; // 图元的第二点位置(y)
public int x3; // 图元的第三点位置(x)
public int y3; // 图元的第三点位置(y)
public int x4; // 图元的第四点位置(x)
public int y4; // 图元的第四点位置(y)
}
// 线段:第一点:起点坐标, 第二点:终点坐标, 第三点, 第四点为空
// 圆弧:第一点:圆弧所在圆所属矩形的左上角,
// 第二点:圆弧所在圆所属矩形的左右下角,
// 第三点:圆弧起点
// 第四点:圆弧终点
// 圆弧方向为逆时针,对于圆x3,y3,x4,y4重合
各图元的坐标如下:
Typ |
x1 |
y1 |
X2 |
Y2 |
x3 |
Y3 |
X4 |
Y4 |
|
第一点 |
3 |
20 |
-70 |
160 |
70 |
90 |
-70 |
90 |
-70 |
第二点 |
3 |
100 |
-70 |
240 |
70 |
100 |
0 |
100 |
0 |
第三点 |
0 |
0 |
0 |
20 |
0 |
0 |
0 |
0 |
0 |
第四点 |
0 |
240 |
0 |
260 |
0 |
0 |
0 |
0 |
0 |
可以编写一个绘制简单图元的绘图工具,方便用户绘制这些图元,绘制好的图元存成以上格式,存入到数据库中,以方便系统读入。
tanhw 发表于:2007-3-8 10:49:00
一、自定义、实现符号类MyMarkerSymbol:
1.类的定义:
自定义符号需要实现以下四个接口:
IMarkerSymbol
ISymbol
IClone
IpersistVariant
MyMarkerSymbol类定义为:
public class MyMarkerSymbol :IMarkerSymbol,ISymbol,IClone,IPersistVariant
{
public MyMarkerSymbol()
{
//base.New();
Class_Initialize_Renamed();
}
}
构造函数,需将符号的角度传入。
public MyMarkerSymbol(double ange)
{
//base.New();
Class_Initialize_Renamed();
m_Angle = ange;
}
//成员变量
private int m_lPen;
private int m_lOldPen;
private int m_lHDC;
private double m_Angle;
private int m_SymbolIndex;
private ESRI.ArcGIS.Display.IDisplayTransformation m_pDispTrans;
private int m_lSize;
2.接口函数的实现:
要实现自定义符号需要实现这四个接口的多个函数,最重要的是ImarkerSymbol的三个函数:SetupDC,Draw和ResetDC。
SetupDC用于设置画笔画刷、颜色等信息。
public void SetupDC(int hDC, ITransformation transformation)
{
// TODO: 添加 MyMarkerSymbol.SetupDC 实现
m_lPen = CreatePen(0, 2, System.Convert.ToInt32(m_pColor.RGB));
m_lOldPen = SelectObject(hDC, m_lPen);
m_lHDC = hDC;
m_pDispTrans = (IDisplayTransformation)transformation;
}
hDC为画布句柄。
ResetDC函数,绘制完成后,进行资源释放和状态回复。
public void ResetDC()
{
// TODO: 添加 MyMarkerSymbol.ResetDC 实现
SelectObject(m_lHDC, m_lOldPen);
DeleteObject(m_lPen);
m_pDispTrans = null;
m_lHDC = 0;
}
Draw函数实现符号的绘制工作:
public void Draw(IGeometry Geometry)
{
// TODO: 添加 MyMarkerSymbol.Draw 实现
if (Geometry == null)
{
return;
}
ESRI.ArcGIS.Geometry.IPoint pPt;
pPt = (IPoint)Geometry;
int x;
int y;
if (m_pDispTrans == null)
{
x = (int)pPt.X;
y = (int)pPt.Y;
}
else
{
m_pDispTrans.FromMapPoint(pPt, out x, out y);
}
DrawMetas(x,y);
}
3.DrawMetas实现:
需要在画布上绘制两条直线合两个圆,可以通过调用Windows API函数来实现:
[System.Runtime.InteropServices.DllImport("gdi32")]
private static extern bool LineTo (int hdc,int x,int y );
[System.Runtime.InteropServices.DllImport("gdi32")]
public static extern bool MoveToEx(int hdc,int x,int y,LPPOINT lpPoint);
[System.Runtime.InteropServices.DllImport("gdi32")]
public static extern bool Arc
(int hdc,int X1,int Y1, int X2,int Y2,int X3, int Y3,int X4,int Y4);
tanhw 发表于:2007-3-8 10:53:00
4.图元旋转
自定义符号需要按指定角度进行旋转,直线旋转的方法比较简单,以下介绍圆弧的旋转方法:
以圆弧所在圆所属矩形的左上角为例:
此主题相关图片如下:
旋转前的坐标为(x0,y0),旋转后的坐标为(x1,y1),计算出旋转半径r,alpha,则:
x1 = r*Math.Cos( alpha - mAngle );
y1 = r*Math.Sin( alpha - mAngle );
其他各定点也可以用同样方法计算。
计算出各顶点后调用以下方法绘制圆弧即可:
Arc(m_lHDC,(int)(x1),(int)(y1),(int)(x2),(int)(y2), (int)(x3),(int)(y3),(int)(x4),(int)(y4));
对于直线段可以用以下方法绘制即可:
LPPOINT prePos=new LPPOINT();
MoveToEx(m_lHDC,(int)x1,(int)y1,prePos);
LineTo(m_lHDC,(int)x2,(int)y2);
三、调用符号
1. 使用IsimpleRenderer接口渲染:
//定义render
IsimpleRenderer pSimpleRenderer = new SimpleRendererClass();
//定义自定义符号
MyMarkerSymbol mMyMarkerSymbol = new MyMarkerSymbol();
//渲染
IGeoFeatureLayer m_pGeoFeatureLayer;
pSimpleRenderer.Symbol = (ISymbol) mMyMarkerSymbol;
m_pGeoFeatureLayer = (IGeoFeatureLayer)ly;
m_pGeoFeatureLayer.Renderer = (IFeatureRenderer)pSimpleRenderer;
2. 使用IUniqueValueRenderer接口渲染:
IuniqueValueRenderer pRender = new UniqueValueRendererClass();
iAngleField = pFields.FindField("ANGLE");
for (int i=0;i< pFeatCls.FeatureCount(pQueryFilter) ;i++)
{
pFeat = pFeatCursor.NextFeature();
string x = null;
x = pFeat.get_Value(iField).ToString() ;
dAngle = (double)pFeat.get_Value(iAngleField);
SymbolIndex = int.Parse(pFeat.get_Value(iSymIndexField).ToString());
MyMarkerSymbol sym = new MyMarkerSymbol(dAngle);
pRender.AddValue( x,x, (ISymbol)msy);
}
pLyr.Renderer = (IFeatureRenderer)pRender;
以上介绍只能实现比较简单的动态符号,但只要完善其中的函数,就可以实现各种复杂的电力符号,应用到Arcgis Engine应用开发中,实现用户自定义设备符号,系统自动渲染。如有更好方法请赐教(hongwu.tan@hotmail.com)
转载于:https://www.cnblogs.com/xiexiaokui/archive/2008/07/25/1251691.html
arcengine cliasic code(转)基于ArcGIS Engine + C#实现用户自定义动态电力符号相关推荐
- ArcGIS Engine基础开发教程(转)
ArcGIS Engine基础开发教程(0)--目录 <ArcEngine9.3 基础开发教程>是面向初中级开发者的一份简单易用,功能全面的学习资料及参考文档.教程首先从如何来创建一个Ar ...
- ArcGIS Engine开发前基础知识(4)
ArcGIS不同开发方式的比较 关于GIS应用软件的开发,通常有三种方式:C/S架构.网络GIS和移动GIS.ArcGIS平台提供了对三种开发方式的支持,对于采用从C/S架构的大多数开发者来讲,首先想 ...
- 基于ARCGIS的VCT扩展模块使用[转自CSDN阿翔]
原文 :http://blog.csdn.net/jx1228/archive/2007/11/23/1898780.aspx VCT扩展模块的使用说明 1.VCT数据结构描述 VCT(<地球空 ...
- 基于ARCGIS的VCT扩展模块使用
VCT扩展模块的使用说明 1.VCT数据结构描述 VCT(<地球空间数据交换格式>(GB/T17798)描述)文件格式是在中国国土部门广泛使用的数据交换格式国家标准.地理信息系统(GIS) ...
- ArcGIS Engine开发---图层符号化
使用ServerStyle 如果熟悉ArcGIS Desktop的使用,就会对Style符号库文件有所了解,相对应的在ArcGIS Engine开发中对应的是ServerStyle符号库,它的结构体系 ...
- GIS开发进阶之路(十四) ArcEngine打开cad文件的五种方法、ArcGIS Engine错误码
ArcEngine打开cad文件的几种方法 方法一.通过遍历CAD数据集,依次加载中点线面注记等图层,所加载的数据均为一个独立的图层. IWorkspaceFactory pWorkspaceFact ...
- 基于C#的ArcGIS Engine二次开发的一个简单测试程序
上一篇文章介绍了环境的搭建,现在我们来做出第一个小测试程序. (1)先建一个C#窗体应用程序,我将程序名称改为了ArcGIS_test2. (2)点击"工具"->" ...
- ArcGIS Engine效率探究——要素的添加和删除、属性的读取和更新(转载)
转自:http://blog.csdn.net/freewaywalker/article/details/23703863 1. 要素的添加 ArcGIS Engine中,主要有两个方法用于要素的添 ...
- 制作AE(ArcGIS Engine 打包)开发的应用程序的安装包
利用InstallShield制作AE(ArcGIS Engine 打包)开发的应用程序的安装包 以下是个人学习的一些心得,由于本人对InstallShield也是刚刚接触,可能有些地方不是那么合理, ...
- ArcGIS介绍:ArcObjects、 ArcGIS Desktop、ArcGIS Engine 和 ArcSDE、ArcIMS、ArcGIS Server
版权声明 :转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://hgg2002.blogbus.com/logs/45875381.html 在ArcGIS 9系列产品中,ArcGI ...
最新文章
- 伍迷创意随想集 之 烧菜小帮手
- VBS 脚本中的字典、动态数组、队列和堆栈
- go 执行sh失败_为容器化的 Go 程序搭建 CI
- KlayGE的Virtual Texturing技术定名
- [JS][jQuery]清空元素html()、innerHTML= 与 empty()的区别 、remove()区别
- 美图秀秀5 android,美图秀秀Android版v1.4.5上线 优化拼图排版秀北爱
- 19年4月超星尔雅《移动互联网时代的信息安全与防护》期末考试参考答案(94分)
- linux 拼音输出繁体_解决rime仓颉拼音反查为繁体的问题
- MediaRecorder之视频录制
- 变量的三重属性_内存寻梦环游记:一个变量的三重死亡
- python怎么编写重复程序,python重复执行怎么写
- 开关电源的EMC整改实例
- 计算机辅助翻译专业院校,中国翻译学专业高校排名
- 大数据开发和java开发到底有什么不同?
- 在线帮助中心,轻松解决售后服务问题
- Sklearn笔记--逻辑回归调参指南
- 张一鸣的“成事哲学”:取势、明道、优术、践行、合众
- 万众瞩目!ICF5国产开源飞控推出,为国内无人系统发力
- 前端小知识:返回浏览器上一页(back、go、referrer)
- C语言Excel表格指针,C语言操作excel表格-链表实现
热门文章
- trackmaker翻译_体育翻译滑雪中英对照翻译
- 来,给产品狗起个正儿八经的名字!
- app 播放服务器文件,配置apple-app-site-association文件并在服务器上传
- 转:大数据的大价值:大数据五大成功案例深度解析
- 谷歌中国正式宣布李开复辞去总裁一职
- 云流化如何实现多人线上协作的?
- 计算机登录网站慢手机快,手机WiFi网速慢,简单输入几个数字立马变快!
- mongodb 两小时入门
- 【Unity3D】报错 Some objects were not cleaned up when closing the scene.
- android自定义view设置背景颜色,Android View的几种背景颜色设置