2.2.13 电子海图系统解析及开发 海图显示 - 符号化指令:显示点符号

显示点符号相对比较简单,其至少含有一个参数(符号名),另一个可能出现的是符号旋转的角度。点物标或面物标的中心都有可能用到点符号。绘制时,以符号的转心为基准。

对于面物标,有时需要在其中心绘制一个或多个符号以明确该物标的类型及性质。但在满足执行效率的前提下确定其中心位置有时并不容易,甚至找一个位于区域内部且大致靠近其中心都非易事。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();
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容