从 ASA 到 Power BI 地图的实时位置数据
Live location data from ASA to Power BI Map
我有一个 ASA 输出,它将一些设备的 GPS 坐标发送到 Power BI Live 数据流。
从 ASA 到 Power BI 的数据如下所示:
Device Lat Lon Time
1 1,12345 2,34567 19-1-2018 11:48:00
2 1,34567 2,66666 19-1-2018 11:49:01
1 1,67890 2,55555 19-1-2018 11:49:13
2 1,33333 2,33333 19-1-2018 11:50:23
2 1,23222 2,44444 19-1-2018 11:50:54
我想在地图上显示设备的最新位置。
我可以使用度量来显示特定设备的最新纬度和经度,如下所示:
GpsLonLast = CALCULATE(MAX('PowerBI'[lon]);FILTER('PowerBi';PowerBI[time]=[LastTime]))
其中 LastTime 是接收设备发送消息的最晚时间的度量。
这有效,当在 table 中显示时,但是我无法将这些度量映射到 Power BI 中的映射控件,它不支持度量或聚合。
如果我使用普通的纬度/经度和设备字段作为地图控件上的位置和名称,我会得到所有找到设备的位置。但这不是我想要的,我只想要设备的最后位置。
请注意,我正在使用 Azure 流分析将实时数据发送到 Power BI,在 Power BI 中,这是作为推送数据集接收的,因此我无法在 Power BI 中使用自定义建模。
我会首先计算一个 "helper" 列来测试每个设备的最新时间,例如
Latest Time per Device =
IF (
[Time]
= CALCULATE (
MAX ( 'PowerBI'[Time] ),
FILTER ( 'PowerBI', 'PowerBI'[Device] = EARLIER ( [Device] ) )
),
"Is Latest Time per Device",
"Other"
)
然后我会将该列用作过滤器,例如添加到 Visual Level Filter 井,然后选择 "Is Latest Time per Device" 条目。然后您可以在过滤后的视觉对象中使用纬度和经度列。
我的建议是创建一个仅包含每个设备的最后位置的计算 table,并将该 table 用作地图的数据集。
这应该会给你 table 你想要的:
= ADDCOLUMNS(SUMMARIZECOLUMNS(PowerBI[Device], "LastTime", MAX(PowerBI[Time])),
"Lat", CALCULATE(MAX(PowerBI[Lat]),
FILTER(PowerBI, PowerBI[Time] = [LastTime])),
"Lon", CALCULATE(MAX(PowerBI[Lon]),
FILTER(PowerBI, PowerBI[Time] = [LastTime])))
现在,每次您的实时数据更新时,计算得出的 table 也应该更新并为您提供最新的 GPS 坐标以显示在地图上。
我认为这不可能是你想做的。
但是,您可以使用 Power BI API 直接推送数据集而不是 Azure 流分析,并且 post GPS 将自己坐标到 API。
您可以事先清除 table ,这样您最终只会得到最新的值。遗憾的是,您无法删除或更新单行,因此每次都必须 post 完整 table。这有点麻烦,但它确实有效。如果您的地图上有几个项目,删除 table 中的所有行并再次添加它们的性能影响并不是什么大问题。
我们在一些项目中使用了这种技术,而且效果非常快。我们只会每隔几分钟更新一次 GPS 坐标,并且只有 post 到 API 发生变化时才会更新。
您可以使用 https://github.com/Microsoft/PowerBI-CSharp C# API 库来简化 posting 到 API。
这可能不是您要找的答案,但我建议您采取一些解决方法:
- 使用按日期排序的前 N 个过滤器(您可以在实时数据集中使用其中一个)。您的地图将仅显示最后的点或最短路径。
- 修改 RoutMap 自定义视觉对象以仅绘制最后一个值。我想如果你有代码应该很容易:) https://github.com/weiweicui/PowerBI-Routemap
我有一个 ASA 输出,它将一些设备的 GPS 坐标发送到 Power BI Live 数据流。
从 ASA 到 Power BI 的数据如下所示:
Device Lat Lon Time 1 1,12345 2,34567 19-1-2018 11:48:00 2 1,34567 2,66666 19-1-2018 11:49:01 1 1,67890 2,55555 19-1-2018 11:49:13 2 1,33333 2,33333 19-1-2018 11:50:23 2 1,23222 2,44444 19-1-2018 11:50:54
我想在地图上显示设备的最新位置。 我可以使用度量来显示特定设备的最新纬度和经度,如下所示:
GpsLonLast = CALCULATE(MAX('PowerBI'[lon]);FILTER('PowerBi';PowerBI[time]=[LastTime]))
其中 LastTime 是接收设备发送消息的最晚时间的度量。
这有效,当在 table 中显示时,但是我无法将这些度量映射到 Power BI 中的映射控件,它不支持度量或聚合。
如果我使用普通的纬度/经度和设备字段作为地图控件上的位置和名称,我会得到所有找到设备的位置。但这不是我想要的,我只想要设备的最后位置。
请注意,我正在使用 Azure 流分析将实时数据发送到 Power BI,在 Power BI 中,这是作为推送数据集接收的,因此我无法在 Power BI 中使用自定义建模。
我会首先计算一个 "helper" 列来测试每个设备的最新时间,例如
Latest Time per Device =
IF (
[Time]
= CALCULATE (
MAX ( 'PowerBI'[Time] ),
FILTER ( 'PowerBI', 'PowerBI'[Device] = EARLIER ( [Device] ) )
),
"Is Latest Time per Device",
"Other"
)
然后我会将该列用作过滤器,例如添加到 Visual Level Filter 井,然后选择 "Is Latest Time per Device" 条目。然后您可以在过滤后的视觉对象中使用纬度和经度列。
我的建议是创建一个仅包含每个设备的最后位置的计算 table,并将该 table 用作地图的数据集。
这应该会给你 table 你想要的:
= ADDCOLUMNS(SUMMARIZECOLUMNS(PowerBI[Device], "LastTime", MAX(PowerBI[Time])),
"Lat", CALCULATE(MAX(PowerBI[Lat]),
FILTER(PowerBI, PowerBI[Time] = [LastTime])),
"Lon", CALCULATE(MAX(PowerBI[Lon]),
FILTER(PowerBI, PowerBI[Time] = [LastTime])))
现在,每次您的实时数据更新时,计算得出的 table 也应该更新并为您提供最新的 GPS 坐标以显示在地图上。
我认为这不可能是你想做的。
但是,您可以使用 Power BI API 直接推送数据集而不是 Azure 流分析,并且 post GPS 将自己坐标到 API。
您可以事先清除 table ,这样您最终只会得到最新的值。遗憾的是,您无法删除或更新单行,因此每次都必须 post 完整 table。这有点麻烦,但它确实有效。如果您的地图上有几个项目,删除 table 中的所有行并再次添加它们的性能影响并不是什么大问题。
我们在一些项目中使用了这种技术,而且效果非常快。我们只会每隔几分钟更新一次 GPS 坐标,并且只有 post 到 API 发生变化时才会更新。
您可以使用 https://github.com/Microsoft/PowerBI-CSharp C# API 库来简化 posting 到 API。
这可能不是您要找的答案,但我建议您采取一些解决方法:
- 使用按日期排序的前 N 个过滤器(您可以在实时数据集中使用其中一个)。您的地图将仅显示最后的点或最短路径。
- 修改 RoutMap 自定义视觉对象以仅绘制最后一个值。我想如果你有代码应该很容易:) https://github.com/weiweicui/PowerBI-Routemap