Chi utilizza l'estensione FME Python e come?


Risposte:


9

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.


5

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


Oooohhhhh ... mi piace il suono di questo ... non ho mai pensato di usare un PythonCaller in quel modo!
Chad Cooper,

Domanda aggiuntiva su questo ... quale programma hai per dare accesso alla porta 25 (firewall) affinché l'e-mail funzioni? Ho lottato con questo per un paio di settimane e poi alla fine ho rinunciato.
blord-castillo,

4

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


3

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() 

1

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.