zoukankan      html  css  js  c++  java
  • 学习《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

  • 相关阅读:
    树状数组
    #135. 二维树状数组 3:区间修改,区间查询
    poj 2155 (二维树状数组 区间修改 求某点值)
    #133. 二维树状数组 1:单点修改,区间查询
    poj 3468 (区间修改 区间查询)
    树状数组 模板
    1535:【例 1】数列操作
    最通俗全面理解application context中的context是什么意思
    牛客哈理工小乐乐下象棋(深度理解bfs好题)
    牛客哈理工小乐乐打游戏(bfs深度理解好题)
  • 原文地址:https://www.cnblogs.com/booolee/p/1548731.html
Copyright © 2011-2022 走看看