Ai sử dụng phần mở rộng FME Python và làm thế nào?


Câu trả lời:


9

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.


5

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


Oooohhhhh ... Tôi thích âm thanh này ... chưa bao giờ nghĩ đến việc sử dụng PythonCaller theo cách đó!
Chad Cooper

Câu hỏi thêm về điều này ... bạn có chương trình nào để cấp quyền truy cập vào cổng 25 (tường lửa) để email hoạt động? Tôi đã vật lộn với điều này trong một vài tuần và rồi cuối cùng đã bỏ cuộc.
blord-castillo

4

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


3

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

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

1

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.