在gis数据处理中,经常要对大量要素的字段值进行赋值,很其中很多操作就有可能将半角写成全角,或者有些字段就要求是半角,有些字段要求 是全角,这时,可以利用arcpy写一个全角半角的转化,做成arcmap中的小工具,给数据处理的同事用。
程序 的关键是 如何进行全角半角 的转换,这里以两个变量,分别接收用户输入的要全角的字段,和要半角的字段,多个字段以“,”分隔,利用字符串分割即可。
其中半角和全角 其实对应的是不同的编码,只需要了解其中 的编码规则,就可以实现转化,这里原理不过多叙述,可以自行百度,上出转换 的代码:
# 半转全
def strb2q(ustring):
rstring = ""
if(ustring is None):
return ustring
for uchar in ustring:
inside_code = ord(uchar)
if inside_code == 32:
inside_code = 12288
elif inside_code >= 32 and inside_code <= 126:
inside_code+=65248
rstring += unichr(inside_code)
return rstring
# 全转半
def strq2b(ustring):
rstring = ""
if(ustring is None):
return ustring
for uchar in ustring:
inside_code = ord(uchar)
if inside_code == 12288:
inside_code = 32
elif (inside_code >= 65281 and inside_code <= 65374):
inside_code -= 65248
rstring += unichr(inside_code)
return rstring
最终制作成 小工具的代码如下:
# coding:utf-8
import arcpy
import os
import sys
reload(sys)
sys.setdefaultencoding('utf8')
def strb2q(ustring):
rstring = ""
if(ustring is None):
return ustring
for uchar in ustring:
inside_code = ord(uchar)
if inside_code == 32:
inside_code = 12288
elif inside_code >= 32 and inside_code <= 126:
inside_code+=65248
rstring += unichr(inside_code)
return rstring
def strq2b(ustring):
rstring = ""
if(ustring is None):
return ustring
for uchar in ustring:
inside_code = ord(uchar)
if inside_code == 12288:
inside_code = 32
elif (inside_code >= 65281 and inside_code <= 65374):
inside_code -= 65248
rstring += unichr(inside_code)
return rstring
gdbPath = r"D:\TemplateData.gdb"
arcpy.env.workspace = gdbPath
fds = arcpy.ListDatasets("", "")
QJiao = map(str, raw_input("请输入需要全角的字段,以空格分开\n").split())
BJiao = map(str, raw_input("请输入需要半角的字段,以空格分开\n").split())
print("全角为:{}".format(QJiao))
print ("半角为:{}".format(BJiao))
for fd in fds:
for fc in arcpy.ListFeatureClasses('', '', fd):
print("要素为:{}".format(fc))
path = os.path.join(str(gdbPath), str(fc))
# 找出文本类型的字段
fcFields = arcpy.ListFields(fc, '*', 'String')
for fcf in fcFields:
cursor = arcpy.UpdateCursor(path)
print("字段为:{}".format(fcf.name))
for qj in QJiao:
if(fcf.name == qj):
for row in cursor:
print("半角转全角:{}".format(row.getValue(fcf.name)))
bufValue = strb2q(row.getValue(fcf.name))
if(bufValue != row.getValue(fcf.name)):
row.setValue(fcf.name, bufValue)
cursor.updateRow(row)
print("更新完成")
for bj in BJiao:
if(fcf.name == bj):
for row in cursor:
print("全角转半角:{}".format(row.getValue(fcf.name)))
bufValue = strq2b(row.getValue(fcf.name))
if(bufValue != row.getValue(fcf.name)):
row.setValue(fcf.name, bufValue)
cursor.updateRow(row)
print("更新完成")
这里需要注意的小细节是,在小工具中,输入中文 会报错,原因是arcgis10.2自带的python2.7版本,这个版本默认在小工具中 的文件 编码是ANSI,所以带汉字的话在 arcmap工具中运行可能 会出错,这里需要在头部声明:utf-8,并把文件保存成ANSI格式即可。