利用arcpy实现arcgis批量处理

本文介绍了如何利用arcpy脚本实现arcgis的批量处理,包括数据库操作、属性表字段处理和数据拼接。针对mdb文件的限制,建议使用gdb数据库,并提供了要素类和独立属性表的处理代码示例。
摘要由CSDN通过智能技术生成

前言

Arctoolbox提供了批处理的根据(右击工具,点击batch),但有些batch是假的,只能处理第一行数据,又或者有很多复杂操作糅合在一起,这时候就需要利用arcpy编写脚本,实现arcgis的批量处理。

编写与运行

(1)运行

可以单独新建py文件独立运行,也可以在arcmap点击“python”,弹出命令行,将代码复制过来运行。其语法和python一样,arcgis的功能函数通过“import arcpy”,然后通过arcpy. 来调用。
在这里插入图片描述

(2)编译

用python编译根据比如pycharm的话,需要在pycharm中设置编译器,需要选择随arcgis一同安装的python包里的编译器。
在这里插入图片描述
但是pycharm解决不了不识别中文路径的问题,因此在pycharm中运行不了,但是可单独运行。

语句执行的时间

有些关键性语句,比如数据库中的删除和创建,是需要时间的,因此最好在该语句后加入等待时间“time.sleep(5)”,这样紧接着你想再创建刚刚删除的要素才不会出错。

数据库中要素的操作

arcpy有时候没法对数据库中的数据直接进行操作,需要创建视图view,因此一半会创建数据库中数据的视图,再调用功能函数进行处理。尤其是mdb数据文件,非常不建议使用。
使用mdb文件会带来以下几个问题:
①数据量过大时(比如将图片存入数据库),会导致数据库中的数据无法修改也无法创建。
②一些功能函数操作对于mdb数据库文件会十分复杂。
因此建议直接使用文件型gdb数据库,既没有奇奇怪怪的问题,也没有大小限制。可以将mdb数据局数据导入gdb,再将结果从gdb导入mdb替换。

属性表字段名称的长度

属性表字段名称的长度是有限制的,尤其是从数据库中将属性表导出至文件目录时,超过10个字符的字段名称将会被系统自动截断。因此建议将所有的临时数据放在gdb数据库中,不要直接倒进导进文件目录下。
下面给出2中处理字段名称的代码:

(1)方法1

使用fieldmap,但是这种方法没法将fieldmap写进数据库

# 
import arcpy
workpath="D:"
arcpy.env.workspace=workpath
dbpath="test.mdb"
table_name="test.xls/Sheet1$"
table_ID="ID"

# FW_JTCY
input_name="FW_JTCY"
input_ID="pip"
output_name = "FW_JTCY1"
arcpy.TableToDBASE_conversion(dbpath+"/"+input_name, workpath)
arcpy.MakeTableView_management(workpath+"/"+input_name+".dbf", "temp")
arcpy.AddField_management("temp","pip","TEXT",field_length=19)
arcpy.CalculateField_management("temp","pip",'!BDCDYH![0:19]', "PYTHON_9.3")
time.sleep(5)
arcpy.AddJoin_management("temp", "pip", table_name, table_ID, "KEEP_COMMON")
fieldmappings = arcpy.FieldMappings()
infields = arcpy.ListFields("temp")
for infield in infields:
     if "SHAPE" in infield.name or "hape" in infield.name or "OBJECTID" in infield.name or "Sheet1" in infield.name: continue
     fieldmap = arcpy.FieldMap()
     fieldmap.addInputField("temp", infield.name)
     outname = infield.name[8:]
     outfield = fieldmap.outputField
     outfield.name = outname
     fieldmap.outputField = outfield
     fieldmappings.addFieldMap(fieldmap)
     del fieldmap, outfield
arcpy.TableToTable_conversion("temp",workpath, output_name, "", fieldmappings)
arcpy.Delete_management("temp")
arcpy.Delete_management(input_name+".dbf")
arcpy.Delete_management(dbpath+"/"+input_name)
time.sleep(5)
arcpy.TableToTable_conversion(output_name+".dbf",dbpath, input_name)
arcpy.Delete_management(output_name+".dbf")

(2)方法2

用AlterField函数,但是输入不能是join的临时文件

# 
fields = arcpy.ListFields("temp")
for field in fields:
     fname = field.name
     if "SHAPE" in fname or "shape" in fname or "OBJECTID" in fname or "Sheet1" in fname: continue
     newname = fname[7:]
     arcpy.AlterField_management("temp",fname,newname)

要素类数据处理代码示例

以下代码主要实现功能:要素数据在mdb数据库的要素数据集中,需要和表格数据进行匹配,保留匹配的记录行。

import arcpy

workpath="D:
outpath ="TEMP.gdb"
#workpath = unicode(workpath, "utf-8")
arcpy.env.workspace=workpath
#下面需要修改
dbpath="test.mdb/data"
#dbpath = unicode(dbpath, "utf-8")
#下面需要修改
table_name="test.xls/Sheet1$"
#table_name = unicode(table_name, "utf-8")
table_ID="ID"

# 创建临时数据库
arcpy.CreateFileGDB_management(workpath, outpath)

# 宗地图数据处理
input_name="ZD_K_321183"
input_ID="DJH"
output_name = "ZD_K1_321183"
arcpy.MakeFeatureLayer_management (dbpath+"/"+input_name, "temp")
arcpy.AddJoin_management( "temp", input_ID, table_name, table_ID, "KEEP_COMMON")
fieldmappings = arcpy.FieldMappings()
infields = arcpy.ListFields("temp")
for infield in infields:
     if "SHAPE" in infield.name or "hape" in infield.name or "OBJECTID" in infield.name or "Sheet1" in infield.name: continue
     fieldmap = arcpy.FieldMap()
     fieldmap.addInputField("temp", infield.name)
     outname = infield.name[12:]
     outfield = fieldmap.outputField
     outfield.name = outname
     fieldmap.outputField = outfield
     fieldmappings.addFieldMap(fieldmap)
     del fieldmap, outfield
arcpy.FeatureClassToFeatureClass_conversion("temp",dbpath, output_name, "", fieldmappings)
arcpy.Delete_management("temp")
arcpy.Delete_management(dbpath+"/"+input_name)
time.sleep(5)
arcpy.CopyFeatures_management(dbpath+"/"+output_name,dbpath+"/"+input_name)
arcpy.Delete_management(dbpath+"/"+output_name)
arcpy.Delete_management(input_name)

# 删除临时数据库
arcpy.Delete_management(outpath)

独立属性表数据处理代码示例

以下代码主要实现功能:独立属性表在mdb数据库中,需要和表格数据进行匹配,保留匹配的记录行,这里以gdb数据库为中介,否则会出现属性表字段名称的各种问题。

import arcpy
workpath="D:"
outpath ="TEMP.gdb"
arcpy.env.workspace=workpath
dbpath="test.mdb"
table_name="test.xls/Sheet1$"
table_ID="ID"

# FW_FCQLR
input_name="FW_FCQLR"
input_ID="QLRBH"
output_name = "FW_FCQLR1"
arcpy.TableToTable_conversion(dbpath+"/"+input_name, outpath,input_name)
arcpy.MakeTableView_management(outpath+"/"+input_name+".dbf", "temp")
arcpy.AddJoin_management("temp", input_ID, table_name, table_ID, "KEEP_COMMON")
arcpy.TableToTable_conversion("temp", outpath,output_name)
arcpy.Delete_management("temp")
arcpy.Delete_management(dbpath+"/"+input_name)
time.sleep(5)
arcpy.TableToTable_conversion(outpath+"/"+output_name+".dbf",dbpath, input_name)

# 删除临时数据库
arcpy.Delete_management(outpath)

批量拼接数据库

参考博文:https://blog.csdn.net/Putin_leon/article/details/80571061?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166148370316782391864444%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=166148370316782391864444&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-1-80571061-null-null.142v42pc_rank_34,185v2control&utm_term=arcgis%E6%8B%BC%E6%8E%A5%E6%95%B0%E6%8D%AE%E5%BA%93&spm=1018.2226.3001.4187

此处对原博文代码做一下修改,在使用Append函数时使用No_test字段,使得数据格式不完全一样的数据也能正常拼接

import sys
reload(sys)
sys.setdefaultencoding("utf-8")
import arcpy
import string
 
try:
    workspace = 'C:\Users\Administrator\Desktop\\cc'
    outdb = 'C:\Users\Administrator\Desktop\\lutian.mdb'
    arcpy.env.workspace = workspace
    files = arcpy.ListFiles("*.*db")
    arcpy.env.workspace = outdb
    fcs = arcpy.ListFeatureClasses()
    fcs = fcs + arcpy.ListTables()
    dss = arcpy.ListDatasets()
    for File in files:
        for fc in fcs:
            arcpy.Append_management(workspace + "\\" + File + "\\" + fc, outdb + "\\" + fc ,"NO_TEST" , "" ,"")
        for ds in dss:
            fcs1 = arcpy.ListFeatureClasses(feature_dataset = ds)
            for fc1 in fcs1:
                arcpy.Append_management(workspace + "\\" + File + "\\" + ds + "\\" + fc1, outdb + "\\" + ds + "\\" + fc1 ,"NO_TEST" , "" ,"")
 
except arcpy.ExecuteError:
    print arcpy.GetMessages()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值