span8
span4
下面是一些可以使用。来执行的高级操作SchemaMapper变压器。我们将结合使用属性映射、属性设置和特性类型映射来研究高级筛选。好的模式映射会带来很大的责任,因此我们还将提供一些关于常见错误和调试复杂模式映射的技巧。
Filter操作设置了一个“IF语句”类型,FME可以通过它将查找表中的映射与映射应用到的特性匹配起来。在本例中,SchemaMapper将使用多个筛选器属性来定义一个子句。工作空间模板中定义了6个查找表项:
MaterialTypeAttribute
:定义管道材料的属性的名称。MaterialTypeValue
:管道材料的潜在价值DiameterAttribute
:定义管道直径的属性的名称。DiameterValue
:管径势值。StatusAttribute
:定义管道状态的属性的名称。StatusValue
:管道状态的潜在值。在SchemaMapper的查找表参数窗口中,预览窗格显示每个用我们想要用作过滤器的属性值填充的条件句:
步骤1 -要使用这些操作,请在SchemaMapper中设置多个筛选器操作。每个过滤器功能动作将处理一对属性和条件值。滤镜功能动作设置如下:
这些操作一起创建了一个条件句:
如果MaterialTypeAttribute = MaterialTypeValue和DiameterAttribute = DiameterValue和StatusAttribute = StatusValue
例如:
如果材料=钢和直径= 300和生命周期状态=活动
使用这组逻辑条件,SchemaMapper现在可以基于多个过滤属性执行转换操作。
除了操作模式类型和属性外,还可以使用SchemaMapper转换器设置属性值。使用SchemaMapper中的“New Attribute”操作,可以将属性及其值添加到数据集,或者修改模式中的现有属性。
例如,设置一个特征的符号学值:
autocad_color
:用于定义特征颜色的属性的名称。颜色
:与所需颜色等价的数值autocad_lineweight
:用于定义特性lineweight的属性的名称重量
:与期望行权值相等的数值。为了简化映射表,每个属性都作为单独的行添加。查找表中会有更多的行,但是更容易进行编辑。你可以在CSV预览窗口中看到:
每个组合的类型
,直径
和状态
有两行——每一行代表一个符号属性。这是因为FME不会在它找到的第一个匹配项时停止,而是继续执行它找到的所有映射。这种技术使映射字段对话框变得简单,因为定义一个映射将设置多个属性。
步骤2 -在SchemaMapper参数中添加“新属性”操作。
当与过滤器功能动作一起使用时,对话框将看起来像这样:
最后,当工作区运行时Water_Distribution / wMain
,这将是以下输出:
根据管道属性(大小、状态、材质)为输出数据集中的特性分配了不同的颜色/权重。所有这些都是使用SchemaMapper中的三个过滤器操作和一个新属性操作完成的。
特性类型映射也可以包含到查找表中。使用format属性fme_feature_type
,此示例演示如何将功能类型映射作为新行添加,类似于上面创建符号的方式。
例如,特征类型映射被添加到行中:
包含材料、圣、直径450 LifecycleStatus,活跃,fme_feature_type SmallSteelPipes
在SchemaMapper预览中看起来是这样的:
然后可以在工作空间中使用扇出或类似的方法来处理特性类型。
以下主题讨论如何在使用此转换器时解决问题。它包含的技巧和提示,以帮助解决任何可能出现的问题。
查找表中的行顺序很重要。FME将继续应用映射,因为它将在查找表中自上而下地工作。例如,给定查找表中的这两行:
Material,Steel,Diameter,450,LifecycleStatus,Active,autocad_color,1(红色)Material,Steel,Diameter,450,LifecycleStatus,Active,autocad_color,2(黄色)
特征首先被赋予红色,然后被黄色覆盖。
这可以是有用的知道:
1)可能有一组重复的子句,导致了意外的映射。
2)订单可用于设置“默认值”。例如,将这一行放在查找表的顶部:
材料、钢铁、、、、、autocad_color 1
“Steel”类型的所有特征都将与此匹配,并被赋予红色(无论大小或状态)。然后在查找表中,使用匹配的特性直径
和LifecycleStatus
将被设置为不同的值。因此,所有在输出中仍然是红色的特征是那些没有匹配完整的过滤器。这些红色的特性可以用来检查映射逻辑的错误。换句话说,不太特定的过滤器应该首先放在查找表中,然后是更特定的过滤器。
使用此技术的关键是,它只在“全部捕获”位于其他映射之上时才有效。如果它在下面,那么它将重置任何已经映射的东西。
可以设置辅助映射来简化工作空间。
例如,以这个查找表为例:
采购产品材料,钢,新材料,AllPipes材料,球墨铸铁,新材料,AllPipes材料,PVC,新类型,AllPipes材料,autocad_color,5
在本例中,某些特性被映射到typeAllPipes
然后类型AllPipes
映射到蓝色(AutoCAD颜色索引中的#5)。该表将所有功能映射到新功能类型,然后将该功能类型映射到新颜色。这只在特征类型映射先于颜色映射的情况下有效。
SchemaMapper转换器添加属性_schemamapper_row_ids
到每个映射的特性。这是在映射期间引用的模式表中的行号列表。
在某些情况下,可能需要减小模式映射表的大小,以只包含特定特性类型应该引用的行,然后从那里返回。模式表中的行顺序很重要,请参阅上面的内容。应该首先在查找表中放置更一般的筛选器,然后再放置更具体的筛选器。
你不需要只使用一个SchemaMapper。您可以有一个仅用于域值映射的查询表和一个用于特性类型和属性映射的查询表,并在您的工作区中包含两个SchemaMapper转换器。
您知道FME函数调用可以嵌入到SchemaMapper查找表的值字段中吗?FME将在读取表时运行它们。例如,一个值可以设置为:
@UpperCase (@ value (A))
更多的现代函数需要封装在@Evaluate函数中,就像这样:
@EvaluateExpression (unused1DateTimeNow unused2)
这可能不是一个常见的用法,但它是可以做到的。
下载内容如下:
这里使用的数据来源于由温哥华的城市不列颠哥伦比亚省。它包含在开放政府许可下的信息-温哥华。
我的情况是,我需要解析同一单元格中的多个查找值。我已经成功地实现了上面的解决方案,但是无法解决多重编码域的问题。
例如:
数据表:
Col1 | Col2 |
1 | 零 |
2 | 零 |
1、2 | 零 |
查找表:
Col1Code | Col1Value |
1 | 绿色 |
2 | 红色的 |
输出表(目标):
col1 | col2 |
1 | 绿色 |
2 | 红色的 |
1、2 | 绿色,红色 |
什么好主意吗?
我不能创建一个包含所有组合的查找表。“1,2”,“2,1”,因为我正在处理成千上万的数据集和查找值。
@spatial_aus它看起来像你试图解决颜色的S57或类似的东西。
我认为你不能用SchemaMapper来完成这个任务。在SchemaMapper中,在查找表中,第二种颜色(红色)将击败第一种颜色(绿色)。
您仍然可以使用查找表,但是我认为您必须使用查找表DatabaseJoiner周围有一些支持转换器,先拆分代码列表,然后重建结果。是这样的:
我附加了示例工作区(2019.0):SchemaMapping.fmwt
在聚合器中,你还应该能够利用新的(2019)组的模式参数-过程当组改变:
这应该是可行的,因为具有相同ID的特性应该按顺序出现。使用这将意味着聚合器不会“阻止”所有的功能。
谢谢你的回复@markat亚搏在线safe
虽然我遇到过这个非s57数据,是的-这是一个s57任务,我试图解决。
s57中有许多list (L)类型的属性。使用上面的解决方案对于一个列来说很好,但是我需要在许多特性类(数百个)中查找许多属性。这将导致大量的AttributeSplitters和Databasejoiners。
©2019安全亚搏在线软件公司法律