阅读:2361回复:1
[分享]MapInfo对邻接域的处理方式
1文件处理方式
对于已有地图数字化录入的地图数据,由于测图时是以图幅为作业单位的,因此对邻接域管理问题主要是图形数据录入后的拼接编辑处理。进行拼接时,常常会有边界不一致的情况,需要进行边缘匹配处理。对于这种情况,一般需要先进行投影变换,通常的做法是从地形图使用的高斯-克吕格投影转换到经纬度坐标系中,然后再进行拼接,但往往会由于操作不当等原因而产生裂缝或空隙,从而破坏地物的连通性、整体性等空间特性;或者可通过设计算法由计算机自动完成或辅助手工半自动完成,目前市场上已有部分矢量化软件提供了这个功能;另外一种方法是在数字化之前,将一幅图幅上跨图幅的地物按照“它在两图幅之间所占的比例大小,地物在哪幅图幅占的比例大就将它转移哪幅图上”的规则,进行归属处理,之后再进行数字化。这样虽然避免破坏部分小区域要素地图数据的拓扑关系从而省去拼接处理,但是这种方法对于那些跨几幅图范围的大区域要素就无能为力了。 对于已有地图数字化的邻接域处理还有其它的方法,本文在这里就不重点加以讨论,下面重点探讨数字测图方式下的分图幅管理的邻接域处理问题。 现阶段对大比例尺地图数据的获取主要采用数字测量方式。数字测量所用软件有AutoCAD、清华山维的EPSW、南方测绘的CASE等。其中,AutoCAD因为其强大的图形编辑功能,我国大多数生产单位都采用它或在其基础上进行二次开发后用于数字测量。但限于其有限的GIS功能,很多情况下,用户的地图数据往往要由AutoCAD中转换到其他GIS系统如MapInfo中。这样一个单幅的地图数据由于其作业方式的改变(不是分幅,而是分区),使得其文件大小可能达到50M左右。如果用户直接将该图层在MapInfo中打开显示,其显示速度和处理速度会受到很大影响。此时,对地图数据的管理传统上采取的方法是将整个单幅的大图层划分成若干个小图幅,并利用建立索引图的方法,来提高对地图的显示速度和处理速度。 分幅与建立索引的具体方法与步骤是: 1. 新建一个空白图层用作索引图层,并将它添加到当前地图窗口。 2. 在索引图层中创建若干矩形区域对象,用来对底图进行分割。 3. 使底图可编辑,并选中底图,设置为目标对象。 4. 选中索引图层中的某一矩形区域,利用“对象”-“分割”将底图进行分割。 5. 选中底图中被分割出来的部分,并将其剪切或拷贝。 6. 新建一个图层,用来存放从底图中剪切下来或拷贝过来的图形。 7. 重复步骤4-6直到将整个底图全部分割完毕。 8. 编写(用MapBasic)用程序,建立索引,控制分幅图层显示。 还可以利用MapBasic编制程序实现对图层的自动分割。虽然用这种方式比较简单,但作为编程语言与其它可视化语言如VB、VC++等比较起来,开发起来相对烦琐。因此,用它们来开发应用程序不尽如人意。还可通过相应的处理,可以让邻接域只位于某一个图幅中。但会出现另一种情况:假设将来基于两幅图幅进行空间决策分析,如道路拓宽改建过程中的拆迁指标计算、工程项目选址、区域规划等,其中一幅图由于邻接域的处理包含了邻接域的整体,而另一幅图没有包含,必会造成决策上的失误。 2数据库方式 与文件方式比较,另外一种更理想的解决方案是使用Oracle Spatial。通过数据库管理空间数据方式可以方便的解决此问题,即将整个图层数据存入Oracle数据库中,通过SQL语句下载任意区域的数据,数据库会自动维护数据的完整性。实际上,邻接域问题对于数据库管理方式已不存在了。下面就具体介绍在MapInfo professional中利用Oracle Spatial存取以及查询空间数据的具体方法。 2.1 Oracle Spatial Oracle Spatial空间数据插件是一个能在Oracle数据库中快速有效地存储、访问、分析空间数据的完整的功能程序集。它可以满足以下两种用户的需求:一种是想在传统的数据库中增加空间查询功能的用户;另一种是想存储、管理包含海量地理数据的大型空间数据库的GIS用户.Oracle Spatial空间数据插件基于Oracle数据库提供了便利的存储、恢复、更新、查询空间特征集的各种标准SQL模型和功能。它包括以下四部分:⑴用于描述所支持的地理数据类型的存储、语法、语意的模型; ⑵空间索引结构;⑶执行相关范围查询和空间关系查询的操作和功能集合;⑷管理功能。 由于Oracle Spatial系统建立在功能强大的服务器上,又实现了非常高效的空间索引技术(R-tree),所以能轻松地处理地图数据。利用Oracle Spatial可以将地图数据直接存储到Oracle数据库服务器中,不仅可以解决邻接域问题,而且还可以在客户端通过MapInfo professional,利用Oracle Spatial提供的空间算子结合SQL语句,对MapInfo地图进行编辑、查询和及其它复杂空间分析。 在Oracle Spatial中地图数据的使用很简单,只需建立一个单一图层,不必再进行分幅处理。如果用户原来的数据源是分幅的,可将其全部存储到一个Oracle Spatial图层中,Oracle Spatial将自动对其进行拼接和索引处理,可形成一个完整的图层。当连接数据库打开表时, MapInfo支持在打开数据表的同时,进行SQL查询,从而可以只打开整个图层中的符合用户要求的一部分图形和数据。在应用中,在客户端通过MapInfo Professional,只需极少的编程工作量(实际上只是指定数据源),就可实现对Oracle Spatial数据的动态显示。Oracle Spatial会根据当前地图客户端的显示视野,自动将此范围内的图形检索出来,送到客户端显示出来。因此用Oracle Spatial处理邻接域问题是完全可行的。 利用Oracle Spatial,可建立一种真正的Client/Server结构的空间信息系统,不仅解决了地图数据的存储,管理等问题,也解决了多用户编辑,数据完整性,数据安全机制等许多问题。 2.2.2空间数据的组织 本文中利用Oracle Spatial将地图数据直接存储到Oracle数据库服务器中。在Oracle Spatial中,MapInfo 的属性数据和地图数据被存储在同一张关系表中(如表一)。 表 一 StreetID StreetName Length Width … … GEOM 1 NanxinStreet 1000 40 … … …… 2 TongliWest 1500 50 … … …… … … … … … … … … … … …… Oracle数据库中的数据来源有两种方法:一种是利用MapInfo的数据上载工具Easyloader向Oracle数据库中上载MapInfo空间数据; 另一种是在Oracle Spatial 中创建地图数据(如下)。 1.创建一个新表: create table town(townname varchar2(42),…,location MDSYS.SDO_GEOMETRY); 2.将新表增加到 SDO_GEOM_METADATA表中: insert into SDO_GEOM_METADATA values('town','location',MDSYS.SDO_DIM_ARRAY (MDSYS.SDO_DIM_ELEMENT('X',-100.000000000,100.000000000,0.000000050), MDSYS.SDO_DIM_ELEMENT('Y',-20.000000000,20.000000000,0.000000050) )); 3.将新表增加到MAPINFO_MAPCATALOG表中: insert into MAPINFO_MAPCATALOG(SPATIALTYPE,TABLENAME,SPATIALCOLUMN,DB_X_LL, DB_Y_LL,DB_X_UR, DB_Y_UR,COORDINATESYSTEM,SYMBOL,XCOLUMNNAME,YCOLUMNNAME) valueS(13.1,'town','SYSTEM','locatin',-100,-20,100,20,'EARTH PROJECTION 1,0','SYMBOL(35,0,12)','NO_COLUMN','NO_COLUMN'); 4.创建空间索引:create index lines_index on lines (location) indextype is mdsys.spatial_indexparameters ('sdo_level = 5 sdo_numtiles = 4'); 5.向表中增加包含空间对象的新记录: insert into fire_hydrant values(attribute_1,?attribute_n, mdsys.sdo_geometry(1,null,mdsys.sdo_point_type(10.0,-10.0,200),null,null); 2.3 基于SQL语句的查询 将图形数据存储在空间数据库中之后,由于数据库自动维护其完整性,所以象图1和图2那样的邻接域问题就不存在了。文件管理方式下的邻接域,在数据库管理方式下可以通过SQL查询生成完整的地物显示出来。 可在MapInfo Professional 环境下,通过连接Oracle8i Spatial数据库,进行基于属性或是基于空间关系的SQL查询,并下载SELECTION记录集。 1.在下载的同时基于属性进行SQL查询(下载与同一村庄有关的所有属性): Select * From Village_pop1,Village_pop2 Where Village_pop1.VillageName = Village_pop2.VillageName 2.在下载的同时基于空间关系进行SQL查询(下载Village_Geom1、Village_Geom2表中村名相同的区域对象): select Geom1,Geom2 into Village_Geometry from Village_Geom1, Village_Geom2 where Village_Geom1.VillageName= Village_Geom2.VillageName 通过上面两种方法,可以获取任意区域的数据。 3. 总结 虽然目前解决邻接域问题的方法很多,但若要顾及到地物的空间特性、拓扑关系,如整体性、完整性、连通性等,那么将MapInfo地图数据存储到 Oracle Spatial 中将是最好的解决办法。这样不仅能在Oracle Spatial 中修改上载的MapInfo地图数据,而且能在Oracle Spatial中创建MapInfo 地图数据。通过Oracle8i(OCI(Oracle 的C调用接口))将表下载到 MapInfo 客户端后,空间对象字段同样会成为MapInfo表的一个字段,且在下载数据时,可直接基于Oracle Spatial进行空间查询和空间分析。此外还为MapInfo处理海量地图数据提供解决方案;实现在MapInfo平台上,多人同时编辑同一个图层;保证地图数据的安全。 大家多多支持!顶啊!谢谢!<img src="images/post/smile/dvbbs/em10.gif" /> |
|