
MobilityDB查询完全手册时空重叠、距离计算与轨迹插值SQL函数大全【免费下载链接】MobilityDBMobilityDB is a geospatial trajectory data management analysis platform, built on PostgreSQL and PostGIS.项目地址: https://gitcode.com/gh_mirrors/mo/MobilityDBMobilityDB 是一个构建在 PostgreSQL 和 PostGIS 之上的时空轨迹数据管理与分析平台。本手册面向新手系统讲解三大高频查询场景时空重叠判断谁在谁附近出现过、轨迹距离计算最近接近距离和轨迹插值任意时刻位置帮助你用 SQL 快速上手 MobilityDB 轨迹数据库查询。 先认识核心类型TGeomPoint在写查询之前先理解 MobilityDB 的轨迹类型体系。一条轨迹由时间-位置对TValue序列构成每个值代表某个时刻的一个点。tgeompoint平面坐标系如 UTM 投影坐标下的移动点轨迹tgeogpoint地理坐标系经纬度米制单位下的移动点轨迹tfloat / tbox / stbox轨迹上的其他数值和时间-空间包围盒类型一条轨迹还可以用tstzspan时间跨度和stbox空间包围盒共同描述它的时间和空间范围这正是后面所有时空查询的基础。 时空重叠查询轨迹经过某区域了吗时空重叠是轨迹分析的第一需求这条车轨在 8 点到 9 点之间是否穿过公园MobilityDB 提供了两类运算符。时间重叠运算符轨迹与时间区间tstzspan的关系判断定义见 062_tpoint_posops.in.sql运算符含义示例语义包含contains时间区间完全覆盖轨迹被包含contained轨迹完全落在时间区间内重叠overlap轨迹与时间区间有交集#/#之前 / 之后strict before / after轨迹严格早于 / 晚于时间区间#/#之前(含端点) / 之后(含端点)端点接触也算-- 查询 2024 年 1 月 1 日 8:00-9:00 之间活动的轨迹 SELECT id FROM tpts WHERE tgeom [2024-01-01 08:0000, 2024-01-01 09:0000]::tstzspan;时空拓扑关系函数当对象是区域 轨迹时使用带t前缀的函数完整清单见 072_tpoint_tempspatialrels.in.sql。它们返回tbool类型——即什么时间段内满足该关系比普通布尔值信息量更大函数作用tContains(geom, tgeompoint)轨迹在何时段完全位于区域内tIntersects(geom, tgeompoint)轨迹在何时段与区域相交经过判断首选tDisjoint(geom, tgeompoint)轨迹与区域是否始终不相交tCovers/tTouches覆盖 / 仅接触相切tDwithin(geom, tgeompoint, dist)轨迹在何时段距离区域不超过 dist 米-- 找出所有曾进入 100 米缓冲区的路径轨迹 SELECT id FROM tpts WHERE tDwithin(POLYGON((0 0, 0 1000, 1000 1000, 1000 0, 0 0)), tgeom, 100); 小技巧判断是否经过只需tIntersects(...) IS TRUE若想拿到具体时间段直接保留 tbool 结果即可。 距离计算函数两条轨迹最近有多近距离函数定义在 064_tpoint_distance.in.sql是事故检测、跟车分析的核心函数运算符返回类型说明tDistance(a, b)-tfloat任意时刻两轨迹间的距离变化曲线nearestApproachDistance(a, b)||float最近接近距离标量最常用nearestApproachInstant(a, b)—tgeompoint最近接近时刻与双方位置shortestLine(a, b)—geometry最近点之间的连线可用于可视化-- 找出最近距离小于 50 米的轨迹对潜在碰撞 SELECT a.id, b.id, nearestApproachDistance(a.tgeom, b.tgeom) AS nad FROM tpts a JOIN tpts b ON a.id b.id WHERE a.tgeom || b.tgeom 50.0;nearestApproachInstant配合shortestLine还能画出何时何地最接近的连线非常适合事故复盘SELECT shortestLine(nai1, nai2) FROM nearestApproachInstant(a.tgeom, b.tgeom) LATERAL (SELECT 1) x; -- 实际写法见官方文档示例下图对比了不同距离度量方式欧氏距离与基于 SED 的度量在轨迹分析中的差异帮助你选择合适的度量 轨迹插值任意时刻车在哪里轨迹本质上是离散采样点序列但tAtTime系列函数可以对轨迹进行连续插值返回任意时刻的位置——这是 MobilityDB 最有魔法感的查询能力。核心插值函数函数作用tAtTime(tgeompoint, t)轨迹在时刻 t 的插值位置支持时间戳、时间区间tAtCumLength(tgeompoint, l)轨迹在累计里程 l 处的位置tAtLength/tAtTime反向查询已知位置反查时间或里程trajectory(tgeompoint)将轨迹投影为普通 LINESTRING便于 PostGIS 可视化-- 查询 08:30 时所有车辆的位置插值结果 SELECT id, tAtTime(tgeom, 2024-01-01 08:30:0000) AS pos FROM tpts; -- 用 PostGIS 渲染整条轨迹线 SELECT id, trajectory(tgeom) FROM tpts;时间区间参数同样支持tAtTime(tgeom, [08:0000, 09:0000])会返回该时段内的分段轨迹。轨迹切割与采样围绕插值还有一组切轨迹的实用函数定义见 056_tpoint_spatialfuncs.in.sqlsplitN(tgeom, n)/splitNSegments把轨迹按段数切分splitNTimes(tgeom, n)把轨迹按时长均分resample按固定时间间隔重采样length(tgeom)/cumulativeLength(tgeom)轨迹总长与累计里程曲线convexHull(tgeom)轨迹的凸包活动范围分析 组合查询实战三个典型场景场景 1某区域内、某时段内、曾减速到 10km/h 以下的车辆SELECT id FROM tpts WHERE tIntersects(geom_col, tgeom) IS TRUE -- 空间时间过滤 AND minSpeed(tgeom) 2.78; -- 速度分析场景 2找出与事件点最近接近距离最小的前 10 条轨迹SELECT id, nearestApproachDistance(tgeom, event_point) AS nad FROM tpts ORDER BY nad LIMIT 10;场景 3还原两条轨迹的最接近瞬间SELECT nearestApproachInstant(a.tgeom, b.tgeom) AS nai FROM tpts a, tpts b WHERE a.id 1 AND b.id 2;⚡ 性能提示为轨迹列建立 GIST 时空索引gist_tgeompoint运算符类见 073_tpoint_gist.in.sql后、、-等运算可走索引扫描大表查询提速显著。 函数源码与文档速查类别核心文件距离函数mobilitydb/sql/geo/064_tpoint_distance.in.sql时空拓扑关系mobilitydb/sql/geo/072_tpoint_tempspatialrels.in.sql时间/位置运算符mobilitydb/sql/geo/062_tpoint_posops.in.sql包围盒与切分mobilitydb/sql/geo/060_tpoint_boxops.in.sql空间函数mobilitydb/sql/geo/056_tpoint_spatialfuncs.in.sql时空索引mobilitydb/sql/geo/073_tpoint_gist.in.sql时间核心 API 头文件meos/include/temporal/temporal.h时间类型设计笔记doc/contributing/new_temporal_type.md更多类型区域轨迹tgeometry、姿态轨迹tpose、轨迹缓冲tcbuffer都遵循同一套时间 × 空间函数模式掌握本文的tgeompoint用法后其他类型可无缝迁移。现在打开你的 PostgreSQL 客户端用CREATE EXTENSION mobilitydb;开始第一条轨迹查询吧【免费下载链接】MobilityDBMobilityDB is a geospatial trajectory data management analysis platform, built on PostgreSQL and PostGIS.项目地址: https://gitcode.com/gh_mirrors/mo/MobilityDB创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考