`
devgis
  • 浏览: 136911 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

ArcGis Engine 符号

 
阅读更多
ArcGIS Engine二次开发一般需要通过桌面产品来制作这些符号,然后通过专门的转换工具转换以后供AE使用。电力GIS应用当中,电力设备种类繁多,设备状态比较复杂,需要用不同的符号来表现电力设备的不通状态,此外电力技术的更新速度很快,新设备种类也不断推陈出新,用户往往要求提供符号定义工具以满足这些需求。本文以配电变压器为例,介绍一种使用ArcGIS Engine + C#二次开发模式下,可以让用户自己定义设备符号的一种方法。
一、符号定义
配电变压器符号如下图所示:

可以将这个符号分解成四个图元,两段线段,两个圆(圆弧)。用以下结构来描述图元:

publicstructMetaData

{

publicintTyp; // 图形类型 3:圆弧,0:线段

publicdoubleScale; // 缩放

publicintOffsX ; // 偏移(x)

publicintOffsY; // 偏移(y)

publicdoubleAngle; // 旋转

publicintx1; // 图元的第一点位置(x)

publicinty1; // 图元的第一点位置(y)

publicintx2; // 图元的第二点位置(x)

publicinty2; // 图元的第二点位置(y)

publicintx3; // 图元的第三点位置(x)

publicinty3; // 图元的第三点位置(y)

publicintx4; // 图元的第四点位置(x)

publicinty4; // 图元的第四点位置(y)

}// 线段:第一点:起点坐标, 第二点:终点坐标, 第三点, 第四点为空

// 圆弧:第一点:圆弧所在圆所属矩形的左上角,第二点:圆弧所在圆所属矩形的左右下角,第三点:圆弧起点;第四点:圆弧终点

// 圆弧方向为逆时针,对于圆x3,y3,x4,y4重合
可以编写一个绘制简单图元的绘图工具,方便用户绘制这些图元,绘制好的图元存成以上格式,存入到数据库中,以方便系统读入。

一、自定义、实现符号类MyMarkerSymbol:
1.类的定义:
自定义符号需要实现以下四个接口:
IMarkerSymbol
ISymbol
IClone
IpersistVariant

MyMarkerSymbol类定义为:

publicclassMyMarkerSymbol :IMarkerSymbol,ISymbol,IClone,IPersistVariant

{

publicMyMarkerSymbol()

{

//base.New();

Class_Initialize_Renamed();

}
}

构造函数,需将符号的角度传入。

publicMyMarkerSymbol(doubleange)

{

//base.New();

Class_Initialize_Renamed();

m_Angle = ange;

}

//成员变量

privateintm_lPen;

privateintm_lOldPen;

privateintm_lHDC;

privatedoublem_Angle;

privateintm_SymbolIndex;

privateESRI.ArcGIS.Display.IDisplayTransformation m_pDispTrans;

privateintm_lSize;

2.接口函数的实现:
要实现自定义符号需要实现这四个接口的多个函数,最重要的是ImarkerSymbol的三个函数:SetupDCDrawResetDC
SetupDC用于设置画笔画刷、颜色等信息。

publicvoidSetupDC(inthDC, 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函数,绘制完成后,进行资源释放和状态回复。

publicvoidResetDC()

{

// TODO:添加 MyMarkerSymbol.ResetDC 实现

SelectObject(m_lHDC, m_lOldPen);

DeleteObject(m_lPen);

m_pDispTrans =null;

m_lHDC = 0;

}

Draw函数实现符号的绘制工作:

publicvoidDraw(IGeometry Geometry)

{

// TODO:添加 MyMarkerSymbol.Draw 实现

if(Geometry ==null)

{

return;

}

ESRI.ArcGIS.Geometry.IPoint pPt;

pPt = (IPoint)Geometry;

intx;

inty;

if(m_pDispTrans ==null)

{

x = (int)pPt.X;

y = (int)pPt.Y;

}

else

{

m_pDispTrans.FromMapPoint(pPt,outx,outy);

}

DrawMetas(x,y);

}
3.DrawMetas实现:
需要在画布上绘制两条直线合两个圆,可以通过调用Windows API函数来实现:

[System.Runtime.InteropServices.DllImport("gdi32")]

privatestaticexternboolLineTo (inthdc,intx,inty );

[System.Runtime.InteropServices.DllImport("gdi32")]

publicstaticexternboolMoveToEx(inthdc,intx,inty,LPPOINT lpPoint);

[System.Runtime.InteropServices.DllImport("gdi32")]

publicstaticexternboolArc

(inthdc,intX1,intY1,intX2,intY2,intX3,intY3,intX4,intY4);

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=newLPPOINT();

MoveToEx(m_lHDC,(int)x1,(int)y1,prePos);

LineTo(m_lHDC,(int)x2,(int)y2);

三、调用符号

1.使用IsimpleRenderer接口渲染:

//定义render

IsimpleRenderer pSimpleRenderer =newSimpleRendererClass();

//定义自定义符号

MyMarkerSymbol mMyMarkerSymbol =newMyMarkerSymbol();

//渲染

IGeoFeatureLayer m_pGeoFeatureLayer;
pSimpleRenderer.Symbol = (ISymbol) mMyMarkerSymbol;

m_pGeoFeatureLayer = (IGeoFeatureLayer)ly;

m_pGeoFeatureLayer.Renderer = (IFeatureRenderer)pSimpleRenderer;

2.使用IUniqueValueRenderer接口渲染:
IuniqueValueRenderer pRender =newUniqueValueRendererClass();

iAngleField = pFields.FindField("ANGLE");

for(inti=0;i< pFeatCls.FeatureCount(pQueryFilter) ;i++)

{

pFeat = pFeatCursor.NextFeature();

stringx =null;

x = pFeat.get_Value(iField).ToString() ;

dAngle = (double)pFeat.get_Value(iAngleField);

SymbolIndex =int.Parse(pFeat.get_Value(iSymIndexField).ToString());

MyMarkerSymbol sym =newMyMarkerSymbol(dAngle);

pRender.AddValue( x,x, (ISymbol)msy);

}

pLyr.Renderer = (IFeatureRenderer)pRender;


以上介绍只能实现比较简单的动态符号,但只要完善其中的函数,就可以实现各种复杂的电力符号,应用到Arcgis Engine应用开发中,实现用户自定义设备符号,系统自动渲染。

在ArcGis Engine中实现对符号的预览,生成预览图片。使用的时候只要调用SymbolToBitmp(符号,宽,高)就可以返回生成的图片了。关键代码如下:

publicSystem.Drawing.Bitmap SymbolToBitmp(ESRI.ArcGIS.Display.ISymbol pSymbol,intiwidth,intiheight)
{
//根据高宽创建图象
Bitmap bmp =newBitmap(iwidth,iheight);
Graphics gImage = Graphics.FromImage(bmp);
gImage.Clear(Color.White);
doubledpi = gImage.DpiX;

IEnvelope pEnvelope =newEnvelopeClass();
pEnvelope.PutCoords(0,0,(double)bmp.Width,(double)bmp.Height);

tagRECT deviceRect;
deviceRect.left = 0;
deviceRect.right = bmp.Width;
deviceRect.top = 0;
deviceRect.bottom = bmp.Height;

IDisplayTransformation pDisplayTransformation =newDisplayTransformationClass();
pDisplayTransformation.VisibleBounds = pEnvelope;
pDisplayTransformation.Bounds = pEnvelope;
pDisplayTransformation.set_DeviceFrame(refdeviceRect);
pDisplayTransformation.Resolution = dpi;

IGeometry pGeo = CreateSymShape(pSymbol,pEnvelope);

System.IntPtr hdc =newIntPtr();
hdc = gImage.GetHdc();

//将符号的形状绘制到图象中
pSymbol.SetupDC((int)hdc,pDisplayTransformation);
pSymbol.Draw(pGeo);
pSymbol.ResetDC();
gImage.ReleaseHdc(hdc);
gImage.Dispose();

returnbmp;

}

publicESRI.ArcGIS.Geometry.IGeometry CreateSymShape(ISymbol pSymbol,IEnvelope pEnvelope)
{// 根据传入的符号以及外包矩形区域返回对应的几何空间实体(点,线、面)
//判断是否为“点”符号

ESRI.ArcGIS.Display.IMarkerSymbol IMarkerSym;
IMarkerSym = pSymbolasIMarkerSymbol;
if (IMarkerSym !=null)
{
// 为“点”符号则返回IEnvelope的中心点
IArea pArea ;
pArea = pEnvelopeasIArea;
returnpArea.CentroidasIGeometry;
}
else
{
//判断是否为“线”符号
ESRI.ArcGIS.Display.ILineSymbol IlineSym;
ESRI.ArcGIS.Display.ITextSymbol ITextSym;
IlineSym = pSymbolasILineSymbol;
ITextSym = pSymbolasITextSymbol;
if(IlineSym !=null|| ITextSym !=null)
{
//返回45度的对角线
ESRI.ArcGIS.Geometry.IPolyline IpLine;
IpLine =newPolylineClass();
IpLine.FromPoint = pEnvelope.LowerLeft;
IpLine.ToPoint = pEnvelope.UpperRight;
returnIpLineasIGeometry;
}
else
{
//直接返回一个IEnvelope矩形区域
returnpEnvelopeasIGeometry;
}
}
}


分享到:
评论

相关推荐

    ARCGIS engine 符号渲染

    在这个特定的场景中,我们关注的是“符号渲染”,这是ARCGIS Engine二次开发中的一个重要环节。 符号渲染是GIS中的核心概念,它决定了地图上数据如何视觉化展示。通过不同的符号,我们可以区分不同类型的地物,如...

    ARCGIS engine 符号渲染 ARCGIS engine 二次开发中关于地图符号的分类、分级渲染。.zip

    ARCGIS Engine的符号系统包括多种类型,如简单符号、复合符号、图片符号、位图符号等,每种都有其特定的应用场景。简单符号用于绘制单一颜色或线型的地物;复合符号则由多个简单符号组合,可以实现更复杂的效果;...

    Arcgis Engine 添加shp.lyr图层,删除图层,移动图层,更改图例符号,属性查询,鹰眼

    本篇将详细介绍如何利用ArcGIS Engine进行图层操作,包括添加shp.lyr图层、删除图层、移动图层、更改图例符号、属性查询以及实现鹰眼(Zoom to Extent)功能。 1. **添加shp.lyr图层** 在ArcGIS Engine中,我们...

    ArcGIS-Engine+C#-初学者实例代码.zip_ArcGISEngine_HWE7_arcgis engine_eng

    在本文中,我们将深入探讨如何使用ArcGIS Engine与C#进行地图应用的二次开发,以帮助初学者掌握关键技能,实现界面设计、属性表管理、符号编辑、鹰眼功能及自定义右键菜单等核心功能。 ArcGIS Engine是Esri公司提供...

    ArcGIS Engine地图符号化.zip

    《ArcGIS Engine地图符号化的深度探索》 ArcGIS Engine,作为Esri公司的核心开发组件,为开发者提供了构建桌面GIS应用程序的强大工具。其中,地图符号化是GIS应用中的关键环节,它决定了地图上地理数据的视觉表现...

    ArcGIS Engine 10.3下载

    ### ArcGIS Engine 10.3相关知识点 #### 一、ArcGIS Engine简介 ArcGIS Engine 是由Esri公司开发的一款强大的地理信息系统(GIS)组件技术。它为开发者提供了创建和集成GIS应用的能力,使用户能够在桌面应用程序中...

    ArcGIS Engine 开发技术ESRI官方代码_C#_arcgisengine_arcgisengine_gis_were

    《ArcGIS Engine开发技术——基于C#的GIS应用实践》 ArcGIS Engine是Esri公司提供的一个强大的开发工具集,用于构建地理信息系统(GIS)应用程序。它为开发者提供了丰富的地图和空间数据处理功能,使开发者能够利用...

    C# + ARCGis Engine基础教程

    在本"C# + ARCGIS Engine基础教程"中,我们将深入探讨如何利用C#编程语言与ESRI的ARCGIS Engine进行地图应用的二次开发。ARCGIS Engine是一款强大的地理信息系统(GIS)开发工具,它允许开发者创建桌面、Web以及移动...

    基于ArcGIS+Engine的符号化研究与实现

    ### 基于ArcGIS+Engine的符号化研究与实现 #### 一、ArcGIS Engine 概述 ArcGIS Engine 是一款与 ArcGIS 9.0 同时推出的独立软件开发包,它允许开发者在无需 ArcGIS Desktop 环境的情况下进行应用程序的开发。...

    ArcGIS Engine 10 开发更新

    嵌入式GIS产品ArcGISEngine则为开发者提供了一套完备的组件库和工具包,开发者可以用它创建新的桌面应用程序或扩展已有的应用程序。ArcGISEngine开发工具包是基于组件的软件开发产品,适于构建定制化的GIS和制图应用...

    ArcGIS Engine + C# 实例开发教程.pdf

    【ArcGIS Engine + C# 实例开发教程】是面向ArcGIS Engine初学者的一份详细教程,旨在帮助读者掌握使用C#语言和Visual Studio 2005开发GIS桌面应用程序的基本方法。教程的主要目标是使读者深入理解ArcGIS Engine的...

    《ArcGIS Engine+C#实例开发教程》源码

    《ArcGIS Engine+C#实例开发教程》是一本深入讲解如何使用ArcGIS Engine结合C#进行地理信息系统(GIS)开发的专业书籍。ArcGIS Engine是Esri公司提供的一个强大的开发工具,它允许开发者创建桌面、Web以及移动平台上...

    第六课 发布 ArcGIS Engine 应用程序

    进入**创建setup和发布程序**阶段,开发者需将ArcGIS Engine Runtime与自己的应用程序打包,同时配置所有必需的数据、地图文档(MXDs)和符号库。这一步骤确保最终用户在安装应用时能获得完整且一致的体验。 ##### ...

    ArcGIS Engine轻松入门.rar

    《ArcGIS Engine轻松入门》是一份专为初学者设计的指南,旨在帮助用户快速掌握ArcGIS Engine的基础知识和应用技巧。ArcGIS Engine是Esri公司提供的一个强大的开发工具集,它允许开发人员创建桌面、移动和Web GIS应用...

    ArcGIS Engine+C#实例开发教程 源码

    《ArcGIS Engine+C#实例开发教程》是一本深入讲解如何使用ArcGIS Engine结合C#进行地理信息系统(GIS)开发的专业书籍。ArcGIS Engine是Esri公司提供的一个强大的开发平台,它允许开发者创建桌面、Web以及移动应用,...

    arcgisengine综合系统

    在ArcGIS Engine中,我们可以利用SymbolSelector控件配合Renderer类来创建不同类型的专题图,如分类颜色渲染、比例尺符号渲染等。首先,定义渲染器对象,然后将其应用于图层,即可改变地图上要素的显示样式,从而...

    arcgis engine开发代码

    在IT行业中,ArcGIS Engine是一种强大的地理信息系统(GIS)开发平台,由Esri公司提供,用于构建具有专业地图和地理处理功能的应用程序。这个“arcgis engine开发代码”压缩包显然是为初学者准备的一个学习资源,...

Global site tag (gtag.js) - Google Analytics