PYTHON-arcgis的开发:批量操作字段
2016-08-07 16:12
375 查看
#添加arcpy包,这个步骤必不可少
import arcpy
... from arcpy import env
... env.workspace = "D:/资料集/123.gdb"
##########################################################################
... fcList = arcpy.ListFeatureClasses()
... for sf in fcList:
##########################################################################
... arcpy.AddField_management(sf, "date", "TEXT", 9, "", "", "发震日期", "NULLABLE", "NON_REQUIRED")
... arcpy.AddField_management(sf, "time", "TEXT", 9, "", "", "发震时刻", "NULLABLE", "NON_REQUIRED")
... arcpy.AddField_management(sf, "name", "TEXT", 18, "", "", "地震名称", "NULLABLE", "NON_REQUIRED")
... arcpy.AddField_management(sf, "major_axis", "LONG", 9, "", "", "长轴长度", "NULLABLE", "NON_REQUIRED")
... arcpy.AddField_management(sf, "minor_axis", "LONG", 9, "", "", "短轴长度", "NULLABLE", "NON_REQUIRED")
... arcpy.AddField_management(sf, "direction", "TEXT", 9, "", "", "长轴方向", "NULLABLE", "NON_REQUIRED")
... arcpy.AddField_management(sf, "epicenter", "TEXT", 9, "", "", "烈度", "NULLABLE", "NON_REQUIRED")
... arcpy.AddField_management(sf, "area", "TEXT", 9, "", "", "面积", "NULLABLE", "NON_REQUIRED")
##########################################################################
#python的强制类型转换比较容易即str(a)将a转换为string型变量
#这里可以着重注意if语句的格式,以及elif的特殊写法
... fields = ['方位角']
... with arcpy.da.UpdateCursor(sf,fields) as cursor:
... for row in cursor:
... if len(row[0]) == 4:l = long(row[0][1:3])
... elif len(row[0]) == 3:l = long(row[0][1:2])
... elif len(row[0]) == 1:l = -2
... elif len(row[0]) == 2:l = -1
... if l > 45:
... if l < 90:x = 2
... elif l < 45:
... if l > 0:x = 3
... elif l == 45:l = -1
... cursor.updateRow(row)
... if l == -1:arcpy.CalculateField_management(sf,"direction","!方位角![:1]+!方位角![-1:]","PYTHON_9.3")
... elif x == 2:arcpy.CalculateField_management(sf,"direction","!方位角![:1]+!方位角![-1:]+!方位角![-1:]","PYTHON_9.3")
... elif x == 3:arcpy.CalculateField_management(sf,"direction","!方位角![:1]+!方位角![:1]+!方位角![-1:]","PYTHON_9.3")
... elif l == -2:arcpy.CalculateField_management(sf,"direction","!方位角![:1]","PYTHON_9.3")
##############################
#根据l值选择不同arcpy.CalculateField_management()操作方式的局限性太大,系统无法根据row[0]中的每个值进行判断及操作,而是len(row[0])出了不同值之后,l的值
是依据最后一个len值产生的,导致计算字段时的方法选择总是根据字段中最后一个字段值的len操作的出数值进行,而出现大面积错误,故我直接在row[0]操作时候更新字段
值,再将更新过的方位角字段通过计算字段赋值给direction字段。方法如下:
... fields = ['方位角']
... with arcpy.da.UpdateCursor(sf,fields) as cursor:
... for row in cursor:
... if len(row[0]) == 4:l = long(row[0][1:3])
... elif len(row[0]) == 3:l = long(row[0][1:2])
... elif len(row[0]) == 1:row[0] = row[0]
... elif len(row[0]) == 2:row[0] = row[0]
... if l > 45:
... if l < 90:
... if len(row[0]) == 3:row[0] = row[0][0]+row[0][2]+row[0][2]
... elif len(row[0]) == 4:row[0] = row[0][0]+row[0][3]+row[0][3]
... elif l < 45:
... if l > 0:
... if len(row[0]) == 3:row[0] = row[0][0]+row[0][0]+row[0][2]
... elif len(row[0]) == 4:row[0] = row[0][0]+row[0][0]+row[0][3]
... elif l == 45:row[0] = row[0][0] + row[0][3]
... cursor.updateRow(row)
... arcpy.CalculateField_management(sf,"direction","!方位角!","PYTHON_9.3")
############################################################################################################################################################以下部分是对字段中的每个值进行操作,而不是整个字段(取值,而不是笼统的!字段名!对整个字段进行操作)
#对字段值进行操作:举个例子
#fields = ['字段0','字段1']
#row[0] 即为字段0的值进行操作,而row[1]即为对字段1的值进行操作,以此类推
#cursor.updateRow(row)更新字段值
... fields = ['direction']
... with arcpy.da.UpdateCursor(sf,fields) as cursor:
... for row in cursor:
#这里我用了字符串的置换命令,row[0].replace('a',u'是')表示将row[0]字符串中的'a'转换为单个中文只占用一个字节的中文字符'是'
... row[0] = row[0].replace('N',u'北')
... row[0] = row[0].replace('S',u'南')
... row[0] = row[0].replace('W',u'西')
... row[0] = row[0].replace('E',u'东')
... cursor.updateRow(row)
###########################################################################
#arcpy的底层语言可能不是python语言
#a = 'a' a = "a" a = "'a'"python语言都可以识别,他对符号的判断不是很严格
#arcpy中每个参数都要严格使用""
... arcpy.CalculateField_management(sf,"date","!时间!","PYTHON_9.3")
... arcpy.CalculateField_management(sf,"name","!地点!+str('!震级!')+u'级地震'","PYTHON_9.3")
... arcpy.CalculateField_management(sf,"major_axis","!长轴!","PYTHON_9.3")
... arcpy.CalculateField_management(sf,"minor_axis","!短轴!","PYTHON_9.3")
... arcpy.CalculateField_management(sf,"epicenter","!烈度!","PYTHON_9.3")
... arcpy.CalculateField_management(sf,"area","!面积!","PYTHON_9.3")
... arcpy.DeleteField_management(sf,["烈度", "时间", "地点", "震级", "深度", "死亡", "受伤", "经济损失", "长轴", "短轴", "面积", "方位角"])
###########################################################################################
#python语言对格式的要求非常严格
#不同层次的语句要严格按照各自层次进行行缩进
#如一层次与其子母层次各有4个空格的缩进差
#字符串中,u+"中文"每个中文字符占1个字节,"中文"每个中文字符占3个字节
############################################################################################
#row[0]对字段值进行更新的操作在优先级上明显优先于计算字段的多步赋值操作
import arcpy
... from arcpy import env
... env.workspace = "D:/资料集/123.gdb"
##########################################################################
... fcList = arcpy.ListFeatureClasses()
... for sf in fcList:
##########################################################################
... arcpy.AddField_management(sf, "date", "TEXT", 9, "", "", "发震日期", "NULLABLE", "NON_REQUIRED")
... arcpy.AddField_management(sf, "time", "TEXT", 9, "", "", "发震时刻", "NULLABLE", "NON_REQUIRED")
... arcpy.AddField_management(sf, "name", "TEXT", 18, "", "", "地震名称", "NULLABLE", "NON_REQUIRED")
... arcpy.AddField_management(sf, "major_axis", "LONG", 9, "", "", "长轴长度", "NULLABLE", "NON_REQUIRED")
... arcpy.AddField_management(sf, "minor_axis", "LONG", 9, "", "", "短轴长度", "NULLABLE", "NON_REQUIRED")
... arcpy.AddField_management(sf, "direction", "TEXT", 9, "", "", "长轴方向", "NULLABLE", "NON_REQUIRED")
... arcpy.AddField_management(sf, "epicenter", "TEXT", 9, "", "", "烈度", "NULLABLE", "NON_REQUIRED")
... arcpy.AddField_management(sf, "area", "TEXT", 9, "", "", "面积", "NULLABLE", "NON_REQUIRED")
##########################################################################
#python的强制类型转换比较容易即str(a)将a转换为string型变量
#这里可以着重注意if语句的格式,以及elif的特殊写法
... fields = ['方位角']
... with arcpy.da.UpdateCursor(sf,fields) as cursor:
... for row in cursor:
... if len(row[0]) == 4:l = long(row[0][1:3])
... elif len(row[0]) == 3:l = long(row[0][1:2])
... elif len(row[0]) == 1:l = -2
... elif len(row[0]) == 2:l = -1
... if l > 45:
... if l < 90:x = 2
... elif l < 45:
... if l > 0:x = 3
... elif l == 45:l = -1
... cursor.updateRow(row)
... if l == -1:arcpy.CalculateField_management(sf,"direction","!方位角![:1]+!方位角![-1:]","PYTHON_9.3")
... elif x == 2:arcpy.CalculateField_management(sf,"direction","!方位角![:1]+!方位角![-1:]+!方位角![-1:]","PYTHON_9.3")
... elif x == 3:arcpy.CalculateField_management(sf,"direction","!方位角![:1]+!方位角![:1]+!方位角![-1:]","PYTHON_9.3")
... elif l == -2:arcpy.CalculateField_management(sf,"direction","!方位角![:1]","PYTHON_9.3")
##############################
#根据l值选择不同arcpy.CalculateField_management()操作方式的局限性太大,系统无法根据row[0]中的每个值进行判断及操作,而是len(row[0])出了不同值之后,l的值
是依据最后一个len值产生的,导致计算字段时的方法选择总是根据字段中最后一个字段值的len操作的出数值进行,而出现大面积错误,故我直接在row[0]操作时候更新字段
值,再将更新过的方位角字段通过计算字段赋值给direction字段。方法如下:
... fields = ['方位角']
... with arcpy.da.UpdateCursor(sf,fields) as cursor:
... for row in cursor:
... if len(row[0]) == 4:l = long(row[0][1:3])
... elif len(row[0]) == 3:l = long(row[0][1:2])
... elif len(row[0]) == 1:row[0] = row[0]
... elif len(row[0]) == 2:row[0] = row[0]
... if l > 45:
... if l < 90:
... if len(row[0]) == 3:row[0] = row[0][0]+row[0][2]+row[0][2]
... elif len(row[0]) == 4:row[0] = row[0][0]+row[0][3]+row[0][3]
... elif l < 45:
... if l > 0:
... if len(row[0]) == 3:row[0] = row[0][0]+row[0][0]+row[0][2]
... elif len(row[0]) == 4:row[0] = row[0][0]+row[0][0]+row[0][3]
... elif l == 45:row[0] = row[0][0] + row[0][3]
... cursor.updateRow(row)
... arcpy.CalculateField_management(sf,"direction","!方位角!","PYTHON_9.3")
############################################################################################################################################################以下部分是对字段中的每个值进行操作,而不是整个字段(取值,而不是笼统的!字段名!对整个字段进行操作)
#对字段值进行操作:举个例子
#fields = ['字段0','字段1']
#row[0] 即为字段0的值进行操作,而row[1]即为对字段1的值进行操作,以此类推
#cursor.updateRow(row)更新字段值
... fields = ['direction']
... with arcpy.da.UpdateCursor(sf,fields) as cursor:
... for row in cursor:
#这里我用了字符串的置换命令,row[0].replace('a',u'是')表示将row[0]字符串中的'a'转换为单个中文只占用一个字节的中文字符'是'
... row[0] = row[0].replace('N',u'北')
... row[0] = row[0].replace('S',u'南')
... row[0] = row[0].replace('W',u'西')
... row[0] = row[0].replace('E',u'东')
... cursor.updateRow(row)
###########################################################################
#arcpy的底层语言可能不是python语言
#a = 'a' a = "a" a = "'a'"python语言都可以识别,他对符号的判断不是很严格
#arcpy中每个参数都要严格使用""
... arcpy.CalculateField_management(sf,"date","!时间!","PYTHON_9.3")
... arcpy.CalculateField_management(sf,"name","!地点!+str('!震级!')+u'级地震'","PYTHON_9.3")
... arcpy.CalculateField_management(sf,"major_axis","!长轴!","PYTHON_9.3")
... arcpy.CalculateField_management(sf,"minor_axis","!短轴!","PYTHON_9.3")
... arcpy.CalculateField_management(sf,"epicenter","!烈度!","PYTHON_9.3")
... arcpy.CalculateField_management(sf,"area","!面积!","PYTHON_9.3")
... arcpy.DeleteField_management(sf,["烈度", "时间", "地点", "震级", "深度", "死亡", "受伤", "经济损失", "长轴", "短轴", "面积", "方位角"])
###########################################################################################
#python语言对格式的要求非常严格
#不同层次的语句要严格按照各自层次进行行缩进
#如一层次与其子母层次各有4个空格的缩进差
#字符串中,u+"中文"每个中文字符占1个字节,"中文"每个中文字符占3个字节
############################################################################################
#row[0]对字段值进行更新的操作在优先级上明显优先于计算字段的多步赋值操作
相关文章推荐
- 在ArcGIS中,用Python脚本批量修改FeatureClass的名称与字段
- ARCGIS中Python实现按属性字段批量掩膜提取
- 使用 python,批量修改 mongdb 的字段类型
- Android开发,实现可多选的图片ListView,便于批量操作
- 基于ArcGIS10.0和Oracle10g的空间数据管理平台(C#开发)-AE常用操作代码
- python开发_python文件操作
- ArcGIS Python arcpy 批量创建SDE空间索引
- win7环境下使用sublime text搭建python开发环境并使用SublimeREPL实现交互操作
- Android开发,实现可多选的图片ListView,便于批量操作
- 用友nc65 uap开发 nc.vo.bd.meta.BatchOperateVO(批量操作的包装VO)转aggvo
- Python操作MongoDB 新建不同的collection 批量插入数据库
- python开发_tkinter_单选菜单_不可用菜单操作
- python-使用用户与密码登录验证的检索特定字段ver1(含文件操作知识)
- python开发之list操作实例分析
- 基于ArcGIS10.0和Oracle10g的空间数据管理平台(C#开发)-AE常用操作代码
- python编程开发之日期操作实例分析
- Python之虚拟机操作:利用VIX二次开发,实现自己的pyvix(系列一)成果展示和python实例
- python写的批量操作远程主机脚本(命令执行,上传、下载文件)
- 利用python fabric模块写的批量操作远程主机脚本(命令执行,上传、下载文件)
- 在arcgis使用python脚本进行字段计算时是如何解决中文问题的