属性连接在MAPINFO、ARC/INFO注记转换中的应用
陆宇荣
(广西基础地理信息中心 南宁 530023)
【摘 要】 属性连接是GIS数据加工中经常使用的一种属性处理方法,本文结合如何解决ARC/INFO、MAPINFO两个软件的注记相互转换时编码丢失的问题,简单描述了在这两个软件中如何进行属性表的连接,希望起到一个抛砖引玉的作用,让广大的GIS初学者能理解并领会属性连接的应用。
【关键词】 属性连接 Mapinfo ARC/INFO
1.引言
由于各种软件的数据格式不一样,在各种软件的数据相互转换时有时会造成属性的丢失。比如ARC/INFO、MAPINFO两个GIS软件的注记相互转换时就会丢失编码,如果重新标赋编码,不仅工作量大,而且难以避免错漏。有没有简便的方法呢?有,通过属性连接就可以解决这个问题。下面就以如何找回ARC/INFO、MAPINFO两个GIS软件的注记相互转换丢失的编码为例详细说明如何连接属性表。
2.注记从MAPINFO转到ARC/INFO
流程如图1所示:
|
图1 从MAPINFO转到ARC/INFO的属性连接流程 |
具体步骤为:
①将注记层从MAPINFO输出ARC/INFO的交换格式E00(注意:输出之前要压缩表,防止某些注记已删除但在表格数据中仍有空记录存在而导致属性连接错误)。
②将E00格式转成图层(Coverage),比如ANOTAT。此时注记的图形文件和编码(属性表)是分开存储的。图形文件通过Arctools edit打开注记要素anno浏览,能看见注记,但没有编码。而在E00转成图层时在INFO表里同时生成一个ANOTAT.TMT,编码就存放在这个属性表内。
③为了把编码属性与注记图形连接,还需要生成注记的子集。通过在ARC的主窗口输入Copyfeatures ANOTAT anno ANOTAT anno.t ,再输入Addtext ANOTAT.t ,此时罗列ANOTAT的属性表(List ANOTAT.tatt)还是没有编码。
ANOTAT.TMT表记录如下:
recno |
CODE |
1 |
98209 |
2 |
98216 |
3 |
98204 |
4 |
98204 |
5 |
98202 |
6 |
98206 |
… |
… |
连接前的ANOTAT.tatt表记录如下:
recno |
T# |
T-id |
x |
y |
… |
text |
1 |
1 |
0 |
110.8259 |
24.8204 |
… |
县中医医院 |
2 |
2 |
0 |
110.8248 |
24.8100 |
… |
城北市场 |
3 |
3 |
0 |
110.8222 |
24.8009 |
… |
县公安局 |
4 |
4 |
0 |
110.8239 |
24.8115 |
… |
县法院 |
5 |
5 |
0 |
110.8204 |
24.8303 |
… |
县总工会 |
6 |
6 |
0 |
110.8217 |
24.8221 |
… |
红星小学 |
… |
… |
… |
… |
… |
… |
… |
④最后是属性表的连接。ARC/INFO的属性连接用joinitem命令通过一个相关字段把两个属性表连接起来。具体的命令参数为:
JOINITEM <in_info_file> <join_info_file> <out_info_file> <relate_item> {start_item} {LINEAR | ORDERED | LINK}
在ARC的主窗口输入:
Joinitem ANOTAT.tatt ANOTAT.TMT ANOTAT.tatt $recno
($recno是ANOTAT.tatt、ANOTAT.TMT的记录顺序号,本例把$recno作为相关字段),此时再罗列ANOTAT的属性表,你就会发现ANOTAT.tatt增加了一个名称为CODE的字段,每个注记的CODE字段的属性与MAPINFO的ANOTAT表的CODE属性是一致的。
通过属性连接后的ANOTAT.tatt表记录如下:
recno |
T# |
T-id |
x |
y |
… |
TEXT |
CODE |
1 |
1 |
0 |
110.8259 |
24.8204 |
… |
县中医医院 |
98209 |
2 |
2 |
0 |
110.8248 |
24.8100 |
… |
城北市场 |
98216 |
3 |
3 |
0 |
110.8222 |
24.8009 |
… |
县公安局 |
98204 |
4 |
4 |
0 |
110.8239 |
24.8115 |
… |
县法院 |
98204 |
5 |
5 |
0 |
110.8204 |
24.8303 |
… |
县总工会 |
98202 |
6 |
6 |
0 |
110.8217 |
24.8221 |
… |
红星小学 |
98206 |
… |
… |
… |
… |
… |
… |
… |
… |
3.注记从ARC/INFO转到MAPINFO
MAPINFO的属性连接流程如下图所示:
|
图1 从ARC/INFO转到MAPINFO的属性连接流程 |
具体步骤为:
①注记层输出成anotat.e00,同时在ARC主窗口输入infodbase anotat.tatt anno.dbf,把编码信息放在MAPINFO支持的dBASE格式文件中;
②把anotat.e00转成MAPINFO的表文件anotat.tab;
③同时打开anotat表和anno.dbf表;
anotat表记录如下图所示:
id |
uid |
size |
angle |
subclass |
1 |
0 |
0.000163 |
0 |
|
2 |
0 |
0.000163 |
0 |
|
3 |
0 |
0.000109 |
0 |
|
4 |
0 |
0.000163 |
0 |
|
5 |
0 |
0.000109 |
0 |
|
6 |
0 |
0.000163 |
0 |
|
… |
… |
… |
… |
… |
anno.dbf表记录如下图所示:
T_ |
T-id |
x |
y |
… |
TEXT |
CODE |
1 |
0 |
110.8259 |
24.8204 |
… |
县中医医院 |
98209 |
2 |
0 |
110.8248 |
24.8100 |
… |
城北市场 |
98216 |
3 |
0 |
110.8222 |
24.8009 |
… |
县公安局 |
98204 |
4 |
0 |
110.8239 |
24.8115 |
… |
县法院 |
98204 |
5 |
0 |
110.8204 |
24.8303 |
… |
县总工会 |
98202 |
6 |
0 |
110.8217 |
24.8221 |
… |
红星小学 |
98206 |
… |
… |
… |
… |
… |
… |
… |
④在anotat表中增加code字段,用于存放注记的编码,此时code字段值均为0;
⑤单击主菜单的“表[A]”→“更新列”,弹出如下对话框:
按下表设置相应的表及属性项(列):
在确定之前还要设置连接的相关字段,单击“连接”,弹出如下对话框:
用anotat表的“id”字段与anno.dbf表的“T”字段作为属性连接的对应字段。连接属性后anotat表的CODE字段修改成与ARC/INFO相对应的编码值。
id |
uid |
size |
angle |
subclass |
code |
1 |
0 |
0.000163 |
0 |
|
98209 |
2 |
0 |
0.000163 |
0 |
|
98216 |
3 |
0 |
0.000109 |
0 |
|
98204 |
4 |
0 |
0.000163 |
0 |
|
98204 |
5 |
0 |
0.000109 |
0 |
|
98202 |
6 |
0 |
0.000163 |
0 |
|
98206 |
… |
… |
… |
… |
… |
… |
⑥最后整理数据,去除从ARC/INFO带过来的不必须的字段,如id、uid、size、angle、subclass。
4.结束语
通过上述属性连接,可以把因转换丢失的编码信息找回来,正确率100%,在注记比较多的情况下效率明显大于人工重新标赋编码。上文所述的仅是单个注记图层的转换,如果有多个注记层需要转换,可以编程批处理,那效率提高更明显了。 |