PIE属性表多字段的文本绘制
程序员文章站
2022-07-21 18:10:52
最近研究了PIE SDK文本元素的绘制相关内容,因为在我们的开发中,希望可以做到在打开一个Shp文件后,读取到属性表的所有字段,然后可以选择一些需要的字段,将这些字段的所有要素值的文本,绘制到shp图中相应的要素位置上。 我主要是通过PIE的官方博文(https://www.cnblogs.com/ ......
最近研究了pie sdk文本元素的绘制相关内容,因为在我们的开发中,希望可以做到在打开一个shp文件后,读取到属性表的所有字段,然后可以选择一些需要的字段,将这些字段的所有要素值的文本,绘制到shp图中相应的要素位置上。
我主要是通过pie的官方博文(https://www.cnblogs.com/piesat/p/10172166.html)进行学习的,并在技术员姐姐的帮助下,最后成功的将文本绘制于图上。
结果如下图所示:
先打开一张属性表字段不为空shp文件
读取shp的属性表中的所有字段,选取需要绘制在图上的字段
将所选的字段的值绘制到相应的要素的位置上
开发环境:vs2013 framework4
代码如下:
在子窗口的构造函数中,遍历当前shp文件属性表的所有字段,并设置默认好默认字体样式
1 #region 构造函数 2 public featuresshow(ifeaturedataset featuredataset) 3 { 4 initializecomponent(); 5 m_featuredataset = featuredataset; 6 ifeature feature = m_featuredataset.getnextfeature(); 7 for (int i = 1; i < feature.getfieldcount(); i++) 8 { 9 string fieldname = feature.getfieldname(i); 10 this.listbox1.items.add(fieldname); 11 } 12 //默认字体 13 fontdlg.font = new font("calibri", 15, fontstyle.bold); 14 fontdlg.color = color.chartreuse; 15 } 16 #endregion
点击了子窗体的确定后,返回得到已选择的字段名,和设置的字体样式,并在图上进行绘制
1 private void 文本绘制toolstripmenuitem_click(object sender, eventargs e) 2 { 3 if (mapcontrol1.activeview.currentlayer == null) 4 return; 5 ifeaturelayer featurelayer = mapcontrol1.activeview.currentlayer as ifeaturelayer; 6 if (featurelayer == null) 7 return; 8 9 //清除图上已绘制的元素 10 mapcontrol1.activeview.graphicscontainer.deleteallelements(); 11 //获得要读取的数据,传入子窗体 12 ifeaturedataset featuredataset = featurelayer.featureclass.getfeaturedataset(); 13 featuresshow frm = new featuresshow(featuredataset); 14 frm.showdialog(); //通过窗口来选择需要展示在图上的特征值 15 if (frm.dialogresult == dialogresult.ok) 16 { 17 //符号设置 18 fontdialog m_fontdlg = frm.m_fontdlg; 19 itextsymbol textsymbol = new textsymbol(); 20 textsymbol.color = m_fontdlg.color; 21 textsymbol.font = m_fontdlg.font; 22 textsymbol.size = m_fontdlg.font.size; 23 24 int m_featurecount = frm.m_featurecount; 25 string[] m_fieldname=frm.m_fieldname; 26 int[] index = new int[m_featurecount+1]; 27 ifields fields = featuredataset.getfields(); 28 index[0] = 0; 29 for (int i = 1; i < m_featurecount+1;i++ ) 30 { 31 index[i] = fields.getfieldindex(m_fieldname[i-1]); 32 } 33 ifeature feature = featuredataset.getfeature(0); 34 while (feature != null) 35 { 36 ////取左上角坐标值 37 ipolygon polygon = new pie.geometry.polygon(); 38 polygon = feature.geometry as ipolygon; 39 ipointcollection poly = polygon as ipointcollection; 40 ipoint point = poly.getpoint(0); 41 //创建文本元素实例对象 42 itextelement textelement = new pie.carto.textelement(); 43 textelement.geometry = point as igeometry; 44 textelement.symbol = textsymbol; 45 46 for(int i=1;i<m_featurecount+1;i++) 47 { 48 string strvalue = ""; 49 if (feature.isvaluenull(index[i]) == false) 50 { 51 strvalue = m_fieldname[i-1] + ":" + feature.getvalue(index[i]).tostring() + "\r\n"; 52 textelement.text = textelement.text+strvalue; 53 } 54 } 55 if(textelement.text!="") 56 { 57 string strid = fields.getfieldname(0) + ":" + feature.getvalue(index[0]).tostring() + "\r\n"; 58 textelement.text = strid + textelement.text; 59 mapcontrol1.activeview.graphicscontainer.addelement(textelement); 60 } 61 feature = featuredataset.getnextfeature(); 62 } 63 mapcontrol1.partialrefresh(viewdrawphasetype.viewall); 64 } 65 }
有帮助的话,记得点个赞支持一下哦~
也欢迎各位评论,指点,交流
下一篇: .net程序反编译工具(ILSpy)