学习《Building Applications with FME Objects》 之五 向数据集写要素

FMEOWriter允许用已支持格式创建新的数据集,方法和属性如下所示:

image

本章将学习到:

  • 创建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的创建参数,具体设置参看下表:

image

 

注意:以上参数必须使用字符串数组传递给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方法来与用户交互式获取参数,该对话框允许用户指定格式、数据集和其他参数。

 

例如:

image

 

注意:该对话框仅仅在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方法支持:

image

 

从活动的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

posted @ 2009-08-18 11:45  电电儿  阅读(569)  评论(0编辑  收藏  举报