J'ai vu une excellente interface avec FME avec Python
Qu'est-ce que vous en faites? Je veux des idées.
J'ai vu une excellente interface avec FME avec Python
Qu'est-ce que vous en faites? Je veux des idées.
Réponses:
Je viens de commencer avec FME et j'utilise un script d'arrêt pour copier mon FGDB cible vers un autre emplacement et pour enregistrer le fichier journal:
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')
C'est assez basique, mais il n'y a vraiment pas de limite, je ne pense pas. Il y a aussi des tonnes d'idées ici .
EDIT: ajouté dans le code pour obtenir le nombre de fonctionnalités écrites et les pousser vers le fichier journal CSV.
Jetez un oeil à Oliver's Python Corner. Il y a une tonne de choses que vous pouvez faire en utilisant Python dans FME.
J'utilise souvent le PythonCaller pour faire quelques manipulations d'attributs dans 1 transformateur plutôt que d'utiliser 10 transformateurs différents (si elif elif sinon ..)
Vous pouvez avoir des PythonCallers très basiques comme cet exemple qui convertira tous vos attributs en valeurs majuscules:
def upperAll(feature):
for att in feature.getAttributeList():
feature.setAttribute(att,feature.gettAttribute(att).upper())
J'utilise également le PythonCaller pour envoyer des emails en cas de panne ou interagir avec un serveur FTP etc. Il n'y a vraiment pas de limites
Amusez-vous bien et heureux
Jeff
Bon exemple ci-dessus: j'écris actuellement un article pour notre base de connaissances appelé FMEPedia ici: Python et FME Basics .
Cela inclut quelques exemples simples tels que la suppression d'un fichier avant d'exécuter un espace de travail avec un script de démarrage, la manipulation de fonctionnalités avec un PythonCaller, etc. Il existe également des liens vers des exemples plus complexes.
Logiciel Ken Bragg Safe
Exemples:
Journal personnalisé
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")
Et envoyer un 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()
J'ai récemment utilisé un transformateur PythonCaller qui obtient les coordonnées d'un fichier CSV et les enregistre en tant qu'attributs. Le CSV est écrit à partir d'un autre espace de travail qui utilise un transformateur BoundsExtractor qui obtient les coordonnées de délimitation à partir d'un cadre de délimitation de ma zone d'intérêt.
Je passe ensuite ces attributs à d'autres WorkspaceRunners qui utilisent les coordonnées de délimitation comme fenêtre de recherche pour un traitement ultérieur. J'ai des données à l'échelle de l'État et le traitement de l'ensemble de l'État prendrait plusieurs heures. Parce que je limite mon traitement à une fenêtre particulière, le tout prend une minute.
Le code pythonCaller est ici:
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
J'utilise également un script de démarrage python qui copie une arborescence de dossiers vers un autre emplacement s'il n'existe pas déjà.
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