GIS工具最大的一个好处就是将图形信息和属性信息关联在一起了,工作区中的任意一个点、线、面图元都可以给它挂上相应的属性,进而可以描述出该图元的空间信息。MapGIS作为国内最大的GIS服务软件也有对应的属性编辑工具,但是就目前流行的MapGIS6.7来看,这属性编辑器是相当的简陋。
上图就是大家所熟悉的线属性编辑界面,默认情况下一次只能修改一个图元的属性参数,并且左侧字段名所代表的具体含义十分不明确,对于编图新手来说这是非常不直观的。但是你可以通过二次开发的方式自己完善这个属性编辑器,具体思路可以参考如下:
首先我们要想好界面上应该有哪些选项,编辑功能是必不可少的,复制属性及粘贴属性功能也是不可或缺的,当然,一个界面中能同时显示点线面图元的属性那是最好的,这样便于批量修改属性,但是这样数据量大了查找某个属性有成了难题,我们还要增加查找属性的功能。这样大体的框架就形成了。Pavel所做的示例程序截图如下:
程序是C++写的,其中列表显示是由开放类GridCtrl实现的,用它的好处是可以直接点击属性框进行编辑,如果嫌麻烦你也可以使用MFC自带的ListCtrl控件,就是要再加一个编辑按钮。
程序的思路已经有了,该轮到代码了,详细的代码太多了,只说一些关键的,以点图元为例,先获得点图元的结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | CATT_STRU *pnt_att=NULL; //存储点图元的结构信息 char fldBuf[256]=""; //存储字段值 char * atts=NULL; //这个参数我还真不知道是什么意思,但_GetAtt还必须用到,有知道的童鞋可以指点我一下~~ short sig=_GetAtt(areanum,PNT,pntnum,&att_str,&atts); //areanum为工作区号,pntnum为点图元号,你可以自己获得 int catt_num=(pnt_att->hd).numbfield; //获得该图元所包含的字段个数 if (sig>0) { for (int i=0;i<catt_num;i++) { CString szFieldName = (att_str ->fldEntry[i]).fieldname;//获得第i个字段名称 /* 这里你就可以将字段名称插入到列表中当表头了 */ _CvtFldToString(att_str,atts,i,fldBuf,att_str->fldEntry[i].msk_leng+1,NULL,NULL);//将mapgis加密的字段名转化为字符串 CString list_text;//将第i个字段值保存到list_text里边 list_text+=fldBuf; list_text.TrimRight(); list_text.TrimLeft(); /* 这里你就可以将字段值插入到表格中了 */ } } |
与此类似,你可以将线图元和面图元的属性信息添加到表格中去了。这只是显示功能,下边说一下编辑功能的实现,代码更简单,变量的声明和定义就不写了:
1 2 3 | _GetAtt(ai,PNT,elmi,&catt,&att); //还是先获得点图元的结构信息 _SetFldFromStr(att,catt,(LPTSTR)(LPCTSTR)fldname,(LPTSTR)(LPCTSTR)text);//将字段名为fldname的字段值设置为text _WriteAtt(ai,PNT,elmi,catt,att);//保存修改,这个函数非常必要,否则上一个函数的修改会不起作用 |
到这里一个完整的图元属性编辑模块基本上就完成了,你可以结合自己的需求添加其他的小功能,比如批改属性、复制、粘贴整行或整列等等。另外,关于将字段值从英文简称翻译成中文描述的实现也很简单,就是按照《地质矿产术语分类代码》(GB9649)进行翻译的,算是简单的字符串替换。是不是这样的属性编辑器要比MapGIS自带的强大很多呢?
限于项目保密要求,本实例的完整代码就不提供了,本文只是介绍一下思路,希望会对大家学习MapGIS二次开发提供一些帮助和参考。
这个挺个性
又 遇到高手了 学习!
评论框背景很搞笑,和谐 😆
@西门 嘘 大家心知肚明就好~~ 😆
表示看不懂的路过
@laofan 我也不会玩手术刀~~嘿嘿 ➡
看到全英文我就知道,我用不上了···
@箴言 呵呵 也就代码是英文的吧,中文介绍居多啊
自定义编辑器不错,回头试试
很实用的看着。不过我一般是用不上了,呵呵
@学夫子 你应该用matlab比较多吧~~