FMEOWriter允許用已支援格式建立新的資料集,方法和屬性如下所示:
本章將學習到:
- 建立writer
- 開啟writer
- 獲得使用者writer參數
- 從活動的writer擷取資訊
- 建立要素
- 關閉writer
關於wirter和座標系統的關係,請查看本系列教程的第7章,使用座標系統。
建立writer
必須使用FMESession的createWriter方法建立writer對象,代碼如下:
Dim fmeDirectives As FMEOStringArray
Set fmeDirectives = m_fmeSession.createStringArray
fmeDirectives.append ("OUTPUT_STATS")
fmeDirectives.append ("NO")
Set m_fmeWriter = m_fmeSession.createWriter("SHAPE", _
fmeDirectives)
createWriter的第一個參數指定格式,用大寫,上例為:SHAPE,用來指定ESRI Shapefile Writer,該參數設定具體參考FME Reader and Writers手冊。
注意:一個格式是否可寫,取決於手冊表格中的Reader/Writer項。
第二個參數為字串數組,包含writer的建立參數,具體設定參看下錶:
注意:以上參數必須使用字串數組傳遞給createWriter方法。
開啟Writer
一旦建立了writer就可以用它開啟一個資料集,下面的代碼建立SHAPE Writer並開啟c:\shape資料集。
Set fmeKeywords = m_fmeSession.createStringArray
fmeKeywords.append(“MEASURES_AS_Z”)
fmeKeywords.append(“YES”)
Call m_fmeWriter.open(“c:\shape”, fmeKeywords)
open方法的第一個參數指定資料集,對於Shapefile writer來說,該參數為一個目錄,對於其他Writer來說,可能需要一個檔案、資料庫或URL。
第二個參數為字串數組,其中包含了控制writer的參數,用名字數值對的形成,參數列表可以參看 FME Readers and Writers手冊。
注意:所有的writer都支援DEF關鍵字,FME對象對待DEF關鍵字與其他關鍵字不同。
獲得使用者輸入的參數
建立和開啟writer是允許你的應用程式控制的:可以使用FMEODialog的destPrompt方法來與使用者互動式擷取參數,該對話方塊允許使用者指定格式、資料集和其他參數。
例如:
注意:該對話方塊僅僅在WINDOWS平台可用。
該對話方塊返回參數,可以船體給FMEOSession的createWriter方法和FMEOWWriter的open方法,例如:
Public Sub DestPrompt(sDestDir 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.DestPrompt("MIF", sDestDir, _
sFormat, sDataset, fmeDirectives)
If bCompleted = True Then
Set m_fmeWriter = m_fmeSession.createWriter( _
sFormat, _
fmeDirectives)
Set fmeKeywords = m_fmeSession.createStringArray
Call m_fmeWriter.open(sDataset, fmeKeywords)
End If
End Sub
下列參數被destPrompt方法支援:
從活動的Writer擷取資訊
如果你的應用程式需要訪問可用的格式列表,你可以用FMEODialog對象的getAvailableFormats方法,關於任何一個格式的詳細資料可以用getFormatInfoEx方法獲得,具體用法可以查看本系列教程之四。
寫要素
應用程式需要建立新的要素並儲存到目標資料集,例如,使用者對地圖注釋,並儲存這些註記。
寫要素需要兩步,首先使用addSchema方法為每個要素添加schema,如果在手冊的參數表中Schema Required項是YES,那麼Schema則是必須的,如果為NO,則writer則忽略要素schema,一旦所有的schemas被指定,第二步就可以用write方法寫資料要素了。
使用FMEOSession的createFeature方法建立一個空的schema要素,並且需要指定下列資訊:
- 要素類型:要素類型是通過featureType屬性設定,要素類型取決於輸出格式,例如theme,layer,level,file,database表名;要素類型可以查看手冊參考表。
- 使用者屬性列表:如果格式支援使用者屬性,則使用者屬性可以被添加到sequencedAddtribute屬性。
- FME類型列表:用setListAttribute方法設定名為fme_geometry列表屬性,值為有效fme_type值。
例如:
Dim fmeSchemaFeature As FMEOFeature
Dim fmeGeomList As FMEOStringArray
Set fmeSchemaFeature = m_fmeSession.createFeature
fmeSchemaFeature.featureType = "tracts"
fmeSchemaFeature.sequencedAttribute("CNTY_FIPS") = _
"fme_decimal(15,3)"
fmeSchemaFeature.sequencedAttribute("PERIMETER") = _
"fme_decimal(15,3)"
fmeSchemaFeature.sequencedAttribute("SQ_MILES") = _
"fme_decimal(15,3)"
fmeSchemaFeature.sequencedAttribute("STATE") = _
"fme_char(20)"
Set fmeGeomList = m_fmeSession.createStringArray
fmeGeomList.append ("fme_area")
Call fmeSchemaFeature.setListAttribute("fme_geometry", _
fmeGeomList)
注意:不需要給schema要素指定Geometry屬性,該屬性是隱含指定的。
一個schema要素被建立並傳遞給writer,應用程式可以寫符合schema的資料要素到資料集,例如:
Call m_fmeWriter.addSchema(fmeSchemaFeature)
lFeatureCount = m_fmeFeatureVector.entries
For i = 0 To lFeatureCount - 1
Set fmeFeature = m_fmeFeatureVector.element(i)
Call m_fmeWriter.write(fmeFeature)
Next i
上面的代碼假定所有的要素都儲存在fmeDataFeatureVector中,並且擁有相同的fmeSchemaFeaure.
關閉Writer
在最後一個要素被寫入資料集後,必須要關閉writer,如果不關閉writer,資料集可能會變為無效,可以用close方法關閉:
Call m_fmeWriter.Close
關閉後可以使用VB語句釋放相關資源:
Set m_fmeWriter = Nothing
參考資料:
《Building Applications with FME Objects》February 2005
轉載請註明文章來源 http://www.cnblogs.com/booolee