Генератор последовательных идентификаторов Python ArcGIS - PullRequest
0 голосов
/ 01 марта 2019

Привет сообщество stackoverflow,

У меня есть только 2 месяца опыта работы с Python, но я решил попробовать себя в проекте для класса и в конечном итоге включить его в свою работу.

Я работаю сМы с ArcGIS хотим создать зацикленный скрипт, который обновляет идентификаторы в поле на основе поля «Система».Пример: если системное поле 'Chaparral', то я хочу, чтобы поле идентификатора начиналось с букв 'CH-HY', затем установите счетчик +1, который добавляет 1 к существующему идентификатору, уже существующему в поле, например 'CH-HY0006».Вот что у меня сейчас.

Заполните поле ID гидранта

with arcpy.da.UpdateCursor("Hydrants.shp", ["FACILITYID", "SYSTEM"]) as cursor:
    for row in cursor:
        if (row[0] == '<Null>' and row[1] == 'Chaparral'):
            row [0] = 'CH-HY{}'.format(int1) 
        elif (row[0] == '<Null>' and row[1] == 'SunCity'): 
            row [0] = 'SC-HY{}'.format(int2) 
    cursor.updateRow(row)

Вот где я застрял.Как получить идентификаторы, которые уже находятся в поле, и получить наибольшее число, чтобы я мог добавить 1 к нему.Я действительно хочу избежать создания дубликатов в одной системе любой ценой.

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Чтобы получить последний существующий идентификатор, я использовал Search.Cursor, как это для System of Chaparral:

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)

Мне придется взглянуть на re.search, потому что я вижу, что этот метод вызывает проблему, когда целое число достигает 9,999, а int [-4] необходимо изменить на [-5], чтобы вместить 10 000.

Спасибо за отзывы, ребята!

0 голосов
/ 01 марта 2019

Если вы пишете только для заполнения поля, а не для чтения и записи - вы можете создать переменную состояния вне цикла, чтобы отслеживать индекс.

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)

Если вы планируетепри чтении из уже существующих данных вам, возможно, придется ввести регулярное выражение для анализа через 'FACILITYID' и найти самый высокий индекс.

...