You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GMap.Net旋转椭圆标记位置异常及渲染跟随问题求助

GMap.Net自定义旋转椭圆标记位置异常问题解决

我在GMap.Net中实现自定义标记,需要显示带旋转的椭圆,支持短轴、长轴和方位角参数。现在遇到两个问题:

  • 椭圆显示位置不正确
  • 地图移动时,椭圆覆盖层停留在原地不动

注释掉TranslateTransform和RotateTransform后,标记位置正常,但失去旋转效果。原OnRender代码如下:

public override void OnRender(Graphics g) 
{ 
    int centerX = this.LocalPosition.X - ShortAxis / 2;
    int centerY = this.LocalPosition.Y - LongAxis) / 2;
    g.TranslateTransform(this.LocalPosition.X, his.LocalPosition.Y);
    g.DrawEllipse(Pen, centerX, centerY. ShortAxis, LongAxis);
    g.RotateTransform((float)(this.Azimuth % 360);
    g.ResetTransform();   
} 

问题分析

  1. 语法错误:原代码存在多处语法问题,直接导致逻辑异常或编译失败:

    • centerY计算多了闭合括号:this.LocalPosition.Y - LongAxis) / 2
    • TranslateTransform中笔误将this写成his
    • DrawEllipse参数间误用点号替代逗号
    • RotateTransform缺少闭合括号
  2. 变换顺序错误:GDI+的图形变换是逆序生效的,原代码先平移再旋转,会让椭圆绕地图原点旋转而非自身中心,导致位置偏移。

  3. 绘制坐标逻辑错误:应用平移到LocalPosition后,仍基于该位置计算绘制坐标,造成双重偏移,位置完全错误。

修正后的代码

public override void OnRender(Graphics g) 
{ 
    // 保存当前图形状态,自动恢复避免影响其他绘制
    using (var state = g.Save())
    {
        int ellipseWidth = ShortAxis;
        int ellipseHeight = LongAxis;

        // 步骤1:将椭圆中心偏移到原点,确保旋转中心是自身中心
        g.TranslateTransform(-ellipseWidth / 2, -ellipseHeight / 2);
        // 步骤2:应用方位角旋转
        g.RotateTransform((float)(this.Azimuth % 360));
        // 步骤3:平移到标记的目标位置(LocalPosition为标记中心)
        g.TranslateTransform(this.LocalPosition.X, this.LocalPosition.Y);

        // 绘制椭圆:基于原点的外接矩形,结合变换得到正确位置
        g.DrawEllipse(Pen, 0, 0, ellipseWidth, ellipseHeight);
    }
}

修正说明

  • 用Graphics.Save()配合using块管理状态,替代手动ResetTransform,更安全可靠
  • 调整变换顺序:先偏移椭圆到原点→旋转→平移到目标位置,确保旋转中心正确
  • 绘制时以(0,0)为起点,避免双重偏移,保证椭圆与标记中心对齐
  • 修复所有语法错误,确保代码正常编译运行

内容的提问来源于stack exchange,提问作者Roman Flickstein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:05:19