绘制方形坐标系

      工作过程中需要用把数据库中点显示到屏幕,作为gis工作者来说本应该使用gis的方法来实现,由于之前完成这一部分工作的同事已经离职好久,需求又有变动,所以放弃了之前gis的方法,使用c#画布的方法来实现。其中涉及到长度单位到分辨率的转换写在了上一篇(长度单位转像素)中。

第一步:创建GDI,在指定的空间上绘制,这里拖入的控件是PictureBox

Bitmap bmp;
Graphics grap;
int picWidth = 800;
int picHeight = 800;//单位:像素,为pictureBox1的长度
float plotWidth = 24f;//单位:米
float plotWidthReal = 25.82f;//单位:米
public void Initial()
        {
            bmp = new Bitmap(picWidth, picHeight);//建立一个位图
            grap = Graphics.FromImage(bmp);//根据位图创建画布

            grap.FillRectangle(new SolidBrush(Color.White), new Rectangle(0, 0, picWidth, picHeight));//不使用这句话,那么这个bmp的背景就是透明的
            //使图像平滑没有锯齿
            grap.SmoothingMode = SmoothingMode.AntiAlias;
            grap.SmoothingMode = SmoothingMode.HighQuality;
            grap.CompositingQuality = CompositingQuality.HighQuality;
            grap.InterpolationMode = InterpolationMode.HighQualityBicubic;
            //绘制坐标系
            DrawBackground();
        }

第二步:绘制坐标系,有一个需要注意的地方是画布的原点是左上角,画线的时候要注意

        public void DrawBackground()
        {
            //创建画笔 
            Pen p = new Pen(Brushes.Gray, 1);//Red
            p = new Pen(new SolidBrush(Color.FromArgb(80, Color.Gray)), 1);//80为透明度  255时时实线  
            //偏移量,为了显示在中央,以及画额外长度
            float length = (int)length2ScreenPx(plotWidth);
            float offsetX = (pictureBox1.Width - length) / 2 - 50;
            float exLen = length2ScreenPx(plotWidthReal - plotWidth);//额外长度
            float offsetY = offsetX;
            //最上横线
            PointF px1 = new PointF(offsetX, offsetY);//左点
            PointF px2 = new PointF(length + offsetX + exLen, offsetY);//右点
            grap.DrawLine(p, px1, px2);
            //最右竖线
            px1 = new PointF(offsetX + length + exLen, offsetY);//上点
            px2 = new PointF(offsetX + length + exLen, length + offsetY + exLen);//下点
            grap.DrawLine(p, px1, px2);
            //画线 规则线
            for (int i = (int)plotWidth; i >= 0; i = i - 2)
            {
                float length2 = (int)length2ScreenPx(i);
                //横线
                PointF linePt1 = new PointF(offsetX, length2 + offsetY + exLen);//左点
                PointF linePt2 = new PointF(length + offsetX + exLen, length2 + offsetY + exLen);//右点
                grap.DrawLine(p, linePt1, linePt2);
                //竖线
                linePt1 = new PointF(offsetX + length2, offsetY);//上点
                linePt2 = new PointF(length2 + offsetX, length + offsetY + exLen);//下点
                grap.DrawLine(p, linePt1, linePt2);
            }
            //边框文字(刻度)
            float numberPadding = 20f;
            for (int i = (int)plotWidth; i >= 0; i = i - 2)
            {
                float length2 = (int)length2ScreenPx(i);
                if (i == 24)
                {
                    grap.DrawString("", new Font("宋体", 12f), Brushes.Black, new PointF(offsetX, length2 + offsetY + exLen));//左轴
                    grap.DrawString("", new Font("宋体", 12f), Brushes.Black, new PointF(length + offsetX + exLen, length2 + offsetY + exLen));//右轴
                    grap.DrawString(i + "", new Font("宋体", 12f), Brushes.Black, new PointF(length2 + offsetX, offsetY - numberPadding));//上轴
                    grap.DrawString(i + "", new Font("宋体", 12f), Brushes.Black, new PointF(length2 + offsetX, length + offsetY + exLen));//下轴
                }
                else if (i == 0)
                {
                    grap.DrawString("", new Font("宋体", 12f), Brushes.Black, new PointF(length2 + offsetX, offsetY - numberPadding));//上轴
                    grap.DrawString("", new Font("宋体", 12f), Brushes.Black, new PointF(length2 + offsetX, length + offsetY + exLen));//下轴
                    grap.DrawString(plotWidth + "", new Font("宋体", 12f), Brushes.Black, new PointF(offsetX - numberPadding, length2 + offsetY + exLen));//左轴
                    grap.DrawString(plotWidth + "", new Font("宋体", 12f), Brushes.Black, new PointF(length + offsetX + exLen, length2 + offsetY + exLen));//右轴
                }
                else
                {
                    grap.DrawString(i + "", new Font("宋体", 12f), Brushes.Black, new PointF(length2 + offsetX, offsetY - numberPadding));//上轴
                    grap.DrawString(i + "", new Font("宋体", 12f), Brushes.Black, new PointF(length2 + offsetX, length + offsetY + exLen));//下轴
                    grap.DrawString(plotWidth - i + "", new Font("宋体", 12f), Brushes.Black, new PointF(offsetX - numberPadding, length2 + offsetY + exLen));//左轴
                    grap.DrawString(plotWidth - i + "", new Font("宋体", 12f), Brushes.Black, new PointF(length + offsetX + exLen, length2 + offsetY + exLen));//右轴
                }
            }
            grap.DrawString(25.82 + "", new Font("宋体", 12f), Brushes.Black, new PointF(offsetX - 45, offsetY));//左轴
            grap.DrawString(25.82 + "", new Font("宋体", 12f), Brushes.Black, new PointF(offsetX + length + exLen, length + offsetY + exLen));//下轴
            grap.DrawString(25.82 + "", new Font("宋体", 12f), Brushes.Black, new PointF(offsetX + length + exLen, offsetY));//右轴
            grap.DrawString(25.82 + "", new Font("宋体", 12f), Brushes.Black, new PointF(length + offsetX + exLen, offsetY - numberPadding));//上轴

            grap.SmoothingMode = SmoothingMode.HighQuality;

            //将绘制好的位图显示在控件上
            pictureBox1.Image = bmp;

        }

第三步:导出照片,显示效果

 bmp.Save(@"C:\Users\admin\Desktop\TEST\test.png");

发布了31 篇原创文章 · 获赞 2 · 访问量 2558

猜你喜欢

转载自blog.csdn.net/fangyu723/article/details/102859298