学习《Building Applications with FME Objects》 之四 从数据集读取要素
FMEOReader可以訪問任何支持格式的數據。
FMEOReader返回兩類要素:schema(模式)要素和數據要素,模式要素用于描述數據集模型。每種支持的格式都有一個模式,一個模式要素是一類要素的數據模型,模式要素描述屬性、坐標系和幾何要素類型。
?
本章可以學習到:
- 創建reader
- 打開reader
- 獲取reader設置
- 獲得活動reader信息
- 返回模式要素
- 返回數據要素
- 關閉reader
?
創建Reader
必須通過FMEOSession對象的createReader方法創建,如下
Dim fmeDirectives As FMEOStringArray
Set fmeDirectives = m_fmeSession.createStringArray
fmeDirectives.append ("OUTPUT_STATS")
fmeDirectives.append ("NO")
Set m_fmeReader = m_fmeSession.createReader("SHAPE", _
???????????????????????????????? False, fmeDirectives)
格式類型表示是唯一的,用于控制reader的創建,些在createReader方法的第一個參數,SHAPE用于創建ESRI Shapefile reader,下面是它的描述:
注意:FME對象的讀寫取決于上表中的Reader/Writer行。
?
createReader第二個參數為布爾值,用于決定是否創建要素磁盤緩存,如果你的應用程序需要多次訪問要素集,它將緩存以提高性能,多次訪問數據集緩存則可以減少I/O請求,當緩存時,FME對象創建一個基于基于磁盤的空間索引以方便快速隨機訪問要素并允許高級空間和屬性查詢,
?
createReader第三個參數為字符串數組,包含下表中的參數,以名和值成對出現:
?
打開Reader
一旦創建了reader,就可以打開指定的數據集,下面代碼SHAPE reader讀取c:\shape:
Dim fmekeywords As FMEOStringArray
Set fmeKeywords = m_fmeSession.createStringArray
fmeKeywords.append(“MEASURES_AS_Z”)
fmeKeywords.append(“YES”)
fmeKeywords.append(“IDs”)
fmeKeywords.append(“roads.shp”)
fmeKeywords.append(“IDs”)
fmeKeywords.append(“rivers.shp”)
Call m_fmeReader.open(“c:\shape”, fmeKeywords)
第一個參數,對于ESRI Shapefile reader來說,需要一個數據集目錄,其他的reader可能會需要一個數據集文件、數據庫或URL,詳細信息查看Quick Facts table。
第二個參數是一個字符串數組,名字和數值成對出現,控制reader的操作。
?
用戶設置Reader參數
通過FMEODialog對象,簡單的創建和打開一個新的reader,FMEODialog的sourcePrompt方法顯示一個對話框并且獲得用戶的數據。
?
例如:
注意:FMEODialog對象僅僅用于WINDOWS平臺,其他操作系統中不可用。
?
SourcePrompt方法返回用戶指定的參數,將返回的參數再傳遞給FMEOSession的createReader和FMEOReader的open方法:
Public Sub SourcePrompt(sSourceDir As String)
??? Dim fmeDialog As FMEODialog
??? Dim fmeDirectives As FMEOStringArray
??? Dim fmeKeywords As FMEOStringArray
??? Dim sDataset As String
??? Dim sFormat As String
??? Dim bCompleted As Boolean
??? Set fmeDialog = m_fmeSession.createDialog
??? Set fmeDirectives = m_fmeSession.createStringArray
??? Call fmeDirectives.append("LIMIT_FORMATS")
??? Call fmeDirectives.append("MIF")
??? bCompleted = fmeDialog.SourcePrompt("MIF", sSourceDir, _
???????????????????????????? sFormat, sDataset, fmeDirectives)
??? If bCompleted = True Then
??????? Set m_fmeReader = m_fmeSession.createReader(sFormat, _
????????????????????????? True, fmeDirectives)
??????? Set fmeKeywords = m_fmeSession.createStringArray
??????? Call m_fmeReader.open(sDataset, fmeKeywords)
??????? m_bReaderOpened = True
??? End If
End Sub
下面是SourcePrompt方法的參數:
?
?
從活動的Reader中獲取信息
用輸入數據源會話框,最紅用戶可以從格式列表中選擇格式,如果你的應用程序需要訪問可用的格式列表,可以使用FMEODialog對象的getAvailableFormats方法。并且可以通過FMEODialog對象的getAvailableFormats方法獲得可用格式的詳細信息.
?
下面的代碼顯示一個對話框來顯示指定Reader的全部信息:
Public Sub GetReaderInfo(ByVal sFormatName As String)
??? Dim lPos As Long
??? Dim sMsg As String
??? Dim sDirection As String
??? Dim bSpatialIndex As Boolean
??? Dim fmeDialog As FMEODialog
??? Dim fmeFormats As FMEOStringArray
??? Dim fmeFormatInfo As FMEOStringArray
??? Set fmeDialog = m_fmeSession.createDialog
??? Set fmeFormats = m_fmeSession.createStringArray
??? Set fmeFormatInfo = m_fmeSession.createStringArray
??? Call fmeDialog.getAvailableFormats(fmeFormats)
??? lPos = GetIndex(fmeFormats, sFormatName)
??? If lPos = -1 Then
??????? sMsg = "Format not available: "
??????? sMsg = sMsg & sFormatName & vbCrLf
??????? MsgBox sMsg, vbOKOnly, "GetReaderInfo"
??????? Exit Sub
??? End If
??? Call fmeDialog.getFormatInfoEx(sFormatName, fmeFormatInfo)
??? sMsg = "Format: " & sFormatName
??? lPos = GetIndex(fmeFormatInfo, "FORMAT_LONG_NAME")
??? sMsg = sMsg & vbCrLf & "Long Name: "
??? sMsg = sMsg & fmeFormatInfo.element(lPos + 1)
??? lPos = GetIndex(fmeFormatInfo, "DATASET_TYPE")
??? sMsg = sMsg & vbCrLf & "Dataset Type: "
??? sMsg = sMsg & fmeFormatInfo.element(lPos + 1)
??? lPos = GetIndex(fmeFormatInfo, "INPUT_OUTPUT")
??? sMsg = sMsg & vbCrLf & "Direction: "
??? sMsg = sMsg & fmeFormatInfo.element(lPos + 1)
??? lPos = GetIndex(fmeFormatInfo, "FILE_EXTENSIONS")
??? sMsg = sMsg & vbCrLf & "File Filter: "
??? sMsg = sMsg & fmeFormatInfo.element(lPos + 1)
??? lPos = GetIndex(fmeFormatInfo, "COORD_SYSTEM_AWARE")
??? sMsg = sMsg & vbCrLf & "Coordinate System Aware: "
??? sMsg = sMsg & fmeFormatInfo.element(lPos + 1)
??? lPos = GetIndex(fmeFormatInfo, "SOURCE_SETTINGS")
??? sMsg = sMsg & vbCrLf & "Has Source Settings: "
??? sMsg = sMsg & fmeFormatInfo.element(lPos + 1)
??? lPos = GetIndex(fmeFormatInfo, "DESTINATION_SETTINGS")
??? sMsg = sMsg & vbCrLf & "Has Destination Settings: "
??? sMsg = sMsg & fmeFormatInfo.element(lPos + 1)
??? lPos = GetIndex(fmeFormatInfo, "AUTOMATED_TRANSLATION")
??? sMsg = sMsg & vbCrLf & "Supports Automated Translation: "
??? sMsg = sMsg & fmeFormatInfo.element(lPos + 1)
??? MsgBox sMsg, vbOKOnly, "GetReaderInfo"
End Sub
?
FMEODialog對象的getFormatInfoEx方法返回的信息為名字數值對,下列表格為名字列表:
?
關于FMEOReader對象的額外信息,可以用它的getProperties方法獲得,例如:
Set fmeProperties = m_fmeSession.createStringArray
Call m_fmeReader.getProperties("fme_prop_spatial_index", _
fmeProperties)
?
讀取模式(Schema)要素
在讀取數據要素前,不需要強制讀取模式要素仍然可以連續讀取數據要素,每次調用readSchema方法返回一個schema要素,該方法返回True或False,下面代碼將在日志中寫入數據集的所有模式要素:
Public Sub LogSchemaFeatures()
??? Dim bLastSchema As Boolean
??? Dim fmeSchemaFeature As FMEOFeature
??? bLastSchema = False
??? Set fmeSchemaFeature = m_fmeSession.createFeature
??? Do While bLastSchema = False
??????? bLastSchema = m_fmeReader.readSchema(fmeSchemaFeature)
??????? If bLastSchema = False Then
?????????? Call m_fmeLogfile.logFeature(fmeSchemaFeature, 1, 1)
?????? End If
???? Loop
End Sub
?
?
讀數據要素
一旦你的程序創建并且打開reader,就準備開始讀取數據要素,可以使用read方法,該方法一次返回一個要素,當沒有要素被讀取時返回TRUE,否則返回FALSE,下面代碼示范用reader讀取所有要并寫入feature vector。
bEnd = False
Do While bEnd = False
??? Set fmeDataFeature = m_fmeSession.createFeature
??? bEnd = m_fmeReader.read(fmeDataFeature)
??? If bEnd = False Then
??????? Call fmeFeatureVector.append(fmeDataFeature)
??? End If
Loop
注意:每次調用read方法前都新建一個FMEOFeature對象,為了防止覆蓋前一次讀取的要素。
?
使用約束
通過執行簡單的空間查詢和屬性查詢,限制FME對象僅讀取匹配的要素,在最后一個要素讀取后,你的應用程序可以對輸入要素使用setConstraints方法開始新的過濾。
通過setConstraints方法給FMEOFeature對象指定約束,用屬性指定過濾用fme_search_type,下表為fme_search_type支持的值:
?
如果你的應用程序多次過濾輸入數據集,則強烈建議你當創建reader時打開緩存。
打開緩存后,所有的輸入要素將在第一次讀取時被緩存,setConstraints方法在被調用前,將從緩存里創建新的reader。
當處理的原數據集有空間索引(例如:SDE),則緩存的使用則有所不同。
?
關閉Reader
用close方法關閉
Call m_fmeReader.Close
?
關閉后你可以請求Visual Basic銷毀對象引用
Set m_fmeReader=Nothing
這將導致釋放reader的相關資源。
?
?
參考資料:
《Building Applications with FME Objects》February 2005
轉載請注明文章來源 http://www.cnblogs.com/booolee
轉載于:https://www.cnblogs.com/booolee/archive/2009/08/18/1548643.html
總結
以上是生活随笔為你收集整理的学习《Building Applications with FME Objects》 之四 从数据集读取要素的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转载】使用Imaging组件加载GIF
- 下一篇: [silverlight基础]仿文字连接