0

编辑:我正在努力寻找最好的解决方案,虽然我只熟悉 Python,但我想做的事情不应该那么难或花那么长时间。我编辑了标题以询问使用 R 或其他程序的选项。

我正在使用 Python 2.7 的 64 位计算机上的 ArcGIS 10.1 中应对以下挑战。

  • 我有一个包含三个字段的表:ID#、“收入”和“直播”——以及 210 万条记录。

  • 我正在尝试通过将 fGDB 的名称与此表中的 ID# 匹配来从 fGDB 中提取要素类,将两个字段添加到 FC,并使用收入和实时数据值填充这些字段。

  • 我的脚本包括一层又一层的 for 循环、if 语句和搜索游标。尽管它在小批量测试中工作,但它对真实数据的处理时间很长,因为它正在搜索 210 万条记录。

  • 我在下面包含了我的脚本,它可以工作 - 并且还显示了我的逻辑流程,这是我需要指导的地方......

将很长的记录列表与一组要素类进行比较/匹配时,最佳策略是什么?

import arcpy
import sys
import os

#Read through DBF. 
#For each record, locate it in fGDB and add fields REVENUE and LIVE

# Use searchCursor to find ID and REV value and LIVE value
#fc = #ID by the APR16ID

fields = ["APR16_ID","REVENUE", "LIVE"]

workspace = "C:\\FILE\\"
arcpy.env.workspace = workspace

#Table of values to append to each FC in the fGDB
table = "C:\\FILE\\FinalTest.gdb\\AUG_REV_BY_APRID" 

#DIRECTORYPATH = the fGDB that has the FeatureClasses that are to have data appended to them. 

directorypath = workspace + "DON_d2.gdb" 

#Use searchcursor to determine APR16_ID...

cursor = arcpy.da.SearchCursor(table, fields) 
for row in cursor:
        fc = str("don_d2_"+"{0}".format(row[0]))
        print fc
        RevVAL = str(row[1])
        print RevVAL
        LiveVAL = str(row[2])
        print LiveVAL

        for dirpath, dirnames, fgdb in arcpy.da.Walk(directorypath,
                                                     datatype="FeatureClass",
                                                     type="Polygon"):
            for donut in fgdb:
                if str(donut)==str(fc):
                    print donut + " : this is the same as " + fc

                    ##Append data to donuts_d2
                    d2_fc = workspace+"DON_d2.gdb\\"+fc
                    arcpy.AddField_management(d2_fc, "REVENUE", "FLOAT")
                    arcpy.AddField_management(d2_fc, "LIVE", "FLOAT")
                    arcpy.GetMessages()

                    #new SearchCursor for that feature
                    dons = arcpy.UpdateCursor(d2_fc, fields)
                    for don in dons:
                        don.setValue("REVENUE",RevVAL)
                        don.setValue("LIVE",LiveVAL)
                        dons.updateRow(don)
                        arcpy.GetMessages()
                else:
                    pass 
4

0 回答 0