【MapGIS二次开发】打造属于你自己的属性编辑器

  GIS工具最大的一个好处就是将图形信息和属性信息关联在一起了,工作区中的任意一个点、线、面图元都可以给它挂上相应的属性,进而可以描述出该图元的空间信息。MapGIS作为国内最大的GIS服务软件也有对应的属性编辑工具,但是就目前流行的MapGIS6.7来看,这属性编辑器是相当的简陋。

mapgis二次开发

  上图就是大家所熟悉的线属性编辑界面,默认情况下一次只能修改一个图元的属性参数,并且左侧字段名所代表的具体含义十分不明确,对于编图新手来说这是非常不直观的。但是你可以通过二次开发的方式自己完善这个属性编辑器,具体思路可以参考如下:

  首先我们要想好界面上应该有哪些选项,编辑功能是必不可少的,复制属性及粘贴属性功能也是不可或缺的,当然,一个界面中能同时显示点线面图元的属性那是最好的,这样便于批量修改属性,但是这样数据量大了查找某个属性有成了难题,我们还要增加查找属性的功能。这样大体的框架就形成了。Pavel所做的示例程序截图如下:

mapgis二次开发

  程序是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二次开发提供一些帮助和参考。