显示点符号相对比较简单,其至少含有一个参数(符号名),另一个可能出现的是符号旋转的角度。点物标或面物标的中心都有可能用到点符号。绘制时,以符号的转心为基准。
对于面物标,有时需要在其中心绘制一个或多个符号以明确该物标的类型及性质。但在满足执行效率的前提下确定其中心位置有时并不容易,甚至找一个位于区域内部且大致靠近其中心都非易事。S-52标准中,给出了一种简单计算区域重心的方法,若区域由坐标(Xi, Yi)围成,那中心坐标可由下列公式给出:
区域重心简单公式
上式只适用于凸多边形,而对于凹多边形,上式并不能确定重点位于多边形内部。
此外,当面物标区域过大,被屏幕所截断时,应该重新计算屏幕中的多边形及其中心,然后将点符号绘制在该中心处。最直观的感受是,区域内符号的位置会动态变化,且始终位于屏幕所显示区域的中心处。
动态绘制中心符号
点符号指令
需要绘制的点符号的位置确定后,可用指定的符号进行绘制。
点符号显示
参数说明:
-
SYNAME 符号名
符号名由8位字母或数字组成,前6位字母代表符号类型,后2位数字代表序列号。符号的具体形状是由矢量符号描述语言定义的。 -
ROTATION 旋转角度
若为空,则表明不需要旋转
旋转角度由正上方(即-y轴方向)起算
旋转角度若是六字母属性值(如ORIENT),表示由正北方起算
旋转中心是符号的转心,取值范围为0~360
示例:SY(BOYCAR01);SY(LIGHTS05,135) :
含义:在同一位置显示符号BOYCAR01和LIGHTS05,但LIGHTS05需要顺时针旋转135度。
编码实现
DrawBitmap(SKBitmap bitmap, float x, float y, SKPaint paint = null)
,将bitmap绘制到(x, y)处,其中bitmap的左上角(0, 0)与(x, y)重合。当bitmap的转心不在左上角时,需要(x, y)减去偏移量。
找到对应名称的符号,将其转心置于指令坐标处。如需旋转一定角度,则旋转前保存坐标系,绘制完毕后还原坐标系。
public static void DrawSymbolAtXY(SKCanvas ca, float x, float y, string syname, int rotation = 0)
{
var symbol = S52Symbols.Instance[syname]; //通过名称获取符号
if (rotation == 0)
{
ca.DrawBitmap(symbol.Image, x - symbol.OffsetX, y - symbol.OffsetY); //使转心与(x, y)重合
}
else
{
ca.Save();
ca.RotateDegrees(rotation, x, y); //旋转坐标系
ca.DrawBitmap(symbol.Image, x - symbol.OffsetX, y - symbol.OffsetY);
ca.Restore();
}
}