探索地理时序 Flux
作者:Nate Isley / 用例, 开发者, 产品
2020 年 7 月 1 日
导航至
Flux 最近为其武器库添加了地理时序功能,我一直在探索如何有效地使用时间序列和地理位置数据的新组合。为了帮助您入门,我们将介绍地理时序概述,然后研究几个示例。
如果您想使用 InfluxDB 2.0 OSS(开源)或 InfluxDB Cloud 进行跟进,请部署此 AWS Lambda 以从美国地质调查局 (USGS) 收集每小时地震数据。
地理时序 Flux:概述
Flux 的地理时序能力源自 Golang S2 Geometry 库。S2 基于球面几何,这使其非常适合回答地理位置问题。
S2 有许多细节,但与 Flux 相关的关键概念是 S2 单元及其级别(从 0 到 30)。S2 单元以四个球面测地线为界。在级别 0,一个 S2 单元代表大约 8500 万平方公里2,并且随着级别的增加,S2 单元被细分为更小的区域。在级别 30,单个细分代表的面积略小于 1 平方厘米2。
从技术上讲,Flux 中的地理时序分析仅需要纬度和经度。但是,使用 S2 单元标识符 (ID) 标记您的数据有助于高效地大规模分析数据。S2 单元 ID(有时称为 S2 单元令牌)唯一标识指定级别的 S2 单元。要使用 S2 单元 ID,您可以选择在查询时或在将数据写入 InfluxDB 时计算它们。
在查询时计算使用 Flux 来计算 S2 单元 ID。每次查询都计算 S2 单元 ID 会花费时间,并且当在同一数据集上执行多个查询时效率低下。相比之下,在摄取数据时准备 S2 单元 ID 可以跳过查询时的计算,但会增加基数的成本。对于那些使用 Telegraf 进行数据采集的人来说,有一个 S2 Geo 处理器插件,它允许您计算 S2 单元 ID 并将其添加到您的纬度和经度数据中。
如果您决定在摄取时添加 S2 单元 ID,请考虑您的地理时序计算的精度和基数,并相应地调整您的 S2 级别。例如,在级别 0,六个 S2 单元 ID 代表地球,但在级别 16,需要超过 250 亿个。当然,如果您只跟踪陆地上某物的运动,这可以显着减少您需要的 S2 单元数量;这意味着您很可能可以提高精度——假设您捕获的纬度和经度数据也具有足够的精度。
地震 Lambda 在摄取时使用级别 9 S2 单元 ID 计算和标记地震?在级别 9,每个 S2 单元 ID 的宽度约为 12 英里(19.31 公里),地球上有 150 万个可能的 S2 单元 ID。对于分析地震数据,这在粒度和基数之间取得了良好的平衡。对于您的用例,您可能需要更高或更低的精度级别。
地理时序 Flux 示例
让我们深入研究 USGS 地震数据的实时分析。此初始示例查找在过去 24 小时内发生在大致代表美国大陆西海岸的区域内的地震
import "experimental/geo"
from(bucket: "Earthquake")
|> range(start: -24h)
|> filter(fn: (r) => r["_measurement"] == "geo")
|> filter(fn: (r) => r["_field"] == "lat" or r["_field"] == "lon")
|> geo.filterRows(
region: {
minLat: 32.245914,
maxLat: 49.259394,
minLon: -126.860380,
maxLon: -114.715901
}
)
我们使用最大和最小纬度和经度定义了一个框,并且 geo 函数确保只为我们提供这些边界内的地震列表。
对于那些简单框不适合您的用例的情况,Flux 提供了圆形和通用多边形。例如,在这里我调查了过去 7 天内在旧金山湾区五个县(我经常旅行的旧金山县、马林县、阿拉米达县、康特拉科斯塔县和圣马特奥县)大致界定的区域内发生的地震数量
import "experimental/geo"
from(bucket: "Earthquake")
|> range(start: -7d)
|> filter(fn: (r) => r["_measurement"] == "geo")
|> filter(fn: (r) => r["_field"] == "lat" or r["_field"] == "lon")
|> geo.filterRows(
region: {
points: [
{lat: 38.296395, lon: -123.022551}, {lat: 38.320102, lon: -122.879729}, {lat: 38.190695, lon: -122.580351}, {lat: 38.060455, lon: -122.394375},
{lat: 38.043152, lon: -121.751675}, {lat: 38.112338, lon: -121.581387}, {lat: 37.825442, lon: -121.536068}, {lat: 37.546042, lon: -121.552121},
{lat: 37.482863, lon: -121.466977}, {lat: 37.451254, lon: -121.931149}, {lat: 37.454980, lon: -122.112390}, {lat: 37.214760, lon: -122.148095},
{lat: 37.054918, lon: -122.406274}, {lat: 37.990496, lon: -123.027002}
]
}
)
不过,如果您碰巧住在湾区,最好不要过多地关注结果。
最后一个示例说明了一个迭代查询,首先查找 USGS 在过去 24 小时内在全球范围内观测到的最强烈地震。然后,我们查看过去 7 天,并计算在该事件 200 公里范围内发生了多少次地震
import "experimental/geo"
max_eq =
from(bucket:"Earthquake")
|> range(start: -24h)
|> filter(fn: (r) => r._measurement == "geo")
|> geo.toRows()
|> group()
|> max(column: "mag")
|> findRecord(fn: (key) => true, idx: 0)
from(bucket:"Earthquake")
|> range(start: -7d)
|> geo.filterRows(region: {lat: max_eq.lat, lon: max_eq.lon, radius: 200.0}, strict: false)
|> group()
|> count(column: "mag")
下一步是什么?
要探索 InfluxDB 新兴的地理时序功能的更多信息,请查看 Tim Hall 的 InfluxDays 路线图演示。Tim 详细讨论了我们在地理时序数据采集、查询和可视化方面所做的工作。此外,我将继续发布新的博客,探索 Flux 的高级地理时序功能。
想立即分析您自己的数据吗?在 InfluxDB Cloud 2.0、InfluxDB Enterprise 1.8 和 InfluxDB OSS 2.0 中查看 Flux 的地理时序功能。
与往常一样,如果您有任何问题或反馈,请在我们的社区论坛中告诉我们,或加入我们的 Slack!