工作过程中需要用把数据库中点显示到屏幕,作为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");