Python 基于ArcGIS的顺序ID生成器

Python 基于ArcGIS的顺序ID生成器,python,loops,arcgis,arcpy,Python,Loops,Arcgis,Arcpy,大家好,我的社区 我只有2个月的python经验,但我决定用一个课程的项目来挑战自己,并最终将其融入到我的工作中 我与ArcGIS合作,希望创建一个循环脚本,根据“系统”字段更新字段上的ID。示例:如果系统字段为“Chaparral”,则我希望ID字段以字母“CH-HY”开头,然后设置一个计数器+1,将1添加到字段中已有的ID中,如“CH-HY0006”。这是我现在拥有的 填充消防栓ID字段 使用arcpy.da.updateCursors(“Hydrants.shp”、[“FACILITYID

大家好,我的社区

我只有2个月的python经验,但我决定用一个课程的项目来挑战自己,并最终将其融入到我的工作中

我与ArcGIS合作,希望创建一个循环脚本,根据“系统”字段更新字段上的ID。示例:如果系统字段为“Chaparral”,则我希望ID字段以字母“CH-HY”开头,然后设置一个计数器+1,将1添加到字段中已有的ID中,如“CH-HY0006”。这是我现在拥有的

填充消防栓ID字段
使用arcpy.da.updateCursors(“Hydrants.shp”、[“FACILITYID”、“SYSTEM”])作为光标:
对于光标中的行:
如果(第[0]行==''和第[1]行=='Chaparral'):
行[0]=“CH-HY{}”。格式(int1)
elif(第[0]=''行和第[1]=='太阳城'):
行[0]=“SC-HY{}”。格式(int2)
cursor.updateRow(行)

这就是我被困的地方。如何检索字段中已经存在的ID并获取最大的数字,以便向其中添加1。我真的希望不惜一切代价避免在同一个系统中创建重复项。

如果您只是为了填充字段而写,而不是读写-您可以在循环之外创建一个状态变量来跟踪索引

with arcpy.da.UpdateCursor("Hydrants.shp", ["FACILITYID", "SYSTEM"]) as cursor:
    chaparral_index = 0
    Suncity_index = 0
    for row in cursor:
        if (row[0] == '<Null>' and row[1] == 'Chaparral'):
            row [0] = 'CH-HY{}'.format(chaparral_index)
            chaparral_index += 1 
        elif (row[0] == '<Null>' and row[1] == 'SunCity'): 
            row [0] = 'SC-HY{}'.format(Suncity_index)
            Suncity_index += 1 
    cursor.updateRow(row)
使用arcpy.da.updateCursors(“Hydrants.shp”、[“FACILITYID”、“SYSTEM”])作为光标:
查帕拉尔指数=0
太阳城指数=0
对于光标中的行:
如果(第[0]行==''和第[1]行=='Chaparral'):
第[0]行='CH-HY{}'。格式(查帕拉索引)
查帕拉指数+=1
elif(第[0]=''行和第[1]=='太阳城'):
行[0]=“SC-HY{}”。格式(Suncity_索引)
太阳城指数+=1
cursor.updateRow(行)

如果您计划从预先存在的数据中读取数据,那么可能需要引入regex来解析“FACILITYID”,并找到最高的索引

为了检索现有的最后一个ID,我进行了搜索。查帕拉尔系统的光标如下:

CHvalues = [row[0] for row in arcpy.da.SearchCursor("Hydrants.shp", "FACILITYID", "SYSTEM = 'Chaparral'")]

CHuniqueValues = max(CHvalues)

CHintLastVal = int(CHuniqueValues[-4:])
下面是我如何将其实现到循环中的:

with arcpy.da.UpdateCursor("Hydrants.shp", ["FACILITYID", "SYSTEM"]) as cursor:
for row in cursor:
    if ((row[0] == None or  row[0] == '<Null>' or row[0] == '') and row[1] == 'Chaparral'):
        CHintLastVal = CHintLastVal + 1
        CHstr099 = str(CHintLastVal)
        print('CH-HY{}'.format(CHstr099))
        row [0] = 'CH-HY{}'.format(CHstr099)
使用arcpy.da.updateCursors(“Hydrants.shp”、[“FACILITYID”、“SYSTEM”])作为光标:
对于光标中的行:
如果((第[0]行==无或第[0]行==''或第[0]行=='')和第[1]行=='Chaparral'):
CHintLastVal=CHintLastVal+1
CHstr099=str(CHintLastVal)
打印('CH-HY{}'。格式(CHstr099))
行[0]=“CH-HY{}”。格式(CHstr099)
我将不得不研究re.search,因为我可以看到这个方法在整数达到9999时会导致问题,并且int[-4]需要更改为[-5]以适应10000


谢谢大家的反馈

您可以有一个具有要跟踪的字段状态的类。查看regex,因为我还并没有了解它。我认为再搜索(“^CH-HY”和“”)可以解决这个问题。不过我对它不太熟悉。我可以直接在“FACILITYID”字段中搜索,还是需要在SearchCursor循环中执行搜索?是的,你知道了。要找到上次停止的索引,需要使用SearchCursor遍历整个数据库。如果正则表达式找到的数字大于存储为最大数字的数字,则替换,依此类推。正则表达式字符串类似于re.search(r'CH-HY(\d+),{your string})。查看RegexOne以了解有关regex的更多信息
with arcpy.da.UpdateCursor("Hydrants.shp", ["FACILITYID", "SYSTEM"]) as cursor:
for row in cursor:
    if ((row[0] == None or  row[0] == '<Null>' or row[0] == '') and row[1] == 'Chaparral'):
        CHintLastVal = CHintLastVal + 1
        CHstr099 = str(CHintLastVal)
        print('CH-HY{}'.format(CHstr099))
        row [0] = 'CH-HY{}'.format(CHstr099)