数据领域是广阔而多面的,不同类型的数据需要不同的处理技术。对于地理空间数据,一个名为 PostGIS 的强大 Postgres 扩展可以扩展这个开源数据库,用一流的地理空间对象和广泛的功能集来丰富您的表格,以便与它们进行交互。
当与选择 Timescale 数据库时获得的时间序列功能相结合时,这将非常强大。
在这篇博文中,我们将讨论如何将这些数据类型设置整合在一起,以管理和操作地理空间和时间序列数据。
连接到您的 Timescale 实例,并创建一个新数据库
CREATE EXTENSION postgis IF NOT EXISTS;
在 Timescale 上,您可以通过转到 操作 > 扩展
从您的服务概述中找到可用的扩展,这也会提供安装说明。
现在,创建一个假设的表,用于存储地理空间时间序列数据:一支送货车辆车队及其随时间的 GPS 坐标。
CREATE TABLE vehicle_location (
time TIMESTAMPTZ NOT NULL,
vehicle_id INT NOT NULL,
location GEOGRAPHY(POINT, 4326)
);
这里,location
是一个 GEOGRAPHY
类型列,用于存储 GPS 坐标(使用 4326/WGS84 坐标系),而 time
记录特定 vehicle_id
记录 GPS 坐标的时间。
要从这个常规 PostgreSQL 表创建时间序列超表并插入一些虚拟数据,请使用
SELECT create_hypertable('vehicle_location', 'time');
CREATE INDEX ON vehicle_location(vehicle_id, time DESC);
INSERT INTO vehicle_location VALUES
('2023-05-29 20:00:00', 1, 'POINT(15.3672 -87.7231)'),
('2023-05-30 20:00:00', 1, 'POINT(15.3652 -80.7331)'),
('2023-05-31 20:00:00', 1, 'POINT(15.2672 -85.7431)');
要获取特定车辆(例如,车辆 1)在特定时间段内的所有位置,您可以像这样查询 Timescale
SELECT *
FROM vehicle_location
WHERE vehicle_id = 1 AND time BETWEEN '2023-05-30 00:00:00' AND '2023-05-31 23:59:59';
要使用 Timescale SkipScan 功能有效地获取所有车辆的最后已知位置,我们可以编写一个稍微复杂的查询
SELECT DISTINCT ON (vehicle_id) vehicle_id, ST_AsText(location) AS location
FROM vehicle_location
WHERE time > now() - INTERVAL '24 hours'
ORDER BY vehicle_id,
time DESC;
这里,ST_AsText(location)
用于将二进制地理空间数据转换为人类可读的格式。
要获取在任何时间都位于特定点 (15.2 -85.743)
1 公里范围内的所有车辆,我们可以使用以下 SQL
SELECT DISTINCT vehicle_id
FROM vehicle_location
WHERE ST_DWithin(
location,
ST_GeogFromText('POINT(15.2 -85.743)'),
1000
);
在这个查询中,ST_DWithin(location, ST_GeogFromText('POINT(15.2 -85.743)'), 1000)
检查 location
是否位于点 (15.2 -85.743)
的 1,000 米范围内。
当我们将 PostGIS 和 Timescale 结合在一起时,PostgreSQL 可以成为处理地理空间和时间序列数据的强大工具。这篇文章中展示的示例只是您使用这些工具可以做的事情的皮毛。这两个扩展都提供了更多功能,您可以使用它们对您的地理空间时间序列数据进行复杂的分析。
请记住,高效的数据分析都是关于选择合适的工具。有了 PostGIS 和 Timescale 作为您的武器,您就可以应对各种数据挑战,描述事情发生的时 间和地点。
祝您在时间和空间中愉快旅行!
想要了解更多关于扩展 PostgreSQL 以实现规模和时间序列场景的信息吗?查看 Timescale 文档中的教程以开始使用。