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(); }
问题分析
语法错误:原代码存在多处语法问题,直接导致逻辑异常或编译失败:
centerY计算多了闭合括号:this.LocalPosition.Y - LongAxis) / 2TranslateTransform中笔误将this写成hisDrawEllipse参数间误用点号替代逗号RotateTransform缺少闭合括号
变换顺序错误:GDI+的图形变换是逆序生效的,原代码先平移再旋转,会让椭圆绕地图原点旋转而非自身中心,导致位置偏移。
绘制坐标逻辑错误:应用平移到
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
相关产品推荐
相关产品推荐

