利用arcpy实现对gdb文件的要素字段进行全角和半角转换

在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格式即可。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

问也去

创作不易,感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值