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