Ho visto un'ottima interfaccia per FME con Python
Cosa ci state facendo ragazzi? Voglio idee.
Ho visto un'ottima interfaccia per FME con Python
Cosa ci state facendo ragazzi? Voglio idee.
Risposte:
Sto appena iniziando con FME e sto usando uno script di arresto per copiare il mio FGDB di destinazione in un'altra posizione e per salvare il file di registro:
import distutils.dir_util, shutil, os, time, locale
src = 'C:/Testing/FME/TPW/Third_Party_Wells.gdb'
dst = '//share/Data Services/GIS Data/Data/Third Party Wells/Third_Party_Wells.gdb'
distutils.dir_util.copy_tree(src, dst)
logfile = FME_LogFileName
shutil.copy(logfile, 'C:/temp/PRD_' + os.path.basename(logfile)[:-4] + '_' + time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime()) + '.log')
# Get features written counts
shl_count = str(FME_FeaturesWritten['ThirdPartyWellsSurface'])
bhl_count = str(FME_FeaturesWritten['ThirdPartyWellsBottom'])
lat_count = str(FME_FeaturesWritten['ThirdPartyWellsLaterals'])
# Write out features written counts to log
fm_log = open('C:/temp/PRD_Counts.log','a')
fm_log.write(time.strftime('%m/%d/%Y %I:%M:%S', time.localtime()) + ',' + shl_count + ',' + bhl_count + ',' + lat_count + ',' + str(FME_TotalFeaturesWritten) + '\n')
È piuttosto semplice, ma in realtà non c'è limite, non credo. Ci sono tonnellate di idee anche qui .
EDIT: aggiunto nel codice per ottenere il numero di funzioni scritte e inviarle al file di registro CSV.
Dai un'occhiata al Python Corner di Oliver. Ci sono un sacco di cose che puoi fare usando Python in FME.
Uso spesso PythonCaller per effettuare alcune attribuzioni all'interno di 1 trasformatore anziché utilizzare 10 trasformatori diversi (se elif elif else ..)
Puoi avere PythonCaller molto semplici come questo esempio che convertirà tutti i tuoi attributi in valori maiuscoli:
def upperAll(feature):
for att in feature.getAttributeList():
feature.setAttribute(att,feature.gettAttribute(att).upper())
Uso anche PythonCaller per inviare e-mail in caso di errore o interagire con un server FTP ecc. Non ci sono davvero limiti
Buon divertimento e felice FMEing
Jeff
Un buon esempio sopra: attualmente sto scrivendo un articolo per la nostra knowledge base chiamato FMEPedia qui: Python e FME Basics .
Ciò include alcuni semplici esempi come l'eliminazione di un file prima di eseguire un'area di lavoro con uno script di avvio, la manipolazione di funzionalità con un PythonCaller ecc. Ci sono anche collegamenti ad esempi più complessi.
Software sicuro Ken Bragg
Esempi:
Registro personalizzato
import os.path, time, os, datetime, __main__ , sys, pyfme,shutil
from pyfme import *
class expFeature(object):
def __init__(self):
self.logger = pyfme.FMELogfile()
pass
def close(self):
try:
#folders creation
os.makedirs(param_folder)
#Log creation
logFile = param_folder + timecreated +".log"
FILE = open(logFile,"w")
log=FMELogfile(logFile)
log.log("Bla bla bla")
E invia e -mail :
message = MIMEMultipart()
message["From"] = email_from
message["To"] = email_to
message['Date'] = formatdate(localtime=True)
message["Subject"] = subject
message.attach( MIMEText(html, 'html') )
attachment = MIMEBase('application', "octet-stream")
attachment.set_payload( open(FileLog,"rb").read() )
Encoders.encode_base64(attachment)
attachment.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(FileLog))
message.attach(attachment)
smtp = smtplib.SMTP(smtpServer)
smtp.sendmail(email_from, email_to, message.as_string())
print "Successfully sent email"
smtp.close()
Recentemente ho usato un trasformatore PythonCaller che ottiene le coordinate da un file CSV e le salva come attributi. Il CSV viene scritto da un altro spazio di lavoro che utilizza un trasformatore BoundsExtractor che ottiene le coordinate di delimitazione da un riquadro di delimitazione della mia area di interesse.
Passo quindi questi attributi ad altri WorkspaceRunner che usano le coordinate di delimitazione come finestra di ricerca per ulteriori elaborazioni. Ho dati a livello statale e l'elaborazione su tutto lo stato richiederebbe diverse ore. Poiché limito la mia elaborazione a una determinata finestra, l'intera operazione richiede un minuto.
Il codice pythonCaller è qui:
import fmeobjects
import csv
import re
# Template Function interface:
def getBounds(feature):
outputDirectory = FME_MacroValues['Output_Directory'] # Set outputDirectory
NativeTitle = FME_MacroValues['Native_Title'] # Set NativeTitle
NativeTitle = re.sub('\W','_',NativeTitle)
NativeTitle = re.sub(' ','_',NativeTitle)
csvPath = outputDirectory + '\\' + NativeTitle + '_boundingbox.csv' # Set csvPath
# open csv file containing bounding coordinates
with open(csvPath, 'rb') as csvfile:
reader = csv.reader(csvfile, delimiter = ',')
bounds = reader.next()
# Set bounding variables
XMIN = float(bounds[0])
XMAX = float(bounds[1])
YMIN = float(bounds[2])
YMAX = float(bounds[3])
# Set attributes to variable values
feature.setAttribute("_xmin", XMIN)
feature.setAttribute("_ymin", YMIN)
feature.setAttribute("_xmax", XMAX)
feature.setAttribute("_ymax", YMAX)
pass
Uso anche uno script di avvio di Python che copia un albero delle cartelle in un'altra posizione se non esiste già.
import os
import fmeobjects
import shutil
srcDir_project = r'W:\AlignmentSheets\PostInstall\Alignment Sheet Generator\ProjectData\ProjectNameFolder'
srcDir_settings = r'W:\AlignmentSheets\PostInstall\Alignment Sheet Generator\ProjectData\Settings'
destBaseDir = FME_MacroValues['Output_Directory']
destDir_project = destBaseDir + '\\' + FME_MacroValues['A_Sheet_Project_Name'] + '\\'
destDir_settings = destBaseDir + '\\Settings\\'
if not os.path.exists(destDir_project):
shutil.copytree(srcDir_project,destDir_project)
print 'Successfully created "%s"' % destDir_project
else:
print '"%s" Already Exists. Not Creating Folder.' % destDir_project
if not os.path.exists(destDir_settings):
shutil.copytree(srcDir_settings,destDir_settings)
print 'Successfully created "%s"' % destDir_settings
else:
print '"%s" Already Exists. Not Creating Folder.' % destDir_settings