ArcGIS Engine开发之地图导出

关于地图导出的方法有很多,但是核心技术就那么一点。下面是从项目实战中总结的一部分地图导出的方法:(以全域导出和区域导出为例)

1.由于地图导出用到的函数和方法容易重复,增加了工作量故首先将其进行封装成类(ExportMap类):用到的主要接口为:IActiveView(活动视图接口)、IGeometry(几何接口)、IRgbColor(颜色接口)、IElement(要素接口)等。

具体的封装代码如下:

  1   class ExportMap
  2     {
  3         #region 输出视图
  4         public static void ExportView(IActiveView view, IGeometry pGeo, int Outputresoultion, int Width, int Height, string ExpPath, bool bRegion)
  5         {
  6             IExport pExport = null;
  7             tagRECT exportrect = new tagRECT();
  8             IEnvelope pEnvelop = pGeo.Envelope;
  9             string sType = System.IO.Path.GetExtension(ExpPath);
 10             switch (sType)
 11             {
 12                 case ".jpg":
 13                     pExport = new ExportJPEGClass();
 14                     break;
 15                 case ".bmp":
 16                     pExport = new ExportBMPClass();
 17                     break;
 18                 case ".gif":
 19                     pExport = new ExportGIFClass();
 20                     break;
 21                 case ".tif":
 22                     pExport = new ExportTIFFClass();
 23                     break;
 24                 case ".png":
 25                     pExport = new ExportPNGClass();
 26                     break;
 27                 case ".pdf":
 28                     pExport = new ExportPDFClass();
 29                     break;
 30                 default:
 31                     MessageBox.Show("没有输出格式,默认JPEG");
 32                     pExport = new ExportJPEGClass();
 33                     break;
 34             }
 35             pExport.ExportFileName = ExpPath;
 36             exportrect.left = 0;
 37             exportrect.top = 0;
 38             exportrect.right = Width;
 39             exportrect.bottom = Height;
 40             if (bRegion)
 41             {
 42                 view.GraphicsContainer.DeleteAllElements();
 43                 view.Refresh();
 44             }
 45             IEnvelope envelop = new EnvelopeClass();
 46             envelop.PutCoords((double)exportrect.left, (double)exportrect.top, (double)exportrect.right, (double)exportrect.bottom);
 47             pExport.PixelBounds = envelop;
 48             view.Output(pExport.StartExporting(), Outputresoultion, ref exportrect, pEnvelop, null);
 49             pExport.FinishExporting();
 50             pExport.Cleanup();
 51         }
 52         #endregion
 53         #region 获取RGB颜色
 54         private static  IRgbColor GetRgbColor(int intR,int intG,int intB)
 55         {
 56             IRgbColor pRgbColor=null;
 57             if(intR<0||intR>255||intG<0||intG>255||intB<0||intB>255)
 58             {
 59                 return pRgbColor;
 60             }
 61             pRgbColor=new RgbColorClass();
 62             pRgbColor.Red=intR;
 63             pRgbColor.Green=intG;
 64             pRgbColor.Blue=intB;
 65             return pRgbColor;
 66         }
 67         #endregion
 68         #region 创建图形元素
 69         /// <summary>
 70         ///
 71         /// </summary>
 72         /// <param name="pGeomentry">几何图形</param>
 73         /// <param name="lineColor">边框颜色</param>
 74         /// <param name="fillColor">填充颜色</param>
 75         /// <returns></returns>
 76         public static IElement CreateElement(IGeometry pGeomentry, IRgbColor lineColor, IRgbColor fillColor)
 77         {
 78             if (pGeomentry == null || lineColor == null || fillColor == null)
 79             {
 80                 return null;
 81             }
 82             IElement pElem = null;
 83             try
 84             {
 85                 if (pGeomentry is IEnvelope)
 86
 87                     pElem = new RectangleElementClass();
 88                 else if (pGeomentry is IPolygon)
 89                     pElem = new PolygonElementClass();
 90                 else if (pGeomentry is ICircularArc)
 91                 {
 92                     ISegment pSegCircle = pGeomentry as ISegment;
 93                     ISegmentCollection pSegColl = new PolygonClass();
 94                     object o = Type.Missing;
 95                     pSegColl.AddSegment(pSegCircle, ref o, ref o);
 96                     IPolygon pPolygon = pSegCircle as IPolygon;
 97                     pGeomentry = pPolygon as IGeometry;
 98                     pElem = new CircleElementClass();
 99                 }
100                 else if (pGeomentry is IPolyline)
101                     pElem = new LineElementClass();
102                 if (pElem == null)
103                     return null;
104                 pElem.Geometry = pGeomentry;
105                 IFillShapeElement pFElem = pElem as IFillShapeElement;
106                 ISimpleFillSymbol pSymbol = new SimpleFillSymbolClass();
107                 pSymbol.Color=fillColor ;
108                 pSymbol.Outline.Color=lineColor;
109                 pSymbol.Style = esriSimpleFillStyle.esriSFSCross;//图形元素的样式
110                 if (pSymbol == null)
111                 {
112                     return null;
113                 }
114                 pFElem.Symbol = pSymbol;
115             }
116             catch(Exception ex)
117             {
118                 MessageBox.Show(ex.Message );
119             }
120             return pElem;
121         }
122         #endregion
123         #region 视图窗口绘制几何图形元素
124         /// <summary>
125         ///
126         /// </summary>
127         /// <param name="pGeometry">几何图形</param>
128         /// <param name="activeView">活动视图</param>
129         public static void AddElement(IGeometry pGeometry,IActiveView activeView)
130         {
131             IRgbColor fillColor=GetRgbColor(204,175,235);
132             IRgbColor lineColor=GetRgbColor(0,0,0);
133             IElement pEle=CreateElement(pGeometry,lineColor,fillColor );//调用图形元素的函数
134             IGraphicsContainer pGC = activeView.GraphicsContainer;
135             if (pGC != null)
136             {
137                 pGC.AddElement(pEle, 0);
138                 activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, pEle, null);
139             }
140         }
141         #endregion
142         #region 全域导出
143         /// <summary>
144         /// 全域导出
145         /// </summary>
146         /// <param name="OutputResolution">输出分辨率</param>
147         /// <param name="ExpPath">输出路径</param>
148         /// <param name="view">视图</param>
149         public static void ExportActiveView(int OutputResolution, string ExpPath, IActiveView view)
150         {
151             IExport pExport = null;
152             tagRECT exportRect;
153             IEnvelope envelop2 = view.Extent;
154             int num = (int)Math.Round(view.ScreenDisplay.DisplayTransformation.Resolution);
155             string sType = System.IO.Path.GetExtension(ExpPath);
156             switch (sType)
157             {
158                 case ".jgp":
159                     pExport = new ExportJPEGClass();
160                     break;
161                 case ".bmp":
162                     pExport = new ExportBMPClass();
163                     break;
164                 case ".gif":
165                     pExport = new ExportGIFClass();
166                     break;
167                 case ".tif":
168                     pExport = new ExportTIFFClass();
169                     break;
170                 case ".png":
171                     pExport = new ExportPNGClass();
172                     break;
173                 case ".pdf":
174                     pExport = new ExportPDFClass();
175                     break;
176                 default: MessageBox.Show("No Export Foemat,the default format is JPEG!");
177                     pExport = new ExportJPEGClass();
178                     break;
179             }
180             pExport.ExportFileName = ExpPath;
181             exportRect.left = 0; exportRect.top = 0;
182             exportRect.right = (int)Math.Round((double)(view.ExportFrame.right * (((double)OutputResolution) / ((double)num))));
183             exportRect.bottom = (int)Math.Round((double)(view.ExportFrame.bottom * (((double)OutputResolution) / ((double)num))));
184             IEnvelope envelop = new EnvelopeClass();
185             envelop.PutCoords((double)exportRect.left, (double)exportRect.top, (double)exportRect.right, (double)exportRect.bottom);
186             pExport.PixelBounds = envelop;
187             view.Output(pExport.StartExporting(), OutputResolution, ref exportRect, envelop2, null);
188             pExport.FinishExporting();
189             pExport.Cleanup();
190         }
191         #endregion
192         #region  区域导出
193         /// <summary>
194         /// 区域导出
195         /// </summary>
196         /// <param name="pGeo">输出的图形</param>
197         /// <param name="OutputResolution">输出的范围</param>
198         /// <param name="ExpPath">输出路径</param>
199         /// <param name="view">视图</param>
200         public static void ExportRegion(IGeometry pGeo, int OutputResolution, string ExpPath, IActiveView view)
201         {
202             IExport export = null;
203             IWorldFileSettings setting = null;
204             IEnvelope envelope2 = pGeo.Envelope;
205             string str = ExpPath.Substring(ExpPath.Length - 3, 3).ToUpper();
206             switch (str)
207             {
208                 case "JPG":
209                     setting = new ExportJPEGClass();
210                     export = new ExportJPEGClass();
211                     setting = export as IWorldFileSettings;
212                     setting.MapExtent = envelope2;
213                     setting.OutputWorldFile = false;
214                     break;
215                 case "BMP":
216                     setting = new ExportBMPClass();
217                     export = new ExportBMPClass();
218                     setting = export as IWorldFileSettings;
219                     setting.MapExtent = envelope2;
220                     setting.OutputWorldFile = false;
221                     break;
222                 case "TIF":
223                     setting = new ExportTIFFClass();
224                     export = new ExportTIFFClass();
225                     setting = export as IWorldFileSettings;
226                     setting.MapExtent = envelope2;
227                     setting.OutputWorldFile = false;
228                     break;
229                 case "PNG":
230                     setting = new ExportPNGClass();
231                     export = new ExportPNGClass();
232                     setting = export as IWorldFileSettings;
233                     setting.MapExtent = envelope2;
234                     setting.OutputWorldFile = false;
235                     break;
236                 default: break;
237             }
238             if (setting == null)
239             {
240                 export.ExportFileName = ExpPath;
241                 int num = (int)Math.Round(view.ScreenDisplay.DisplayTransformation.Resolution);
242                 tagRECT grect2 = new tagRECT();//实例化矩形
243                 IEnvelope envelop3 = new EnvelopeClass();
244                 view.ScreenDisplay.DisplayTransformation.TransformRect(envelope2, ref grect2, 9);
245                 grect2.left = 0;
246                 grect2.top = 0;
247                 grect2.right = (int)Math.Round((double)(grect2.right - grect2.left) * (((double)OutputResolution) / ((double)num)));
248                 grect2.bottom = (int)Math.Round((double)((grect2.bottom - grect2.top) * (((double)OutputResolution) / ((double)num))));
249                 envelop3.PutCoords((double)grect2.left, (double)grect2.top, (double)grect2.right, (double)grect2.bottom);
250                 export.PixelBounds = envelop3;
251                 view.GraphicsContainer.DeleteAllElements();
252                 view.Output(export.StartExporting(), OutputResolution, ref grect2, envelope2, null);
253                 export.FinishExporting();
254                 export.Cleanup();
255                 AddElement(pGeo, view);
256             }
257
258         }
259         #endregion
260     }

2.添加输出设置窗体,分别有,输出图片的高、宽、分辨率、输出保存路径、导出按钮。

具体的设置代码如下:

  1 public partial class ExportMapForm : DevExpress.XtraEditors.XtraForm
  2     {
  3         //定义全局变量
  4         private string pSavePath = "";
  5         private IActiveView pActiveView;
  6         private IGeometry pGeometry = null;
  7         #region 只读属性,地图导出空间图形
  8         public IGeometry GetGeometry
  9         {
 10             set { pGeometry = value; }
 11         }
 12         private bool bRegion = true;
 13         #endregion
 14         /// <summary>
 15         /// 只读属性,是全域导出还是区域导出
 16         /// </summary>
 17         public bool IsRegion
 18         {
 19             set { bRegion = value; }
 20         }
 21
 22         //获取主窗口的MapControl控件
 23         public ExportMapForm(AxMapControl mainAxMapControl)
 24         {
 25             InitializeComponent();
 26
 27             pActiveView = mainAxMapControl.ActiveView;
 28
 29         }
 30
 31         private void ExportMapForm_Load(object sender, EventArgs e)
 32         {
 33
 34         }
 35         #region 输入窗口的大小
 36         private void InitFormSize()
 37         {
 38             cboResoultion.Text = pActiveView.ScreenDisplay.DisplayTransformation.Resolution.ToString();
 39             cboResoultion.Items.Add(cboResoultion.Text);
 40             if (bRegion)
 41             {
 42                 IEnvelope pEnvelop = pGeometry.Envelope;
 43                 tagRECT pRECT = new tagRECT();
 44                 pActiveView.ScreenDisplay.DisplayTransformation.TransformRect(pEnvelop, ref pRECT,15);
 45                 if (cboResoultion.Text != "")
 46                 {
 47                     txtWidth.Text = pRECT.right.ToString();
 48                     txtHeight.Text = pRECT.bottom.ToString();
 49                 }
 50             }
 51             else
 52             {
 53                 if (cboResoultion.Text != "")
 54                 {
 55                     txtWidth.Text = pActiveView.ExportFrame.right.ToString();
 56                     txtHeight.Text = pActiveView.ExportFrame.bottom.ToString();
 57                 }
 58             }
 59         }
 60         #endregion
 61         #region combox的ChangeIndex事件
 62         private void cboResoultion_SelectedIndexChanged(object sender, EventArgs e)
 63         {
 64             double num = (int)Math.Round(pActiveView.ScreenDisplay.DisplayTransformation.Resolution);
 65             if (cboResoultion.Text == "")
 66             {
 67                 txtWidth.Text = "";
 68                 txtHeight.Text = "";
 69                 return;
 70             }
 71             if (bRegion)
 72             {
 73                 IEnvelope pEnvelop = pGeometry.Envelope;
 74                 tagRECT pRECT = new tagRECT();
 75                 pActiveView.ScreenDisplay.DisplayTransformation.TransformRect(pEnvelop, ref pRECT,15);
 76                 if (cboResoultion.Text != "")
 77                 {
 78                     txtWidth.Text = Math.Round((double)(pRECT.right * (double.Parse(cboResoultion.Text) / (double)num))).ToString();
 79                 }
 80             }
 81             else
 82             {
 83                 txtWidth.Text = Math.Round((double)(pActiveView.ExportFrame.right * (double.Parse(cboResoultion.Text) / (double)num))).ToString();
 84                 txtHeight.Text = Math.Round((double)(pActiveView.ExportFrame.bottom * (double.Parse(cboResoultion.Text) / (double)num))).ToString();
 85             }
 86         }
 87         #endregion
 88         #region 保存按钮的单击事件
 89         private void btnExPath_Click(object sender, EventArgs e)
 90         {
 91             SaveFileDialog sfdExportMap = new SaveFileDialog();
 92             sfdExportMap.DefaultExt = "jpg|bmp|gif|tif|png|pdf";
 93             sfdExportMap.Filter = "JPGE 文件(*.jpg)|*.jpg|BMP 文件(*.bmp)|*.bmp|GIF 文件(*.gif)|*.gif|TIF 文件(*.tif)|*.tif|PNG 文件(*.png)|*.png|PDF 文件(*.pdf)|*.pdf";
 94             sfdExportMap.OverwritePrompt = true;//重复写入时提示错误
 95             sfdExportMap.Title = "保存为";
 96             txtExPath.Text = "";
 97             if (sfdExportMap.ShowDialog() != DialogResult.Cancel)
 98             {
 99                 pSavePath = sfdExportMap.FileName;
100                 txtExPath.Text = sfdExportMap.FileName;
101             }
102         }
103         #endregion
104         #region 导出按钮单击事件
105         private void btnExPort_Click(object sender, EventArgs e)
106         {
107             if (txtExPath.Text == "")
108             {
109                 MessageBox.Show("请先确定导出路径!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
110                 return;
111             }
112             else if (cboResoultion.Text == "")
113             {
114                 if (txtExPath.Text == "")
115                 {
116                     MessageBox.Show("请输入分辨率!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
117                     return;
118                 }
119             }
120             else if (Convert.ToInt16(cboResoultion.Text) == 0)
121             {
122                 MessageBox.Show("请正确输入分辨率!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
123                 return;
124             }
125             else
126             {
127                 try
128                 {
129                     int resoultion = int.Parse(cboResoultion.Text);//输出图片的分辨率
130                     int width = int.Parse(cboResoultion.Text);//输出图片的宽度
131                     int height = int.Parse(cboResoultion.Text);//输出图片的高度
132                     ExportMap.ExportView(pActiveView, pGeometry, resoultion, width, height, pSavePath, bRegion);
133                     pActiveView.GraphicsContainer.DeleteAllElements();
134                     pActiveView.Refresh();
135                     MessageBox.Show("导出成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
136                 }
137                 catch (Exception)
138                 {
139                     MessageBox.Show("导出失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
140                 }
141             }
142         }
143         #endregion
144         #region 取消按钮的单击事件
145         private void btnCancel_Click(object sender, EventArgs e)
146         {
147             //局部导出时没有导出图像就退出
148             pActiveView.GraphicsContainer.DeleteAllElements();
149             pActiveView.Refresh();
150             Dispose();
151         }
152         #endregion
153         #region 图片导出窗口Close事件
154         private void ExportMapForm_FormClosed(object sender, FormClosedEventArgs e)
155         {
156             //局部导出时没有导出图像就关闭
157             pActiveView.GraphicsContainer.DeleteAllElements();
158             pActiveView.Refresh();
159             Dispose();
160
161         }
162         #endregion

3.在main窗体中进行实例化输出窗体:private ExportMapForm frmExpMap = null;

4.在MainMap Control_OnMouseDown中进行写入case:(只适合区域导出,单击选择边框)

 1 #region 地图的区域导出
 2                     case "ExportRegion":
 3                         //删除视图中的数据
 4                         mainMapControl.ActiveView.GraphicsContainer.DeleteAllElements();
 5                         mainMapControl.ActiveView.Refresh();
 6                         IPolygon pPolygon = DrawPolygon(mainMapControl);
 7                         if (pPolygon == null) return;
 8                         ExportMap.AddElement(pPolygon, mainMapControl.ActiveView);
 9                         if (frmExpMap == null || frmExpMap.IsDisposed)
10                         {
11                             frmExpMap = new ExportMapForm(mainMapControl);
12                         }
13                         frmExpMap.IsRegion = true;
14                         frmExpMap.GetGeometry = pPolygon as IGeometry;
15                         frmExpMap.Show();
16                         frmExpMap.Activate();
17                         break;
18                     #endregion

5.全域导出和区域导出按钮的单击事件代码:

 1       #region 地图导出之全域导出
 2         private void btnExportMap_ItemClick(object sender, ItemClickEventArgs e)
 3         {
 4             if (frmExpMap == null || frmExpMap.IsDisposed)
 5             {
 6                 frmExpMap = new ExportMapForm(mainMapControl);
 7             }
 8             frmExpMap.IsRegion = false;
 9             frmExpMap.GetGeometry = mainMapControl.ActiveView.Extent;
10             frmExpMap.Show();
11             frmExpMap.Activate();
12         }
13         #endregion
14         #region 地图导出之区域导出
15         private void btnExportRegionMap_ItemClick(object sender, ItemClickEventArgs e)
16         {
17             mainMapControl.CurrentTool = null;
18             mainMapControl.MousePointer = esriControlsMousePointer.esriPointerCrosshair;
19             pMouseOperate = "ExportRegion";
20         }
21         #endregion
时间: 2024-10-26 21:07:47

ArcGIS Engine开发之地图导出的相关文章

ArcGIS Engine开发之地图基本操作(4)

ArcGIS Engine开发中数据库的加载 1.加载个人地理数据库数据 个人地理数据库(Personal Geodatabase)使用Miscrosoft Access文件(*.mdb)进行空间数据的存储和管理,它将不同的数据统一纳入Access文件中,便于数据的管理与迁移,容量限制为2GB.个人地理数据库支持单用户编辑,不支持版本管理.在进行ArcGIS软件操作和开发的学习过程中,一般建议采用个人地理数据库进行数据的 组织和存储,同时也便于直接导到ArcSDE空间数据库中.加载个人地理数据库

ArcGIS Engine开发之地图基本操作(2)

地图数据的加载 1.加载地图文档 ArcGIS Engine支持加载多种类型的数据,有矢量数据的Coverage.Shapefile.dwg/dxf文件,栅格数据的BMP.GRID.控件数据库等.很多情况下加载通过ArcGIS桌面制作的地图文档是最合适的(*.mxd格式). 加载地图的第三种方式: 使用IMAPControl接口的LoadMxfile方法加载. 通过IMAPDocument接口加载. 使用ArcGIS Engine中封装好的类库资源ControlsOpenDocCommandCl

ArcGIS Engine开发之地图浏览

地图的浏览功能包括缩放.移动.量测旋转等. 1.放大与缩小 无论是放大还是缩小,都是通过改变MapControl中当前视图的范围Extent属性来实现的,主要用到包络线(Envelope)类. 包络线是一个矩形区域,它是一个几何形体的最小包络边框,每一个Geometry对象都拥有一个包络线对象.包络线通过它的最大与最小X,Y坐标来定义一个矩形形状,因此包络线对象相对于它的空间参考而言总是直角.IEnvelop接口是Expand方法的用于缩放包络线的范围,进而产生一个新的包络线对象,从而实现放大和

ArcGIS Engine开发之地图基本操作(3)

地图数据的加载 一.加载Shapefile数据 Shapefile文件是目前主流的一种空间数据的文件存储方式,也是不同GIS软件进行数据格式转换常用的中间格式.加载Shapefile数据的方式有两种:①通过工作空间加载.②通过MapControl控件的AddShapefile方法加载. 1.通过工作空间加载Shapefile文件 通过工作空间加载Shapefile文件主要用到IMap.ILayer.IFeatureLayer和IFeatureClass四个接口. 1)IMap接口 IMap接口是

ArcGIS Engine开发前基础知识(2)

ArcGIS基本控件简介 ArcGIS Engine控件是一组可视化的开发组件,每个ArcGIS Engine控件都是一个COM组件.这些组件包括MapControl,PageLayoutControl,TOCControl.ToolbarControl,GlobeControl,和SceneControl等 MapControl控件 MapControl控件对应于ARCMap中的数据视图,主要用于显示.操作和分析地理数据.它封装了Map对象,可以加载已有的地图文档(*mxd文档)或者直接添加矢

ArcGIS Engine开发的ArcGIS 版本管理的功能

原文:ArcGIS Engine开发的ArcGIS 版本管理的功能 转自:http://blog.csdn.net/linghe301/article/details/7965901 这是以前的ArcGIS Engine开发成果,主要是Geodatabase方面的,模仿ArcGIS版本的流程系统环境: VS2010.ArcGIS Engine10.DevExpress721(第三方控件,比较常用易于下载) ---------------------------------------------

ArcGIS Engine 开发(二)线、圆、矩形、面、文本编辑功能

ArcGIS Engine 开发(二)线.圆.矩形.面.文本编辑功能,这些都是实现课上的源代码,自己调试好了,直接可以放到vs2010下跑,希望能对大家有所帮助 好了,先来看效果 二.下面是调试好的代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using Syste

ArcGIS Engine开发鹰眼图的功能(代码优化篇)

在上一篇,ArcGIS Engine开发鹰眼图的功能(基础篇) 上一篇的实现效果图如下, 如果仔细观察,会发现一个问题,即在“鹰眼”的区域,只要在红色线框内的注记会被覆盖. 如果红色框包括整张图的话,图上的注记都将不会显示. 是什么原因造成的呢? 原因是使用IFillShapeElement向鹰眼视图添加绘图框后,标注与绘图框冲突造成互相压盖. 我们来看一张表, 在基础篇中,我们使用的是IFillShapeElement面要素进行刷新的,现在我们改换为线要素的IScreenDisplay Dra

ArcGIS Engine开发前基础知识(1)

ArcGIS二次开发是当前gis领域的一项重要必不可少的技能.下面介绍它的基本功能 一.ArcGIS Engine功能 在使用之前首先安装和部署arcgis sdk,(在这里不在赘述相关知识)可以实现的功能主要有地图的基本操作.信息查询.专题地图制作.数据编辑.网络分析.空间统计分析.三维分析等. 1.地图的基本操作 地图的基本操作主要包括加载矢量.栅格数据,浏览缩放地图,保存地图,在地图上显示文本注记,绘制点线面几何体等. 2.信息查询 信息查询主要通过矩形圆形或多边形来选中地图上的要素,或者