【问题标题】:Map projection with System.Drawing.Graphics使用 System.Drawing.Graphics 进行地图投影
【发布时间】:2021-09-28 16:02:30
【问题描述】:

我有一组地理坐标作为纬度/经度对,我希望将其投影到 2D 表面上。一些坐标由形成形状/轮廓/多边形的线连接。

我了解如何使用众多可用地图投影(如墨卡托)之一来投影各个点,然后使用 Graphics.DrawArc 绘制它们,但我该如何投影它们之间的连接线?我不能只投影一条线的两个定义坐标并绘制它Graphics.DrawLine,因为该线上的每个点也必须投影,对吗?我对这些东西了解不多,所以希望你明白我的意思。

是否有可能只使用System.Drawing.Graphics 类提供的方法来做我想做的事情?我可以用投影矩阵来做到这一点吗?如果有人能解释一下我将如何做这件事,我将不胜感激。谢谢。

【问题讨论】:

    标签: c# geospatial projection system.drawing map-projections


    【解决方案1】:

    如果您只画线,最简单的方法就是将线细分为短线段,投影每个线段点并在它们之间画直线。这可能不是最高效或最准确的方法。但它应该很容易实现。

    例如:

        public static void DrawSubdivided(this Graphics g, Pen pen, Vector2 p1, Vector2 p2, float subdivisionLength)
        {
            var d = p2 - p1;
            var length = d.Length();
            // Add check for zero-length lines
            var dn = d / length;
    
            var points = new List<Vector2>();
            for (float l = 0; l < length; l += subdivisionLength)
            {
                points.Add( p1 + dn * l);
            }
            points.Add(p2);
    
            // apply transformation to the points
    
            g.DrawLines(pen, points.Select(p => new PointF(p.X, p.Y)).ToArray());
        }
    

    这使用 System.Numerics.Vector2,因为它定义了合理的算术运算,与 PointF 相比。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 2012-04-24
      • 2012-06-08
      • 1970-01-01
      • 2012-02-10
      • 2014-02-28
      • 1970-01-01
      相关资源
      最近更新 更多