原文发布时间:2012-03-06
作者:麦毅伦
翻译文章链接:http://evangelism.safe.com/fmeevangelist97/
翻译:糖糖
2012年2月14号
大家好!
InlineQuerier是FME2012的新转换器,并且很可能非常有用,它可以整合多个数据源并且使用SQL查询从中提取信息。这种思维是比使用FeatureMergers, Testers, 和 Joiners这么多个转换器来实现要灵活得多的方式。
这里有一个案例。看你能想到什么。
转换器参数
InlineQuerier转换器在没有任何输入端和输出端的地方不太可能会被用上:
原因是所有的端口都需要工作空间的创建者去定义它。没有端口我们就要默认添加。看下面这个对话框的帮助怎么说:
正如我说的,思路是:输入数据并且用SQL语句进行查询。这样转换器就会创建一个专门的数据集(临时)。事实上,它确实创建了一个真正的数据集。我们给FME2012增加了SQLite的功能,并在这个领域很好地利用它。
输入端用表的列来定义。对数据集中你想创建的每一张表,在插入数据的地方获取一个输入端。
同样的,输出端用SQL查询来定义。对在数据集上你想执行的每一个查询,用返回的数据作为输出端输出。
如此看来,它就是一个非常简单的概念。或者像英国人的说法就是,很Simples!
创建表
这样,输入端是表,并且在将要定义的表里已经有了两个列:表【名】,和列。
表名很简单,而且它本身的名字也可以用作端口的标注。
列的字段也不复杂,双击(或单击然后点击[...]按钮),就能打开一个对话框来定义表的列:
但是!如果你只是简单地想对每个源要素类创建一个表,那么回到主对话框单击Import按钮:
打开一个对话框选择要使用的要素类:在这里(本案例)我有两个源要素类:
创建查询
创建查询更加简单,只给输出端设置一个名称,然后在查询字段里键入一条查询语句。对于更长的查询字段就点击[...]按钮然后打开一个全框的文本编辑器:
在这里你可以键入任意SQL,并使用在左边的链接可以快捷键入表名和列名。
这里不做过多的解释了。如果你用Generate选项(回到主对话框),那么对每个输入创建一个新的输出端(和查询)会很简单。最可能用到的——在我的选项里——就是设置一些可以进一步细化的默认的查询
最后,输出要素的几何图形通常来自查询中返回的第一个要素——也有设置让你给返回的所有要素分配几何图形。
案例
举例时间。在这个工作空间中,我有两个输入要素类:Emergency Facilities(紧急设施) 和 Emergency Events(紧急事件).一个共同ID(FacilityID)用于关联紧急事件给相应的设施。
任务就是创建一系列基于这些信息的报告,并且在这里我使用InlineQuerier。我的工作空间如下:
注意在这里我没有对每个输出分别用一个InlineQuerier(这是我第一个工作空间里的错误做法)。这是因为我可以在一个转换器里执行多个查询。
同样地,在不同的数据组里做完全不同组的查询甚至也不需要使用多个转换器。为什么我可以呢?你不用创建不同的数据库来存储不同的数据集,只需用不同的表即可,这里应用同样的概念。
所以我可以将数据插入到公园、道路、学校、运输等等,在同一个转换器中执行完全各不相干的查询。
现在,回到手边的这个例子,参数如下设置:
你可以看到我已经对每一个读模块要素类创建了一张表(用Import按钮),然后创建三个不同的SQL查询/输出端。
如果你对具体查询感兴趣(或者想要评价我的SQL性能),语句罗列如下:
SELECT *
FROM EmergencyFacilities
INNER JOIN EmergencyEvent ON EmergencyFacilities.FacilityID = EmergencyEvent.FacilityID
WHERE EmergencyFacilities.FacilityID=$(FacilityID);
SELECT *
FROM EmergencyFacilities
INNER JOIN EmergencyEvent ON EmergencyFacilities.FacilityID = EmergencyEvent.FacilityID;
SELECT EmergencyFacilities.FacilityName,count(EmergencyEvent.FacilityID)
FROM EmergencyFacilities, EmergencyEvent
WHERE EmergencyFacilities.FacilityID=EmergencyEvent.FacilityID
GROUP BY EmergencyFacilities.FacilityID;
第二个查询创建一个基本的关联,一个显示设施的事件对应一个输出。第三个查询对每一个设施返回一个输出,并带有一组相关事件的数字。我不是很确定首先该做什么,但是我确定什么是我不想做的,所以最好不要复制。
这三个查询的输出如下所示:
显示出Station 18与12号紧急事件相关(因为无论任何时间周期被定义在这一组记录)
结论
总而言之,我认为这个转换器是非常简单的——比乍一看上去简单得多——但是却非常强大。它大大改善了性能,其潜能远远超过使用多个FeatureMerger(和相关的)等转换器,特别是在彼此交叉索引的多张表的时候。记住,还会有更高的处理,所以它对简单查询时并不总是最佳选择。
另外,我认为这个转换器的帮助文档非常好。看下面的注意事项,它告诉你如何将InlineQuerier与其他转换器关联,比如FeatureMerger 和SQLExecutor,并对每一种用法阐述了性能测试和效益可用性。去看看吧。
顺便,借此机会提三点说明:
博客评论
请注意我已经不能不关闭这里的评论了。从不嫌多,但我已经厌倦了垃圾信息。如果你有反馈,我的电子邮件地址和电话号码就列在下面。
2012征服欧洲
我们最近已经启动了征服FME2012课程并且已有了不小的反响。但是因为时区的差异我知道这对一部分用户来说是一个问题。因此我们在2月22号举办了一场欧洲基础课程。点击我们的training calendar或者将你的账户发送电子邮件给safe报名。
FME2012的环球旅行
别忘了,FME2012世界巡回大约从4月开始,有很多很多全球各地方并且它总是一个很好的机会来获取最新的FME功能,与Safe软件的员工见面,并与其他用户网络联系。并且,据我所知,这是免费的。谁说世界上没有免费的午餐这种事呢?
希望能在这里见到你!
致敬!