ArcMap 10.4 com Python: Numeração Sequencial por Seleção
- Adauto Costa

- 4 de set.
- 1 min de leitura
Atualizado: há 6 dias
Automatizar processos no ArcMap 10.4 com Python pode poupar muito tempo, especialmente em tarefas repetitivas como atribuir IDs sequenciais a feições selecionadas.
O script abaixo faz exatamente isso: numera as feições selecionadas em uma camada, com base em um campo de ordenação, e grava os valores em um campo de destino.
O que o script faz?
Localiza a camada desejada pelo nome (troque [LAYER] pelo nome da sua camada em Table of Contents).
Verifica se há feições selecionadas – só funciona com seleção ativa.
Cria automaticamente o campo de destino (ID) caso não exista.
Ordena as feições pelo campo definido (troque [FIELD] pelo nome do atributo do shapefile alvo da ordenação).
Atribui IDs sequenciais a partir do valor inicial (start_value = 1).
Atualiza o mapa e a TOC para refletir as mudanças em tempo real.
import arcpy
layer_name = u"[LAYER]"
order_field = "[FIELD]"
target_field = "ID"
start_value = 1
mxd = arcpy.mapping.MapDocument("CURRENT")
df = mxd.activeDataFrame
lyr_list = arcpy.mapping.ListLayers(mxd, layer_name, df)
if not lyr_list:
arcpy.AddError(u"Camada '{}' não encontrada.".format(layer_name))
raise SystemExit
lyr = lyr_list[0]
sel = lyr.getSelectionSet()
if not sel:
arcpy.AddError(u"Selecione as feições antes de rodar.")
raise SystemExit
if target_field not in [f.name for f in arcpy.ListFields(lyr)]:
arcpy.AddField_management(lyr, target_field, "LONG")
oid_field = arcpy.Describe(lyr).OIDFieldName
# lê apenas feições selecionadas
rows = [(r[0], r[1]) for r in arcpy.da.SearchCursor(lyr, [oid_field, order_field]) if r[0] in sel]
rows_sorted = sorted(rows, key=lambda t: t[1])
seq_map = {}
seq = start_value
for oid, _ in rows_sorted:
seq_map[oid] = seq
seq += 1
with arcpy.da.UpdateCursor(lyr, [oid_field, target_field]) as cur:
for row in cur:
oid = row[0]
if oid in seq_map:
row[1] = seq_map[oid]
cur.updateRow(row)
arcpy.RefreshActiveView()
arcpy.RefreshTOC()
print("{} feições numeradas em '{}'.".format(len(seq_map), layer_name))
Gostou? Compartilhe!














Comentários