论文部分内容阅读
摘要: 本文叙述了土地整治项目MAPGIS直方图自动生成的重要性;讨论了土地整治项目的内蕴;系统了分析了编程组件与直方图的SIFT算法;细致论述了程序的总体流程图;笔者结合多年的基层实践经验,详细阐述了程序实现的具体过程与实现代码;希望能给广大从事土地整治项目的同僚们起到抛砖引玉的作用。
关键词:MapGIS类库,SIFT算法,土地整治,直方图
中图分类号:D651文献标识码: A
土地整治规划作为土地利用总体规划的专项规划,是细化落实土地利用总体规划,明确土地整治目标和任务的具体措施。它有利于整合资源、引导资金、整体推进土地整治、有效补充耕地、提高耕地质量、建设高标准基本农田;有利于有序推进农村建设用地整治,改善农民居住条件和农村环境,完善农村基础设施,推动农业现代化和新农村建设,促进城乡统筹发展和土地资源可持续利用。
实施土地整治项目前一般先要做好项目规划设计工作。土地整治的规划设计涉及的内容比较广,不仅需要强大的矢量化和绘图功能,还需要涉及土地利用的各种属性数据的统计功能。为了更直观的表达图形数据的内容,上报的成果中往往还需要根据图形属性生成直方图。传统的生成直方图方法主要通过SuperMap、MapGIS或ArcGIS等软件进行操作。这种方法不仅常常需频繁进行不同数据格式之间的转换工作,大大增加了土地整治规划的工作量,降低了土地整治规划的效率,而且不能满足实际生产中的特殊要求。
为了克服这些不足,本文设计应用VC++结合MapGIS类库对MapGIS进行二次开发,并最终在MapGIS中实现了根据图形属性批量自动生成直方图功能。
1 土地整治
土地整治系指对低效利用、不合理利用、未利用以及生产建设活动和自然灾害损毁的土地进行整治,提高土地利用效率的活动。土地整治是盘活存量土地、强化节约集约用地、适时补充耕地和提升土地产能的重要手段。在我国将土地整治与农村发展,特别是与新农村建设相结合,是保障发展、保护耕地、统筹城乡土地配置的重大战略。土地整治规划编制的主要任务如下:
(1)、全面评价上一轮规划及相关工作情况。全面总结、客观评价上一轮土地整治规划实施和城乡建设用地挂钩试点工作情况,认真研究成功经验和存在的问题,提出有序推进的意见和措施。
(2)、深入分析土地整治潜力。充分利用第二次全国土地调查和国土资源大调查成果,全面分析测算土地整治潜力,包括土地整治补充耕地的规模、质量、条件和空间分布,农村建设用地整治及其节约土地的规模和范围等。
(3)、开展土地整治重大问题专题研究。围绕中央对土地整治工作提出的新要求和规划目标,结合地方实际,组织开展土地整治目标任务、土地整治潜力、土地整治与农业发展、土地整治与生态环境保护、土地整治重点工程布局与安排等重大问题专题研究。
(4)、确定土地整治重点布局安排。以土地整治潜力为基础,围绕粮食产能核心区和战略后备区建设、基本农田集中区建设、城乡经济社会一体化发展示范区建设,科学划定土地整治重点区域,确定土地整治重点区域、工程和项目,提出实施计划和资金使用安排方案。
(5)、推进土地整治规划信息化建设。按照“一张图”综合监管平台建设的总体部署,充分运用信息技术与二调成果,与同级土地利用总体规划数据库建设相衔接,推进土地整治规划数据库的建设,实现规划成果叠加上图、动态更新。
2 编程组件及SIFT算法
2.1 VC++
Microsoft Visual C++是Microsoft公司推出的开发Win32环境程序,面向对象的可视化集成编程系统。它不但具有程序框架自动生成、灵活方便的类管理、代码编写和界面设计集成交互操作、可开发多种程序等优点,而且通过简单的设置就可使其生成的程序框架支持数据库接口、OLE2,WinSock网络、3D控制界面。
它以拥有“语法高亮”,IntelliSense(自動完成功能)以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及建置系统以预编译头文件、最小重建功能及累加连结著称。这些特征明显缩短程式编辑、编译及连结花费的时间,在大型软件计划上尤其显著
2.2 MAPGIS开发类库
中地数码依托MapGIS新一代空间信息软件,形成了 “MapGIS开发平台、工具产品和解决方案”于一体的产品体系,让GIS软件生产可以像传统的工业生产那样,利用标准的零部件实现GIS软件的高效率、高质量。其产品在国土、城市管理、水务、燃气、三维地质、公安、气象、房产、测绘、电信、农业、林业、军事、水利、地震和地质灾害等领域都有广泛的应用,并且覆盖了全国65%以上的数字国土、数字地矿地质,累计完成近1500个GIS项目,MapGIS用户全国累计达10万多户。
MAPGIS二次开发函数采用匈牙利命名法,即动宾结构命名法,并且所有函数都以下横线开始,以便和Windows函数以及其他语言函数明显区别开来,如_GetLin表示取线实体;在Visual Basic环境下,由于Visual Basic语言不能识别以下横线开始的函数名,所以库函数都以字母b开始,如bGetLin表示取线实体。上述动态函数库提供了从最基本数据单元的读取、保存、更新和维护到MAPGIS地图库的建立和漫游,以及空间分析,图象处理等一系列功能,MAPGIS应用程序可以根据需要在任何层次上进行开发[1]。
除了上述 API函数外,MAPGIS还为基于VC++的开发者提供多个可重用基类,将应用程序所需的常见基本功能作了封装,使用便利,改动灵活。MAPGIS正在向类库组件化迈进,已推出一系列类库及组件,这将使得二次开发更为快捷便利。但与此同时MAPGIS仍将不断完善其API函数库,以多种开发手段满足不同层次、不同应用的需求。
2.3 SIFT算法
SIFT算法是一种提取局部特征的算法,其基本原理是在各个不同尺度的特征点比较中得到极值点,形成局部特征描述子,然后通过特征点的两两比较找出相互匹配的若干对特征点,从而建立不同图像的对应关系[2]。
实现SIFT算法的关键在于特征点检测,生成图像特征点描述。具体来说,主要包括:尺度空间极值检测、关键点的定位、关键点方向分配、关键点描述。
(1)尺度空间极值检测
高斯核是唯一可以产生多尺度空间的核。一个图像的尺度空间L(x,y,σ)定义为原始图像I(x,y)与一个可变尺度的2维高斯函数G(x,y,σ) 卷积运算。其公式如下:
G(x,y,σ)=12πσ2 e-(x2+y2)/2σ2
相邻尺度的 2 个高斯图像相减得到高斯差分多尺度空间D ( x , y , σ)。 D ( x , y , σ)可表示为:
D(x,y,σ)=(G(x,y,kσ)-G(x,y,σ))*I(x,y)=L(x,y,kσ)-L(x,y,σ)
(2)关键点的定位
由于DoG值对噪声和边缘较敏感,所以对局部极值点还要经过进一步的检验,需要对尺度空间DoG函数进行曲线拟合。利用DoG函数在尺度空间的Taylor展开,求导得到修正值X∧=-(2DX2)-1DX,并代入D(X∧)=D+12 DTX,获取极值点。不断修正X∧,当D(X∧)<0.03时[2]为不稳定极值点,应去除[3]。
(3)关键点方向分配
关键点方向分配的目的是利用关键点邻域像素的梯度方向分布特性,为每个关键点指定方向,保证描述子对图像旋转具有不变性。
(4)关键点描述
关键点描述的意图在于完成关键点梯度值和方向计算后,用一组向量描述此关键点,并将其作为目标匹配的依据,使关键点具有不变特性。
3总体流程图
土地整治项目MAPGIS直方图的自动生成总体流程图如图1所示:
图1 土地整治项目MAPGIS直方图的自动生成总体流程图
4 程序模块
程序分SIFT 算法调整、属性数据读取、数据结构重构与直方图生成等4大模块。
4.1 SIFT算法调整模块
SIFT算法调整模块主要是为了便于生成土地整治专用直方图而调整过的高效算法,有利于提高整个程序的运行效率。该模块部分典型代码如下:
void AUTOtiaohui::DoDataExchange(CDataExchange* pDX)
{ CDialog::DoDataExchange(pDX);
{{AFX_DATA_MAP(AUTOtiaohui)
DDX_Control(pDX, IDC_FILELIST, m_filelist);
}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(AUTOtiaohui, CDialog)
{{AFX_MSG_MAP(AUTOtiaohui)
ON_BN_CLICKED(IDC_ADD, OnAdd)
ON_BN_CLICKED(IDC_FIND, OnFind)
}}AFX_MSG_MAP
END_MESSAGE_MAP()
4.2属性数据读取模块
属性数据读取模块主要是为了实现MapGIS图形数据属性的读取,该模块部分典型代码如下:
void changeLinParmByAtt::changeLinParm()
{ short QTZJAi = _OpenFileArea(aHinst,tmp);
_GetAttStru(QTZJAi,LIN,&stru);
expStr[0]=0;
if(!_InputExpresion(m_hWnd,stru,expStr,100,"输入检索条件",NULL))return ;
_SetChangeFlag(QTZJAi,0);
_CloseArea(QTZJAi);
_FreePntSelLst(QTZJAi);
_FreeWorkArea(aHinst);
for(i = 0; i < m_filelist.GetCount(); i++)
{ m_filelist.GetText(i,tmp);
changeLinParm00(tmp,expStr);
}}
4.3 數据结构重构模块
数据结构重构模块部分代码如下:
for(i=1;i<=list[0];i++)
{ _GoingClockCursor();
if(_GetLin(QTZJAi,list[i],&xyz,&len,&QTZJinf)<=0) continue;
if(str2=="线型")
{ QTZJinf.ltp=fw;
_UpdateLinInfo(QTZJAi,list[i],&QTZJinf);
}}
4.4 直方图生成模块
直方图生成模块的部分代码如下:
repeatinf.fclr =0;
repeatinf.layer =31;
if(lxy[labs(linTop.stNod)].x!=lxy[1].x) {
if(_GetNodPos(DLTBAi,linTop.stNod,lxy1)<=0)continue;
if((lxy1[0].x!=lxy[0].x) && (lxy1[0].y!=lxy[0].y))
repeatinf.fltp =2; }
_AppendLin(outqtxTHXAi,lxy,len,&repeatinf);
QTZJinf.ltp =1;
QTZJinf.lclr =1;
QTZJinf.lw =0.12; _UpdateLinInfo(DLTBAi,labs(rData[ii]),&QTZJinf);
_AppendLin(outdljxTHXAi,lxy,len,&QTZJinf);
5 小 结
本文利用了MapGIS软件二次开发类库结合VC++实现了土地整治项目MAPGIS直方图的自动生成。实践表明,土地整治项目MAPGIS直方图的自动生成程序减化了图件的生产过程,提高了生产效率,减少了生产成本,程序图面美观,应用方便直观,在现阶段具有一定的理论与实际意义。
参考文献
[1] 中地软件丛书编委会.MapGIS二次开发培训教程(c++版)[M].武汉:中地公司,2001.
MSI影像
[2] 王蓉,孙玉秋.基于直方图处理的局部图像增强算法研究[J].长江大学学报自然科学版,2013,2(1):123-125.
[3] 赵文哲,秦世引. 基于感兴趣点特征的彩色图像目标分类与识别[J]. 系统工程与电子技术,2011, 33(2): 438-442.
关键词:MapGIS类库,SIFT算法,土地整治,直方图
中图分类号:D651文献标识码: A
土地整治规划作为土地利用总体规划的专项规划,是细化落实土地利用总体规划,明确土地整治目标和任务的具体措施。它有利于整合资源、引导资金、整体推进土地整治、有效补充耕地、提高耕地质量、建设高标准基本农田;有利于有序推进农村建设用地整治,改善农民居住条件和农村环境,完善农村基础设施,推动农业现代化和新农村建设,促进城乡统筹发展和土地资源可持续利用。
实施土地整治项目前一般先要做好项目规划设计工作。土地整治的规划设计涉及的内容比较广,不仅需要强大的矢量化和绘图功能,还需要涉及土地利用的各种属性数据的统计功能。为了更直观的表达图形数据的内容,上报的成果中往往还需要根据图形属性生成直方图。传统的生成直方图方法主要通过SuperMap、MapGIS或ArcGIS等软件进行操作。这种方法不仅常常需频繁进行不同数据格式之间的转换工作,大大增加了土地整治规划的工作量,降低了土地整治规划的效率,而且不能满足实际生产中的特殊要求。
为了克服这些不足,本文设计应用VC++结合MapGIS类库对MapGIS进行二次开发,并最终在MapGIS中实现了根据图形属性批量自动生成直方图功能。
1 土地整治
土地整治系指对低效利用、不合理利用、未利用以及生产建设活动和自然灾害损毁的土地进行整治,提高土地利用效率的活动。土地整治是盘活存量土地、强化节约集约用地、适时补充耕地和提升土地产能的重要手段。在我国将土地整治与农村发展,特别是与新农村建设相结合,是保障发展、保护耕地、统筹城乡土地配置的重大战略。土地整治规划编制的主要任务如下:
(1)、全面评价上一轮规划及相关工作情况。全面总结、客观评价上一轮土地整治规划实施和城乡建设用地挂钩试点工作情况,认真研究成功经验和存在的问题,提出有序推进的意见和措施。
(2)、深入分析土地整治潜力。充分利用第二次全国土地调查和国土资源大调查成果,全面分析测算土地整治潜力,包括土地整治补充耕地的规模、质量、条件和空间分布,农村建设用地整治及其节约土地的规模和范围等。
(3)、开展土地整治重大问题专题研究。围绕中央对土地整治工作提出的新要求和规划目标,结合地方实际,组织开展土地整治目标任务、土地整治潜力、土地整治与农业发展、土地整治与生态环境保护、土地整治重点工程布局与安排等重大问题专题研究。
(4)、确定土地整治重点布局安排。以土地整治潜力为基础,围绕粮食产能核心区和战略后备区建设、基本农田集中区建设、城乡经济社会一体化发展示范区建设,科学划定土地整治重点区域,确定土地整治重点区域、工程和项目,提出实施计划和资金使用安排方案。
(5)、推进土地整治规划信息化建设。按照“一张图”综合监管平台建设的总体部署,充分运用信息技术与二调成果,与同级土地利用总体规划数据库建设相衔接,推进土地整治规划数据库的建设,实现规划成果叠加上图、动态更新。
2 编程组件及SIFT算法
2.1 VC++
Microsoft Visual C++是Microsoft公司推出的开发Win32环境程序,面向对象的可视化集成编程系统。它不但具有程序框架自动生成、灵活方便的类管理、代码编写和界面设计集成交互操作、可开发多种程序等优点,而且通过简单的设置就可使其生成的程序框架支持数据库接口、OLE2,WinSock网络、3D控制界面。
它以拥有“语法高亮”,IntelliSense(自動完成功能)以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及建置系统以预编译头文件、最小重建功能及累加连结著称。这些特征明显缩短程式编辑、编译及连结花费的时间,在大型软件计划上尤其显著
2.2 MAPGIS开发类库
中地数码依托MapGIS新一代空间信息软件,形成了 “MapGIS开发平台、工具产品和解决方案”于一体的产品体系,让GIS软件生产可以像传统的工业生产那样,利用标准的零部件实现GIS软件的高效率、高质量。其产品在国土、城市管理、水务、燃气、三维地质、公安、气象、房产、测绘、电信、农业、林业、军事、水利、地震和地质灾害等领域都有广泛的应用,并且覆盖了全国65%以上的数字国土、数字地矿地质,累计完成近1500个GIS项目,MapGIS用户全国累计达10万多户。
MAPGIS二次开发函数采用匈牙利命名法,即动宾结构命名法,并且所有函数都以下横线开始,以便和Windows函数以及其他语言函数明显区别开来,如_GetLin表示取线实体;在Visual Basic环境下,由于Visual Basic语言不能识别以下横线开始的函数名,所以库函数都以字母b开始,如bGetLin表示取线实体。上述动态函数库提供了从最基本数据单元的读取、保存、更新和维护到MAPGIS地图库的建立和漫游,以及空间分析,图象处理等一系列功能,MAPGIS应用程序可以根据需要在任何层次上进行开发[1]。
除了上述 API函数外,MAPGIS还为基于VC++的开发者提供多个可重用基类,将应用程序所需的常见基本功能作了封装,使用便利,改动灵活。MAPGIS正在向类库组件化迈进,已推出一系列类库及组件,这将使得二次开发更为快捷便利。但与此同时MAPGIS仍将不断完善其API函数库,以多种开发手段满足不同层次、不同应用的需求。
2.3 SIFT算法
SIFT算法是一种提取局部特征的算法,其基本原理是在各个不同尺度的特征点比较中得到极值点,形成局部特征描述子,然后通过特征点的两两比较找出相互匹配的若干对特征点,从而建立不同图像的对应关系[2]。
实现SIFT算法的关键在于特征点检测,生成图像特征点描述。具体来说,主要包括:尺度空间极值检测、关键点的定位、关键点方向分配、关键点描述。
(1)尺度空间极值检测
高斯核是唯一可以产生多尺度空间的核。一个图像的尺度空间L(x,y,σ)定义为原始图像I(x,y)与一个可变尺度的2维高斯函数G(x,y,σ) 卷积运算。其公式如下:
G(x,y,σ)=12πσ2 e-(x2+y2)/2σ2
相邻尺度的 2 个高斯图像相减得到高斯差分多尺度空间D ( x , y , σ)。 D ( x , y , σ)可表示为:
D(x,y,σ)=(G(x,y,kσ)-G(x,y,σ))*I(x,y)=L(x,y,kσ)-L(x,y,σ)
(2)关键点的定位
由于DoG值对噪声和边缘较敏感,所以对局部极值点还要经过进一步的检验,需要对尺度空间DoG函数进行曲线拟合。利用DoG函数在尺度空间的Taylor展开,求导得到修正值X∧=-(2DX2)-1DX,并代入D(X∧)=D+12 DTX,获取极值点。不断修正X∧,当D(X∧)<0.03时[2]为不稳定极值点,应去除[3]。
(3)关键点方向分配
关键点方向分配的目的是利用关键点邻域像素的梯度方向分布特性,为每个关键点指定方向,保证描述子对图像旋转具有不变性。
(4)关键点描述
关键点描述的意图在于完成关键点梯度值和方向计算后,用一组向量描述此关键点,并将其作为目标匹配的依据,使关键点具有不变特性。
3总体流程图
土地整治项目MAPGIS直方图的自动生成总体流程图如图1所示:
图1 土地整治项目MAPGIS直方图的自动生成总体流程图
4 程序模块
程序分SIFT 算法调整、属性数据读取、数据结构重构与直方图生成等4大模块。
4.1 SIFT算法调整模块
SIFT算法调整模块主要是为了便于生成土地整治专用直方图而调整过的高效算法,有利于提高整个程序的运行效率。该模块部分典型代码如下:
void AUTOtiaohui::DoDataExchange(CDataExchange* pDX)
{ CDialog::DoDataExchange(pDX);
{{AFX_DATA_MAP(AUTOtiaohui)
DDX_Control(pDX, IDC_FILELIST, m_filelist);
}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(AUTOtiaohui, CDialog)
{{AFX_MSG_MAP(AUTOtiaohui)
ON_BN_CLICKED(IDC_ADD, OnAdd)
ON_BN_CLICKED(IDC_FIND, OnFind)
}}AFX_MSG_MAP
END_MESSAGE_MAP()
4.2属性数据读取模块
属性数据读取模块主要是为了实现MapGIS图形数据属性的读取,该模块部分典型代码如下:
void changeLinParmByAtt::changeLinParm()
{ short QTZJAi = _OpenFileArea(aHinst,tmp);
_GetAttStru(QTZJAi,LIN,&stru);
expStr[0]=0;
if(!_InputExpresion(m_hWnd,stru,expStr,100,"输入检索条件",NULL))return ;
_SetChangeFlag(QTZJAi,0);
_CloseArea(QTZJAi);
_FreePntSelLst(QTZJAi);
_FreeWorkArea(aHinst);
for(i = 0; i < m_filelist.GetCount(); i++)
{ m_filelist.GetText(i,tmp);
changeLinParm00(tmp,expStr);
}}
4.3 數据结构重构模块
数据结构重构模块部分代码如下:
for(i=1;i<=list[0];i++)
{ _GoingClockCursor();
if(_GetLin(QTZJAi,list[i],&xyz,&len,&QTZJinf)<=0) continue;
if(str2=="线型")
{ QTZJinf.ltp=fw;
_UpdateLinInfo(QTZJAi,list[i],&QTZJinf);
}}
4.4 直方图生成模块
直方图生成模块的部分代码如下:
repeatinf.fclr =0;
repeatinf.layer =31;
if(lxy[labs(linTop.stNod)].x!=lxy[1].x) {
if(_GetNodPos(DLTBAi,linTop.stNod,lxy1)<=0)continue;
if((lxy1[0].x!=lxy[0].x) && (lxy1[0].y!=lxy[0].y))
repeatinf.fltp =2; }
_AppendLin(outqtxTHXAi,lxy,len,&repeatinf);
QTZJinf.ltp =1;
QTZJinf.lclr =1;
QTZJinf.lw =0.12; _UpdateLinInfo(DLTBAi,labs(rData[ii]),&QTZJinf);
_AppendLin(outdljxTHXAi,lxy,len,&QTZJinf);
5 小 结
本文利用了MapGIS软件二次开发类库结合VC++实现了土地整治项目MAPGIS直方图的自动生成。实践表明,土地整治项目MAPGIS直方图的自动生成程序减化了图件的生产过程,提高了生产效率,减少了生产成本,程序图面美观,应用方便直观,在现阶段具有一定的理论与实际意义。
参考文献
[1] 中地软件丛书编委会.MapGIS二次开发培训教程(c++版)[M].武汉:中地公司,2001.
MSI影像
[2] 王蓉,孙玉秋.基于直方图处理的局部图像增强算法研究[J].长江大学学报自然科学版,2013,2(1):123-125.
[3] 赵文哲,秦世引. 基于感兴趣点特征的彩色图像目标分类与识别[J]. 系统工程与电子技术,2011, 33(2): 438-442.