这几天在给同门师兄处理一个土地利用数据,需要将原先的分类转换为另一种新的分类,其实就是根据一个已经存在土地利用代码生成新的字段,这个字段是按照新的分类标准来组织,国内的的土地利用代码有好几套,比如二调的代码体系和中科院的代码体系,师兄由于研究的需要在此基础还自己发展了一套新的地类编码。所以有时候就需要在这几套编码之间进行转换,师兄的数据是二调数据,就需要将编码转为自己发展的地类编码,这里就需要用到字段计算器。
传统的方法是添加字段之后,选择相应的代码,在属性表中,将其批量修改。这种方法适合于比较小的数据,不然速度很慢,尤其是二调数据这种一个县有几十万各图斑的数据来说,选中和显示对计算机的性能是一个考验。
当然ArcGIS的字段计算器的功能就是在这里发挥出来,它支持VB和python两种编码语言,非常方便,对于熟悉excel和word宏编写的大神们来说使用VB就很便利,而ArcGIS的脚本都是python,相信包括笔者在内的很多小伙伴都是用python吧,毕竟通用性最高。对于本文的问题,使用的是python的条件if函数,通过条件控制语句分别赋值,具体代码如下:
> def cal(x):
if x == "011":
return "C1"
elif x == "013":
return "C1"
elif x == "033":
return "T1"
elif x == "031":
return "T1"
elif x == "032":
return "T1"
elif x == "021" or x == "022" or x == "023":
return "T1"
elif x == "041" or x == "042" or x == "043":
return "T1"
elif x == "101" or x == "102" or x == "103" or x == "104" or x == "105" or x == "107":
return "C2"
else:
return "CC"
cal(!你的字段名称!)
这种条件赋值语句的用处很多,比如矢量数据的重分类,各位小伙伴们可以尽情发挥自己聪明才智。然而,问题并没有结束,而本文重点也就来了,在代码执行过程中,出现了一个前所未料的问题。 我们使用代码先行转换了其中一类(有林地),然后再去转换其他类(水田)时,发现之前计算的有林地的结果消失了,属性表中之前的计算部分显示为空。几次试验发现,后一次计算时前一次的计算结果就会消失。如图:
之前计算好的其他林地或者有林地就会消失,先计算水田,再计算其他类i,水田的计算结果也会消失,于是笔者开始脑补各种可能的问题,包括文件格式,放在个人地理数据库和文件数据库的区别,是否打开编辑器,是否字段太多,是否字段名为中文或者太长,是否是软件版本问题或者是电脑缓存问题,逐一排除,结果仍未能找到问题所在。最后只有使出终极大杀招,在代码中一次写完所有的类型转换,虽然代码长度大幅增加,但问题解决了。
在此也希望看到博客的小伙伴们能够给出比较好的解决办法或者指出问题的原因所在,如果有时候我们只需要对其中一部分要素进行重新赋值,不知怎么解决。
文末提醒初学字段计算器python的小伙伴们,代码块的写法和我们平时写python稍有不同,代码块中不能出现字段名称,因为ArcGIS中字段名称用!!标注,而这不符合python语法,只能在计算语句中出现。还有就是结果变量不需要在代码块中定义,因为计算语句中就已经为结果变量定义啦。关于字段计算器的更多帮助可以看ArcGIS的官方帮助文档,里面有很多案例,可以极大简化我们工作量,提高工作效率!