Prima di tutto, grazie per tutte le risposte e i commenti. Sfortunatamente, gli strumenti esistenti non erano completamente compatibili con le ultime versioni di QGIS e ArcGIS. Pertanto ho creato la mia soluzione utilizzando lo strumento indicato da @polygeo, il plug-in QGIS di @Alexandre e il nome dell'algoritmo (mappa a quattro colori) di @Jens.
Ecco il mio codice per chi è interessato (per ArcGIS ma la seconda parte potrebbe essere usata anche in QGIS).
arcpy.MakeFeatureLayer_management(fc, fc[:-4]+ "_lyr" )
try:
arcpy.AddField_management(fc[:-4] + "_lyr", "color", "SHORT")
except:
print "field alread exists"
arcpy.CalculateField_management(fc[:-4] + "_lyr", "color", "10" , "PYTHON")
arcpy.PolygonNeighbors_analysis(fc[:-4] + "_lyr", fc[:-4] + "_tb.dbf" )
graph = []
cursor=arcpy.da.SearchCursor( fc[:-4] + "_tb.dbf" , ("src_FID","nbr_FID") )
for row in cursor:
graph.append(row)
pols = arcpy.da.UpdateCursor(fc[:-4] + "_lyr", ("OID@","color"))
colored = []
for pol in pols:
nbrs = [ second for first, second in graph if first == pol[0]]
usedcolors = []
for nbr in nbrs:
usedcolors += [second for first, second in colored if first == nbr]
pol[1]=[color for color in range(10) if color not in usedcolors][0]
colored.append(pol)
pols.updateRow(pol)
Si noti che l'algoritmo non garantisce che vengano utilizzati solo 4 colori: sebbene sia stata dimostrata l'esistenza della soluzione, la "forza bruta" è necessaria per raggiungerla. Nel mio caso, ho ottenuto 7 colori che sono abbastanza piccoli. Lo script potrebbe avere un ciclo aggiuntivo fino a quando non viene trovata la soluzione, ma ho bisogno di farlo per centinaia di mappe e 7 colori è OK.