数字分幅图数据库管理方式的实现
- 格式:doc
- 大小:4.92 MB
- 文档页数:9
数字分幅图数据库管理方式的实现周华健孟尔贵(泰州市国土资源局江苏泰州225300)摘要本文从应用数据库技术、Gis平台实现对数字分幅图的管理,有机地结合制图软件-数据库Gis 平台-制图软件,扬长避短,解决了实际工作中图形调用的问题。
关键词地图数据库管理1引言随着国家对资源管理的重视、社会经济的快速发展以及现代计算机技术的应用,基础测绘工作在社会生活中的角色越来越重要。
笔者从事土地管理部门基础测绘工作,目睹了近几年政府对基础测绘的投入,形成了大量成体系的标准分幅地籍、地形图,工程或项目结束后往往海量的数据只是简单罗列存放在磁盘中,在这少则上百多则几千幅的地图中,日常应用找寻一幅或某一区域地图时,费时费力,使用效率低下。
图是电子的,有没有一种方式通过计算机来管理,应用时由计算机来查找、调取所需的分幅图呢?答案是肯定的,市面上也有不少软件实现了电子地图的管理。
笔者没用过也没探寻过其管理模式。
笔者就本单位几幅CAD电子地形图,如何将其以二进制流文件存储入数据库管理,满足日常发证宗地图制作、新增建设用地勘测定界的使用,谈谈实际应用机制。
2设计思路数据库是数据管理和查询的最有效途径,能不能将海量的各类标准图件按一定方式写入数据库,要用时,利用数据库强大的查询功能来提取,数据库本身有可靠的安全性,这样一来既可以解决图形调用时找寻困难问题,又可以解决图件对不同用户保密的问题。
无论是Oracle还是SQL Server都提供了一种机制,能存储每行大到2GB的二进制对象(BLOB),BLOB数据在数据库系统中的存储方式不同于普通的数据类型,对于普通类型的数据系统直接在用户定义的字段上存储数据值,而对于BLOB类型数据,系统开辟新的存储页面来存放这些数据,表中BLOB类型数据字段存放的仅是一个16个字节的指针,该指针指向存放该条记录的BLOB数据的页面。
这类对象可包括image、text和ntext三种数据类型。
Image 数据类型存储的是二进制数据,最大长度是231-1 (2,147,483,647)个字节。
一般我们平常的电子分幅图大小为几十K,大的不过几M,BLOB对象是足够存储的,我们先将分幅图(无任什么格式)写入数据库中BLOB字段,要用时将存储在数据库中BLOB 字段的分幅图再导出还原成原来的格式,再用原来的图形处理软件处理。
(如图1)图13实现过程3.1 图形入库3.1.1设计图形数据库建立数据库我以SQL2000为例,数据结构如下:3.1.2图形数据整理入库如何将分幅图上传到数据库呢?对于ID、TFH、FileName、TM、UpDataTime、ZT_DWMC、BZ这些普通字段我们可以直接存取,而对于CAD_Map(Image数据类型)字段在数据库系统中无法直接存储,下面我以Borland Delphi 7开发工具为例,利用ADO开发一个图形数据上传小工具从而实现CAD数据批量入库。
图2运行界面如上,思路是先将分幅图整理存放于磁盘的某个目录,然后通过程序读取这个目录,将具体分幅图的相关信息读取寄存到一个ListBox对象中,建立循环,通过TBlo bfi eld(DA TA.ADO Que ryM ap.Fie ldB yNa me('Ca d_M ap')).Loa dFr omFi le(pat hfi len ame)语句来对数据库CAD_Map(BLOB)字段赋值。
上载过程语句如下:proc edu re TFo rmM apU p.R zBi tBt n1C lic k(S end er: TO bje ct);varp ath fil ena me,fil ena me,s:s tri ng;i,n:int ege r;m m:V ari ant;begi ns:='sel ect * fro m T Z_C AD_MAP';D ATA.AD OQu ery Map.Ac tiv e:=fal se;D ATA.AD OQu ery Map.SQ L.C lea r;D ATA.AD OQu ery Map.SQ L.A dd(s);D ATA.AD OQu ery Map.Op en;D ATA.AD OQu ery Map.Ac tiv e:=tru e;n:=RzL ist Box1.I tem s.C oun t;s:=d ate tim eto str(no w);f or i:=0 t o n-1 dob egi np ath fil ena me:=Rz Lis tBo x1.Ite ms.Str ing s[i];f ile nam e:=Ext rac tFi leN ame(pa thf ile nam e);D ATA.AD OQu ery Map.Ap pen d;D ATA.AD OQu ery Map.Fi eld ByN ame('Z T_D WMC').AsS tri ng:=Fo rmMa pUp.Rz Edi t1.tex t;D ATA.AD OQu ery Map.Fi eld ByN ame('f ile nam e').As Str ing:=f ilen ame;D ATA.AD OQu ery Map.Fi eld ByN ame('U PDA TAT IME').AsS tri ng:=s;T Blo bfi eld(DA TA.ADO Que ryM ap.Fie ldB yNa me('Ca d_M ap')).Load Fro mFi le(pat hfi len ame);D ATA.AD OQu ery Map.Po st;m m:=flo or(i/(n)*100);R zPr ogr ess Bar1.P erc ent:=m m;e nd;R ZLi stB ox1.It ems.cl ear;A ppl ica tio n.M ess age Box('图形数据已成功上载服务器!!!','|返回|',mb_OK);R zPr ogr ess Bar1.P erc ent:=0;end;CAD数据批量入库结果如图3。
(以SQL2000为例)图3到目前为止,我们已建立了图形数据库,且将分幅图按一定要求顺利入库,下面我们要解决的问题就是用什么平台来管理、如何快速按指定范围查询和调用地图了。
3.2 图形库管理3.2.1图形库管理平台普通图形处理环境如AutoCAD、MicroSation等着力于图形编辑功能的实现和加强,在图形的绘制、整饰、修改,图形的出图效果、精度等方面非常出色,因而我们大多数单位在日常生产中也常以这些软件为主,尤其是AutoCAD更是随处可见。
我单位地形图全部为CAD格式(本文中我也是以CAD为例)。
但这些软件在地图管理、添加属性、信息查询等方面有较大欠缺。
而当前地理信息系统软件ArcGis、Mapinfo等,虽然图形处理能力没他们好,但在数据管理、空间分析、统计查询等功能强大。
下面我就以ArcMap作为图形管理平台,利用Delphi编写一个图形查询和图形提取的DLL,在ArcMap加载后界面如下:图43.2.2制作图幅结合表为了实现ArcMap对地图的查询,我们应先建立一个图层用来对应图形数据库,具体图层结构如下:图5图6这里要注意的是格网、图幅号要与图形库中的分幅图相对应,当然我们也可以根据图形库中的分幅图信息,通过编程来自动生成这个图层。
在生产过程中作业单位一般会提供一个一个现成的分幅图结合表图层,我们只要稍许加工就成了。
同时我这是调用1:1000正射影像作为索引,不同部门可能有不同的索引图,其原理是一样的。
3.2.3模块过程代码Dll的编写不同的开发环境有不同的语句,在Delphi 7环境中下面的过程通过编译。
func tio n T Cad Loa d.O nCl ick: H Res ult;varm_a pp: IM xAp pli cat ion;m_D oc: IM xDo cum ent;PMa p: IMa p;pLa yer:IL aye r;pFe atu reL aye r:I Fea tur eLa yer;pFe atu reS ele ctt ion:IF eat ure Sel ect ion;pSe lec tti onS et:ISe lec tio n Set;pC urs or:ICu rso r;pFe atu reC urs or:IFe atu reC urs or;pFe atu re:IFe atu re;pFe atu reC las s:I Fea tur eCl ass;pFi eld s:I Fie lds;i,j,iC oun t,i Fie ldI nde x,i cnt Sel:In teg er;str Lyr Nam e:w ide str ing;ole: O leV ari ant;pSe lec tSe t: ISe lec tio nSe t;PSe lec t: ISe lec tio n;pTb l: IOb jec tCl ass;f2:tex tFi le;S_t xt,fil ena me,s:s tri ng;n:i nte ger;pro: I Ste pPr ogr ess or;m_p Pro Dlg: I Pro gre ssD ial ogF act ory;pGr oup Lyr: I Gro upL aye r;iLy rCn t,i lyr: I nte ger;pLy rTm p: ILa yer;begi nm_ap p := p_Ap p a s I MxA ppl ica tio n;m_Do c := (P_a pp.Doc ume nt) as IM xDo cum ent;m_Do c.G et_Foc usM ap(PMa p);P Map.Ge t_L aye rCo unt(iC oun t);i f i Cou nt=0 t henb egi nA ppl ica tio n.M ess age Box('请先打开地图文档!!!','|返回|',m b_O K);e xit;e nd;f or i:=0 t o i Cou nt-1 d ob egi np map.Ge t_L aye r(i,pL aye r);//图层组分析i f n ot Suc cee ded(pL aye r.Q uer yIn ter fac e(I ID_IFe atu reL ayer,pF eat ure Lay er)) t henb egi ni f n ot Suc cee ded(pL aye r.Q uer yIn ter fac e(I ID_IGr oup Lay er,p Gro upL yr)) t hen Co nti nue;(pG rou pLy r a s I Com pos ite Lay er).Ge t_C oun t(i Lyr Cnt);for il yr:= 0 to iL yrC nt-1 d obeg in(p Gro upL yr as ICo mpo sit eLa yer).G et_Lay er(ily r,p Lyr Tmp);if Su cce ede d(p Lyr Tmp.Qu ery Int erf ace(II D_I Fea tur eLa yer,pFe atu reL aye r)) th enbe ginpF eat ure Lay er.Get_Na me(str Lyr Nam e);if st rLy rNa me='TZ_JH B_1000_re gio n' the n B rea k;en d;en d;en d;if pF eat ure Lay er = n il the n C ont inu e;pF eat ure Lay er.Get_Na me(str Lyr Nam e);if st rLy rNa me='TZ_JH B_1000_re gio n' the nbe gin(pFe atu reL aye r a s I Fea tur eSe lec tio n).Get_Se lec tio nSe t(pS ele ctt ion Set);(pFe atu reL aye r a s I Tab le).Ge t_F iel ds(pFi eld s);p Sel ect tio nSe t.S ear ch(nil,fa lse,pC urs or);p Sel ect tio nSe t.G et_Cou nt(icn tSe l);i f p Cur sor<>n il the nb egi npFe atu reC urs or:=pC urs or as IFe atu reC urs or;pFe atu reC urs or.Nex tFe atu re(pFe atu re);if pFe atu re=nil th enbeg inAp pli cat ion.Me ssa geB ox(' 请先选定所需图区幅!!!','|返回|',mb_OK);ex it;end;Ass ign Fil e(F2,'c:\CAD_MA P\P T_Z HJ.scr');Rew rit e(F2);if Dat a = ni l t hen Da ta := TDa ta.Cre ate(Ap pli cat ion);m_p Pro Dlg := co Pro gre ssD ial ogF act ory.Cr eat e a s I Pro gres sDi alo gFa cto ry;m_p Pro Dlg.Cr eat e(n il,App lic ati on.Han dle,pr o);pro.Sh ow;pro.Se t_M inR ang e(0);pro.Se t_M axR ang e(i cnt Sel);pro.Se t_S tep Val ue(1);pro.Se t_P osi tio n(0);whi le pFe atu re<>ni l d obeg inp Fie lds.Fi ndF iel d('图幅号',i Fie ldI nde x);pFe atu re.Get_Va lue(iF iel dIn dex,ol e);pro.Se t_M ess age('正在处理:'+o le);pro.St ep;s:='se lec t *fr om TZ_CAD_MA P w her e t fh='''+ol e+'''';DAT A.A DOQ uer yMa p.S QL.Cle ar;DAT A.A DOQ uer yMa p.S QL.Add(s);DAT A.A DOQ uer yMa p.O pen;n:=DAT A.A DOQ uer yMa p.R eco rdC oun t;if n<>0 t henbe ginfil ena me:=DA TA.ADO Que ryM ap.fie ldb yna me('fi len ame').A sSt rin g;TBl obf iel d(D ATA.AD OQu ery Map.fi eld byn ame('C ad_Map')).Sav eTo Fil e('c:\CAD_MA P\'+fi len ame);S_t xt:='i nse rt *c:\CA D_M AP\'+f ile nam e+' 0,0 1 0';wri tel n(F2,S_tx t);e nd;pF eat ure Cur sor.Ne xtF eat ure(pF eat ure);end;e nd;p ro.Hid e;p ro := nil;S_tx t:='in ser t * c:\CA D_M AP\'+f ile nam e+' 0,0 1 0';w rit eln(F2,'z oom e');w rit eln(F2,'f ile dia 1');C los eFi le(f2);A ppl ica tio n.M ess age Box('图形数据下载结束,并生成了CA D拼图脚本,拼图请运行CA D程序,然后执行Scri pt命令!!!','|返回|',mb_OK);D ATA.AD OQu ery Map.Cl ose;en d;end;end;本过程在还原CAD文件的同时生成了一个拼接分幅图的CAD脚本*.SCR文件,用记事本打开内容简略如下:inse rt *c:\CA D_M AP\805915.dw g 0,0 1 0……inse rt *c:\CA D_M AP\805910.dw g 0,0 1 0zoom efile dia 1在CAD软件中输入SCRIPT命令,调入如上*.SCR脚本文件,则可以实现分幅图的自动拼接。