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重合
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;
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;
}
public void ResetDC()
{
// TODO: 添加 MyMarkerSymbol.ResetDC 实现
SelectObject(m_lHDC, m_lOldPen);
DeleteObject(m_lPen);
m_pDispTrans = null;
m_lHDC = 0;
}
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);
}
[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);
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;m_pGeoFeatureLayer = (IGeoFeatureLayer)ly;
m_pGeoFeatureLayer.Renderer = (IFeatureRenderer)pSimpleRenderer;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;