arcengine cliasic code(转)基于ArcGIS Engine + C#实现用户自定义动态电力符号
基于ArcGIS Engine + C#實(shí)現(xiàn)用戶自定義動(dòng)態(tài)電力符號(hào)
華立電網(wǎng)北京研發(fā)中心 阿文
ArcGIS Engine二次開(kāi)發(fā)一般需要通過(guò)桌面產(chǎn)品來(lái)制作這些符號(hào),然后通過(guò)專門(mén)的轉(zhuǎn)換工具轉(zhuǎn)換以后供AE使用。電力GIS應(yīng)用當(dāng)中,電力設(shè)備種類繁多,設(shè)備狀態(tài)比較復(fù)雜,需要用不同的符號(hào)來(lái)表現(xiàn)電力設(shè)備的不通狀態(tài),此外電力技術(shù)的更新速度很快,新設(shè)備種類也不斷推陳出新,用戶往往要求提供符號(hào)定義工具以滿足這些需求。本文以配電變壓器為例,介紹一種使用ArcGIS Engine + C#二次開(kāi)發(fā)模式下,可以讓用戶自己定義設(shè)備符號(hào)的一種方法。
一、符號(hào)定義
配電變壓器符號(hào)如下圖所示:
此主題相關(guān)圖片如下:
可以將這個(gè)符號(hào)分解成四個(gè)圖元,兩段線段,兩個(gè)圓(圓弧)。用以下結(jié)構(gòu)來(lái)描述圖元:
public struct MetaData
{
public int Typ; // 圖形類型 3:圓弧,0:線段
public double Scale; // 縮放
public int OffsX ; // 偏移(x)
public int OffsY; // 偏移(y)
public double Angle; // 旋轉(zhuǎn)
public int x1; // 圖元的第一點(diǎn)位置(x)
public int y1; // 圖元的第一點(diǎn)位置(y)
public int x2; // 圖元的第二點(diǎn)位置(x)
public int y2; // 圖元的第二點(diǎn)位置(y)
public int x3; // 圖元的第三點(diǎn)位置(x)
public int y3; // 圖元的第三點(diǎn)位置(y)
public int x4; // 圖元的第四點(diǎn)位置(x)
public int y4; // 圖元的第四點(diǎn)位置(y)
}
// 線段:第一點(diǎn):起點(diǎn)坐標(biāo), 第二點(diǎn):終點(diǎn)坐標(biāo), 第三點(diǎn), 第四點(diǎn)為空
// 圓弧:第一點(diǎn):圓弧所在圓所屬矩形的左上角,
// 第二點(diǎn):圓弧所在圓所屬矩形的左右下角,
// 第三點(diǎn):圓弧起點(diǎn)
// 第四點(diǎn):圓弧終點(diǎn)
// 圓弧方向?yàn)槟鏁r(shí)針,對(duì)于圓x3,y3,x4,y4重合
各圖元的坐標(biāo)如下:
| Typ | x1 | y1 | X2 | Y2 | x3 | Y3 | X4 | Y4 | |
| 第一點(diǎn) | 3 | 20 | -70 | 160 | 70 | 90 | -70 | 90 | -70 |
| 第二點(diǎn) | 3 | 100 | -70 | 240 | 70 | 100 | 0 | 100 | 0 |
| 第三點(diǎn) | 0 | 0 | 0 | 20 | 0 | 0 | 0 | 0 | 0 |
| 第四點(diǎn) | 0 | 240 | 0 | 260 | 0 | 0 | 0 | 0 | 0 |
可以編寫(xiě)一個(gè)繪制簡(jiǎn)單圖元的繪圖工具,方便用戶繪制這些圖元,繪制好的圖元存成以上格式,存入到數(shù)據(jù)庫(kù)中,以方便系統(tǒng)讀入。
2樓 tanhw 發(fā)表于:2007-3-8 10:49:00
一、自定義、實(shí)現(xiàn)符號(hào)類MyMarkerSymbol:
1.類的定義:
自定義符號(hào)需要實(shí)現(xiàn)以下四個(gè)接口:
IMarkerSymbol
ISymbol
IClone
IpersistVariant
MyMarkerSymbol類定義為:
public class MyMarkerSymbol :IMarkerSymbol,ISymbol,IClone,IPersistVariant
{
public MyMarkerSymbol()
{
//base.New();
Class_Initialize_Renamed();
}
}
構(gòu)造函數(shù),需將符號(hào)的角度傳入。
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.接口函數(shù)的實(shí)現(xiàn):
要實(shí)現(xiàn)自定義符號(hào)需要實(shí)現(xiàn)這四個(gè)接口的多個(gè)函數(shù),最重要的是ImarkerSymbol的三個(gè)函數(shù):SetupDC,Draw和ResetDC。
SetupDC用于設(shè)置畫(huà)筆畫(huà)刷、顏色等信息。
public void SetupDC(int hDC, ITransformation transformation)
{
// TODO: 添加 MyMarkerSymbol.SetupDC 實(shí)現(xiàn)
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為畫(huà)布句柄。
ResetDC函數(shù),繪制完成后,進(jìn)行資源釋放和狀態(tài)回復(fù)。
public void ResetDC()
{
// TODO: 添加 MyMarkerSymbol.ResetDC 實(shí)現(xiàn)
SelectObject(m_lHDC, m_lOldPen);
DeleteObject(m_lPen);
m_pDispTrans = null;
m_lHDC = 0;
}
Draw函數(shù)實(shí)現(xiàn)符號(hào)的繪制工作:
public void Draw(IGeometry Geometry)
{
// TODO: 添加 MyMarkerSymbol.Draw 實(shí)現(xiàn)
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實(shí)現(xiàn):
需要在畫(huà)布上繪制兩條直線合兩個(gè)圓,可以通過(guò)調(diào)用Windows API函數(shù)來(lái)實(shí)現(xiàn):
[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);
3樓 tanhw 發(fā)表于:2007-3-8 10:53:004.圖元旋轉(zhuǎn)
自定義符號(hào)需要按指定角度進(jìn)行旋轉(zhuǎn),直線旋轉(zhuǎn)的方法比較簡(jiǎn)單,以下介紹圓弧的旋轉(zhuǎn)方法:
以圓弧所在圓所屬矩形的左上角為例:
此主題相關(guān)圖片如下:
旋轉(zhuǎn)前的坐標(biāo)為(x0,y0),旋轉(zhuǎn)后的坐標(biāo)為(x1,y1),計(jì)算出旋轉(zhuǎn)半徑r,alpha,則:
x1 = r*Math.Cos( alpha - mAngle );
y1 = r*Math.Sin( alpha - mAngle );
其他各定點(diǎn)也可以用同樣方法計(jì)算。
計(jì)算出各頂點(diǎn)后調(diào)用以下方法繪制圓弧即可:
Arc(m_lHDC,(int)(x1),(int)(y1),(int)(x2),(int)(y2), (int)(x3),(int)(y3),(int)(x4),(int)(y4));
對(duì)于直線段可以用以下方法繪制即可:
LPPOINT prePos=new LPPOINT();
MoveToEx(m_lHDC,(int)x1,(int)y1,prePos);
LineTo(m_lHDC,(int)x2,(int)y2);
三、調(diào)用符號(hào)
1. 使用IsimpleRenderer接口渲染:
//定義render
IsimpleRenderer pSimpleRenderer = new SimpleRendererClass();
//定義自定義符號(hào)
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;
以上介紹只能實(shí)現(xiàn)比較簡(jiǎn)單的動(dòng)態(tài)符號(hào),但只要完善其中的函數(shù),就可以實(shí)現(xiàn)各種復(fù)雜的電力符號(hào),應(yīng)用到Arcgis Engine應(yīng)用開(kāi)發(fā)中,實(shí)現(xiàn)用戶自定義設(shè)備符號(hào),系統(tǒng)自動(dòng)渲染。如有更好方法請(qǐng)賜教(hongwu.tan@hotmail.com)轉(zhuǎn)載于:https://www.cnblogs.com/xiexiaokui/archive/2008/07/25/1251691.html
總結(jié)
以上是生活随笔為你收集整理的arcengine cliasic code(转)基于ArcGIS Engine + C#实现用户自定义动态电力符号的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: wx.createVideoContex
- 下一篇: C# 画个实心圆