正文

元数据小悟2006-11-29 20:35:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/yuqiexing/19036.html

分享到:


所谓元数据,就是数据的数据.什么意思呢?元数据就是关于数据的描述信息.它的目的经科学界讨论,主要是:促进数据集的高效利用,并为计算机辅助工程服务:
内容包括:
1.对数据集的描述,对数据集中个数据项,数据来源,数据所有者,以及数据序代的说明.
2.对数据质量的描述,如数据精度,数据的逻辑一致性,数据完整性,分辨率,元数据的比例尺;
3.对数据处理信息的说明
4.对数据转换方法的描述
5.对数据库的更新,集成等的说明
看到这里,大家是不是感到概念很抽象,呵呵,没有关系,这是我们专业GIS中的关于元数据的描述(你知道GIS把,地理信息系统).学过VC的人应该知道在VC中也有元数据的概念,它是以元文件设备上下文类形式CMetaFileDC出现的.下面我就谈谈这个.

 

 

首先,CMetaFileDC派生于CDC,当用户用元文件DC绘制时,在元文件中就会包含图形所有的绘制命令,注意不是绘制的图形,而是绘制的命令.下次再"播放"这个元文件的时候,它就会将命令重新操作一遍,得到的图形和上次一模一样.那么这样元文件和元数据概念就差不多了.它记录的只是关于这个图形的"数据",什么数据呢?绘制命令.这就是对上面的最好阐释.

具体步骤:
1.构造一个CMetaFileDC类对象,就和CClientDC一样
2.用Create函数创建一个设备上下文
3.绘制
4.调用Close函数来关闭设备上下文,这个不同于自动析构,用Close函数会返回一个元文件句柄(HMETAFILE)
5.调用播放函数 PlayMetaFile
6.删除元文件句柄 DeleteMetaFile

 

 

那么看到这里你可能会问了,这个元文件有什么作用呢?要绘制图形直接用CDC的其他派生类就完事了啊?比如CClientDC,CPaintDC.其实不然.你可能以前做过这样的程序:用鼠标左键进行连续绘制功能,为了提高效率,我们直接在响应WM_MOUSEMOVE消息的函数中进行,而不是等到WM_PAINT消息.但是这样的话,如果绘制了一些图形以后,然后最小化,再打开,图形就不见了,因为执行了刷新,而我们又没有处理WM_PAINT,所以就看不见了.


如果我们用元文件的话,刷新就会变的非常简单了.先定义一个CMetaFileDC对象成员变量,在OnMouseMove中用元文件记录,同时也用CClientDC对象绘制.
等到刷新的时候,把我们记录的元文件播放一遍就可以了.
下面是具体实现过程:
void CMyView::OnDraw(CDC* pDC)
{
 CMyDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 HMETAFILE hmetaf;//元文件类型
        hmetaf=m_metadc.Close();
 pDC->PlayMetaFile(hmetaf)//播放
 m_metadc.Create();//已经关闭了设备上下文,所以要重新打开,方便下次使用
 DeleteMetaFile(hmetaf);
}


void CMyView::OnMouseMove(UINT nFlags, CPoint point)
{
if(nFlags&MK_LBUTTON)
 {
 CClientDC dc(this);
 dc.MoveTo(pre.x,pre.y);
 dc.LineTo(point.x,point.y);
 m_metadc.SelectObject(&pen);
 m_metadc.MoveTo(pre.x,pre.y);
 m_metadc.LineTo(point.x,point.y);
 pre=point;}
}


其中m_metadc是CMetaFileDC的一个对象,pre记录左键按下的坐标.


但是这样还有问题.当我们第一次绘制然后最小化然后恢复,刷新可以成功.然后你继续绘制,再刷新一次,会发现第一次的绘制的图形没了.因为我们
执行了m_metadc.Create(),就是重新创建了一个DC,以前的当然没了.解决办法就是在创建了设备上下文之后,立即将上次的元文件在这个新建的DC里播放一次,记录下来.即: 


void CMyView::OnDraw(CDC* pDC)
{
 CMyDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 HMETAFILE hmetaf;//元文件类型
   hmetaf=m_metadc.Close();
 pDC->PlayMetaFile(hmetaf)//播放
 m_metadc.Create();//已经关闭了设备上下文,所以要重新打开,方便下次使用
 
m_metadc.PlayMetaFile(hmetaf);
 DeleteMetaFile(hmetaf);
}


如果是SDI,还可以用元文件保存和打开图形.
如"保存":
        
HMETAFILE hmetaf;//元文件类型
        hmetaf=m_metadc.Close();
       CopyMetaFile(hmetaf,"meta.wmf");
       m_metadc.Create();

DeleteMetaFile(hmetaf);
wmf是文件格式.实际上是可以用一般的图形浏览软件打开的,不过好像有点变形,呵呵,没有关系,再在SDI中打开就恢复了.
       
HMETAFILE hmetaf;//元文件类型
        hmetaf=GetMetaFile("meta.wmf");
        metadc.PlayMetaFile(hmetaf);
        DeleteMetaFile(hmetaf);


从上述来看元文件的使用还是蛮简单的.如果你想记录下哪次操作,只要在以前用CClientDC绘制的地方在用元文件DC弄一遍,就可以了.它的用途也是相当广泛的,下面我引用我们专业的话结尾:
在GIS中使用元数据的原因:
1.完整性  面向对象的地理信息系统和空间数据库的目标之一,是把事物的有关数据表示成类的形式,而这些类也包含类自身,即复杂的类的类结构.
2.可扩展性 有意延伸一种计算机语言或者数据库特征的语义是有用的,如把跟踪引擎的生成结果添加到操作请求中.
3.特殊性   继承机制是靠动态连接操作请求和操作体实现的,语言以及数据库以结构化和语义信息的相关上下文把操作请求传递给操作体.
4.查错
5.浏览
6.程序生成
呵呵,你看的懂上面的话吗?那你可以上我们专业了.

阅读(4300) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册