学习《Building Applications with FME Objects》 之三 操作要素(Features)

FMEOFeature是要素对象,是FME Object应用程序中的基本数据单元,一般来说,要素就是一套属性和一个关联了坐标系统的几何图形,应用程序读取数据集时是一个一个读取要素数据,当应用程序写数据集时是一个一个写入要素数据,要素可以被所有的标准FME函数和处理器操作,下面是要素的逻辑数据模型:

image

 

上面的图是逻辑模型,在FME Objects没有对这些类提供一对一的API,所有的数据访问通过FMEOFeature对象。

 

下面的部分描述逻辑类、属性和他们之间的关系,注意Class::Attribute是引用类的属性。

 

输入的要素类型存储在Feature::FeatureType属性。

 

要素属性按下列类型分组:

  • 格式属性
  • 用户属性
  • FME属性

 

一个要素可以没有或有多个格式属性,一个FormatAttribute为一个特定的格式属性,例如:autocad_block_name 和 sde30_justification。

 

一个要素可以没有或有多个用户属性,用户属性为自定义属性,例如:parcel_identifier,owner_name,data_surveyed等。

 

FME属性名字前缀fme_。用FME属性覆盖格式属性,例如:fme_color和fme_fill_color要素属性可以表示要素强度(详细请查看FME Foundation手册的FME Architecture章节)。

 

更重要的属性Feature::fme_type和Geometry::fme_geometry。Geometry类表示要素位置信息,要素几何图形可以是点、线或免。要素包含多个集合图形则称为aggregate(聚合)几何图形。要素也可以没有几何图形。

 

fme_type和fme_geometry的重要区别:

fme_geometry表示的是实际坐标构成的几何图形类型。

fme_type指定如何去展示几何图形。

例如,1个点几何图形类型可以被表现为多种FME类型:point,arc,ellipse,txt。

规定fme_type和fme_geometry是对应关系如下:

image

 

你希望创建的应用程序格式中立,那你必须仅仅使用FME属性处理要素,如果你避免使用特殊格式的属性,则很容易工作在你的应用程序。

 

每个几何图形都仅仅关联一个坐标系统,关于更多的信息参考Working with Coordinate Systems第55页。

 

下面是FMEOFeature方法和属性图示:

image

下面将学习一下内容:

  • 操作要素属性
  • 解释要素几何图形
  • 使用要素模式(schema for a feature)

关于要素和坐标系统之间的关系,请参考本教程第第7章Working with Coordinate Systems 。

本教程第9章Advanced Feature Processing包含了要素处理方法,如:performFuntion和processFeatures和如何对要素应用factory pipelines。

 

注意:所有的范例代码仅工作在二维几何图形,如果你需要处理三维几何图形,需要扩展范例代码。

 

操作要素属性

下表的属性和方法可以操作格式属性、用户属性、FME属性:

属性或方法 描述
allAttributeNames 该方法返回要素的所有属性,包括格式属性、用户属性、FME属性
attribute 该属性用来获取或设置字符串属性
attributeExists 该方法判断一个属性是否存在,存在返回FME_TRUE,不存在返回FME_FALSE
booleanAttribute 该属性用来获取或设置布尔属性
int16Attribute 该属性用来获取或设置2字节整数属性
int32Attribute 该属性用来获取或设置4字节整数属性
real32Attribute 该属性用来获取或设置4字节整数属性
real64Attribute 该属性用来获取或设置8字节整数属性
cloneAttributes 该方法复制源要素的要素类型和所有属性到目标要素。目标要素不存在源要素类型和属性。
注意:该方法不复制源要素的几何图形到目标要素,如果需要复制几何图形可以使用clone方法。
clone 该方法复制源要素的要素类型、所有属性和几何图形到目标要素。目标要素不存在源要素类型和属性。

 

GetFeatureAttributes过程用getAllAttributeNames方法获得输入要素的所有属性,并将结果放入两个Collection 中,其中一个放置属性名另一个方式属性值。

 

Sub GetFeatureAttributes(ByVal fmeFeature As FMEOFeature, _
                         ByVal colNameList As Collection, _
                         ByVal colValueList As Collection)
    Dim fmeAttributeNames As FMEOStringArray
    Dim sName As String
    Dim sValue As String
    Dim lEntries As Integer
    Dim i As Integer
    Dim d As Double
    Dim b As Boolean
    Set fmeAttributeNames = m_fmeSession.createStringArray
    Call fmeFeature.allAttributeNames(fmeAttributeNames)
    lEntries = fmeAttributeNames.entries
    For i = 0 To lEntries - 1
        sName = fmeAttributeNames.element(i)
        sValue = fmeFeature.attribute(sName)
        Call colNameList.Add(sName)
        Call colValueList.Add(sValue)
    Next i
End Sub

 

使用attribute设置属性,用attributeExists方法查询属性是否存在,如果存在就写入changed_value,如果不存在就创建新属性并写入new_value。

 

If fmeFeature.attributeExists("my_attribute") Then
fmeFeature.attribute("my_attribute") = "changed_value"
Else
fmeFeature.attribute("my_attribute") = "new_value"
EndIf

 

任何要素属性可以用FMEOFeature对象的attribute属性获取,因为FME对象将自动执行类型变换,自动的类型变换应该小心使用,避免undefined结果。下表位类型有效转换,表中未空的单元表示undefined结果。

image

 

cloneAttributes方法可以用来复制源要素属性到目标要素,代码如下:

Dim fmeTargetFeature as FMEOFeature
Set fmeTargetFeature = m_fmeSession.createFeature
fmeSourceFeature.cloneAttributes(fmeTargetFeature)

 

提示:目标要素中任何同名的属性将被源要素属性覆盖。

 

 

参考资料:

《Building Applications with FME Objects》February 2005

转载请注明文章来源 http://www.cnblogs.com/booolee

posted @ 2009-08-16 18:19  电电儿  阅读(898)  评论(0编辑  收藏  举报