我是WSO2 CEP和Siddhi查询的新手。 我创建了三个不同的事件流,每个流都是关于一个特定的传感器,如下图所示:
传感器的每个事件流都具有传感器的纬度和经度。传感器放置在不同的坐标上,我想比较/关联它们的坐标(纬度和经度)。如何通过Siddhi查询比较它们的坐标(坐标变化不超过4米)? 非常感谢!
答案 0 :(得分:2)
Siddhi有一套独立的operations用于地理位置操作。 要计算传感器之间的距离,您可以使用geo distance function。
由于您要比较传感器距离,因此您必须将传感器位置保持在window或table。 每当传感器位置进入流中时,您就可以将其存储在窗口或表格中,并与表格内容的其余部分连接,并使相关输出符合您的要求(4米内)
/* Enter a unique ExecutionPlan */
@Plan:name('ExecutionPlan')
/* Enter a unique description for ExecutionPlan */
-- @Plan:description('ExecutionPlan')
/* define streams/tables and write queries here ... */
@Import('sensor4:1.0.0')
define stream sensor4 (id int, lat double, long double);
@Import('sensor3:1.0.0')
define stream sensor3 (id int, lat double, long double);
@Import('sensor2:1.0.0')
define stream sensor2 (id int, lat double, long double);
@Import('sensor1:1.0.0')
define stream sensor1 (id int, lat double, long double);
@Export('measuredStream:1.0.0')
define stream measuredStream (sensor1Id int, sensor2Id int);
define table sensorTable (id int, lat double, long double);
from sensor1
select *
insert into sensorTable;
from sensor2
select *
insert into sensorTable;
from sensor1 join sensorTable
on sensorTable.id != sensor1.id and 4 > geo:distance(sensorTable.lat, sensorTable.long, sensor1.lat, sensor1.long)
select sensorTable.id as sensor1Id, sensor1.id as sensor2Id
insert into measuredStream;
from sensor2 join sensorTable
on sensorTable.id != sensor2.id and 4 > geo:distance(sensorTable.lat, sensorTable.long, sensor2.lat, sensor2.long)
select sensorTable.id as sensor1Id, sensor2.id as sensor2Id
insert into measuredStream;
上述执行计划将起作用,因为您在创建了2个以上的查询后,每个查询都插入事件表并与事件表连接。您可以通过将记录器发布者(测量流中的事件将记录在终端中)添加到测量流来验证结果。并使用事件模拟器,模拟事件流程。