學習《Building Applications with FME Objects》 之五 向資料集寫要素

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.