Tôi thấy một giao diện tuyệt vời cho FME với Python
Các bạn đang làm gì với nó? Tôi muốn ý tưởng.
Tôi thấy một giao diện tuyệt vời cho FME với Python
Các bạn đang làm gì với nó? Tôi muốn ý tưởng.
Câu trả lời:
Tôi mới bắt đầu với FME và đang sử dụng tập lệnh tắt để sao chép FGDB mục tiêu của tôi sang một vị trí khác và để lưu tệp nhật ký:
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')
Điều đó khá cơ bản, nhưng tôi thực sự không có giới hạn. Có rất nhiều ý tưởng ở đây là tốt.
EDIT: Đã thêm mã để nhận số lượng các tính năng được viết và đẩy chúng ra tệp nhật ký CSV.
Hãy nhìn vào Góc Python của Oliver. Có rất nhiều thứ bạn có thể làm khi sử dụng Python trong FME.
Tôi thường sử dụng PythonCaller để thực hiện một số thuộc tính bên trong 1 máy biến áp thay vì sử dụng 10 máy biến áp khác nhau (nếu elif elif khác ..)
Bạn có thể có các PythonCallers rất cơ bản như ví dụ này sẽ chuyển đổi tất cả các thuộc tính của bạn thành các giá trị chữ hoa:
def upperAll(feature):
for att in feature.getAttributeList():
feature.setAttribute(att,feature.gettAttribute(att).upper())
Tôi cũng sử dụng PythonCaller để gửi email trong trường hợp thất bại hoặc tương tác với Máy chủ FTP, v.v. Thực sự không có giới hạn
Chúc bạn vui vẻ và hạnh phúc
Jeff
Ví dụ điển hình ở trên: Tôi hiện đang viết một bài viết cho kiến thức của chúng tôi được gọi là FMEPedia tại đây: Khái niệm cơ bản về Python và FME .
Điều này bao gồm một số ví dụ đơn giản như xóa tệp trước khi chạy không gian làm việc với tập lệnh khởi động, thao tác các tính năng với PythonCaller, v.v. Ngoài ra còn có các liên kết đến các ví dụ phức tạp hơn.
Phần mềm an toàn Ken Bragg
Ví dụ:
Nhật ký tùy chỉnh
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")
Và gửi email :
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()
Gần đây tôi đã sử dụng một biến áp PythonCaller lấy tọa độ từ tệp CSV và lưu chúng làm thuộc tính. CSV được ghi từ một không gian làm việc khác sử dụng Biến áp BoundExtractor lấy tọa độ giới hạn từ hộp giới hạn trong khu vực tôi quan tâm.
Sau đó tôi chuyển các thuộc tính này cho các WorkspaceRunners khác sử dụng tọa độ giới hạn làm cửa sổ tìm kiếm để xử lý thêm. Tôi có dữ liệu Toàn tiểu bang và để xử lý trên toàn tiểu bang sẽ mất vài giờ. Bởi vì tôi giới hạn việc xử lý của mình ở một cửa sổ cụ thể, toàn bộ việc này chỉ mất một phút.
Mã pythonCaller ở đây:
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
Tôi cũng sử dụng một kịch bản khởi động python sao chép cây thư mục sang một vị trí khác nếu nó chưa tồn tại.
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