学习《Building Applications with FME Objects》 之四 从数据集读取要素
FMEOReader可以訪問(wèn)任何支持格式的數(shù)據(jù)。
FMEOReader返回兩類要素:schema(模式)要素和數(shù)據(jù)要素,模式要素用于描述數(shù)據(jù)集模型。每種支持的格式都有一個(gè)模式,一個(gè)模式要素是一類要素的數(shù)據(jù)模型,模式要素描述屬性、坐標(biāo)系和幾何要素類型。
?
本章可以學(xué)習(xí)到:
- 創(chuàng)建reader
- 打開reader
- 獲取reader設(shè)置
- 獲得活動(dòng)reader信息
- 返回模式要素
- 返回?cái)?shù)據(jù)要素
- 關(guān)閉reader
?
創(chuàng)建Reader
必須通過(guò)FMEOSession對(duì)象的createReader方法創(chuàng)建,如下
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的創(chuàng)建,些在createReader方法的第一個(gè)參數(shù),SHAPE用于創(chuàng)建ESRI Shapefile reader,下面是它的描述:
注意:FME對(duì)象的讀寫取決于上表中的Reader/Writer行。
?
createReader第二個(gè)參數(shù)為布爾值,用于決定是否創(chuàng)建要素磁盤緩存,如果你的應(yīng)用程序需要多次訪問(wèn)要素集,它將緩存以提高性能,多次訪問(wèn)數(shù)據(jù)集緩存則可以減少I/O請(qǐng)求,當(dāng)緩存時(shí),FME對(duì)象創(chuàng)建一個(gè)基于基于磁盤的空間索引以方便快速隨機(jī)訪問(wèn)要素并允許高級(jí)空間和屬性查詢,
?
createReader第三個(gè)參數(shù)為字符串?dāng)?shù)組,包含下表中的參數(shù),以名和值成對(duì)出現(xiàn):
?
打開Reader
一旦創(chuàng)建了reader,就可以打開指定的數(shù)據(jù)集,下面代碼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)
第一個(gè)參數(shù),對(duì)于ESRI Shapefile reader來(lái)說(shuō),需要一個(gè)數(shù)據(jù)集目錄,其他的reader可能會(huì)需要一個(gè)數(shù)據(jù)集文件、數(shù)據(jù)庫(kù)或URL,詳細(xì)信息查看Quick Facts table。
第二個(gè)參數(shù)是一個(gè)字符串?dāng)?shù)組,名字和數(shù)值成對(duì)出現(xiàn),控制reader的操作。
?
用戶設(shè)置Reader參數(shù)
通過(guò)FMEODialog對(duì)象,簡(jiǎn)單的創(chuàng)建和打開一個(gè)新的reader,FMEODialog的sourcePrompt方法顯示一個(gè)對(duì)話框并且獲得用戶的數(shù)據(jù)。
?
例如:
注意:FMEODialog對(duì)象僅僅用于WINDOWS平臺(tái),其他操作系統(tǒng)中不可用。
?
SourcePrompt方法返回用戶指定的參數(shù),將返回的參數(shù)再傳遞給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方法的參數(shù):
?
?
從活動(dòng)的Reader中獲取信息
用輸入數(shù)據(jù)源會(huì)話框,最紅用戶可以從格式列表中選擇格式,如果你的應(yīng)用程序需要訪問(wèn)可用的格式列表,可以使用FMEODialog對(duì)象的getAvailableFormats方法。并且可以通過(guò)FMEODialog對(duì)象的getAvailableFormats方法獲得可用格式的詳細(xì)信息.
?
下面的代碼顯示一個(gè)對(duì)話框來(lái)顯示指定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對(duì)象的getFormatInfoEx方法返回的信息為名字?jǐn)?shù)值對(duì),下列表格為名字列表:
?
關(guān)于FMEOReader對(duì)象的額外信息,可以用它的getProperties方法獲得,例如:
Set fmeProperties = m_fmeSession.createStringArray
Call m_fmeReader.getProperties("fme_prop_spatial_index", _
fmeProperties)
?
讀取模式(Schema)要素
在讀取數(shù)據(jù)要素前,不需要強(qiáng)制讀取模式要素仍然可以連續(xù)讀取數(shù)據(jù)要素,每次調(diào)用readSchema方法返回一個(gè)schema要素,該方法返回True或False,下面代碼將在日志中寫入數(shù)據(jù)集的所有模式要素:
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
?
?
讀數(shù)據(jù)要素
一旦你的程序創(chuàng)建并且打開reader,就準(zhǔn)備開始讀取數(shù)據(jù)要素,可以使用read方法,該方法一次返回一個(gè)要素,當(dāng)沒(méi)有要素被讀取時(shí)返回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
注意:每次調(diào)用read方法前都新建一個(gè)FMEOFeature對(duì)象,為了防止覆蓋前一次讀取的要素。
?
使用約束
通過(guò)執(zhí)行簡(jiǎn)單的空間查詢和屬性查詢,限制FME對(duì)象僅讀取匹配的要素,在最后一個(gè)要素讀取后,你的應(yīng)用程序可以對(duì)輸入要素使用setConstraints方法開始新的過(guò)濾。
通過(guò)setConstraints方法給FMEOFeature對(duì)象指定約束,用屬性指定過(guò)濾用fme_search_type,下表為fme_search_type支持的值:
?
如果你的應(yīng)用程序多次過(guò)濾輸入數(shù)據(jù)集,則強(qiáng)烈建議你當(dāng)創(chuàng)建reader時(shí)打開緩存。
打開緩存后,所有的輸入要素將在第一次讀取時(shí)被緩存,setConstraints方法在被調(diào)用前,將從緩存里創(chuàng)建新的reader。
當(dāng)處理的原數(shù)據(jù)集有空間索引(例如:SDE),則緩存的使用則有所不同。
?
關(guān)閉Reader
用close方法關(guān)閉
Call m_fmeReader.Close
?
關(guān)閉后你可以請(qǐng)求Visual Basic銷毀對(duì)象引用
Set m_fmeReader=Nothing
這將導(dǎo)致釋放reader的相關(guān)資源。
?
?
參考資料:
《Building Applications with FME Objects》February 2005
轉(zhuǎn)載請(qǐng)注明文章來(lái)源 http://www.cnblogs.com/booolee
轉(zhuǎn)載于:https://www.cnblogs.com/booolee/archive/2009/08/18/1548643.html
總結(jié)
以上是生活随笔為你收集整理的学习《Building Applications with FME Objects》 之四 从数据集读取要素的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【转载】使用Imaging组件加载GIF
- 下一篇: [silverlight基础]仿文字连接