【数据库pgsql】车辆轨迹分析视图的创建和查询代码解析

这段代码包含两部分:1) 创建一个视图,2) 查询该视图。这是车辆轨迹分析的代码。让我逐行详细解释:

第一部分:创建视图

sql 复制代码
create view CurrentTrack as
select carid, position, b.id as roadID
from track as a, road as b
where ST_Distance(position, geom) <= all(select ST_Distance(position, c.geom) from road as c)
and time = (select max(time) from track as d where d.carid = a.carid);

第1行:创建视图

sql 复制代码
create view CurrentTrack as
  • 创建一个名为 CurrentTrack 的视图

第2-3行:选择字段

sql 复制代码
select carid, position, b.id as roadID
from track as a, road as b
详细解析:
  1. 字段选择

    • carid:车辆ID(来自 track 表)

    • position:车辆位置(几何点)

    • b.id as roadID:道路ID(来自 road 表)

  2. FROM 子句

    sql 复制代码
    from track as a, road as b
    • 这是隐式连接(笛卡尔积)

    • track as a:轨迹表,别名 a

    • road as b:道路表,别名 b

    • 会产生 track × road 的所有组合

  3. 表结构假设

    sql 复制代码
    -- 轨迹表:记录车辆位置和时间
    track(carid, position, time, ...)
    -- carid: 车辆ID
    -- position: 车辆位置(Point几何类型)
    -- time: 时间戳
    
    -- 道路表:道路网络
    road(id, geom, ...)
    -- id: 道路ID
    -- geom: 道路几何(LineString或MultiLineString)

第4-5行:WHERE 条件

sql 复制代码
where ST_Distance(position, geom) <= all(select ST_Distance(position, c.geom) from road as c)
功能:为每个车辆位置找到最近的道路
  1. ST_Distance(position, geom)

    • PostGIS 函数,计算车辆位置到道路几何的距离

    • position:车辆位置点

    • geom:道路几何线

  2. 子查询

    sql 复制代码
    (select ST_Distance(position, c.geom) from road as c)
    • 计算该车辆位置到所有道路的距离

    • 返回所有距离值的集合

  3. <= all(...)

    • 比较操作符

    • 含义:ST_Distance(position, geom) 小于等于所有距离

    • 等价于:该距离是最小的距离

    • 效果:为车辆位置找到最近的一条道路

简单来说:这个条件确保只保留距离最近的那条道路

第6行:时间条件

sql 复制代码
and time = (select max(time) from track as d where d.carid = a.carid);
功能:只选择每个车辆的最新位置
  1. 子查询

    sql 复制代码
     (select max(time) from track as d where d.carid = a.carid);
    • 查找同一车辆 (d.carid = a.carid) 的最大时间

    • 返回该车辆的最新时间戳

  2. 条件

    • time = ...:只选择时间等于最新时间的记录

    • 效果:对每个车辆,只保留最后一条轨迹记录

视图 CurrentTrack 的最终含义:

  • 显示每辆车的最新位置

  • 以及该位置最近的一条道路

  • 结果包含三列:carid, position, roadID

第二部分:查询视图

sql 复制代码
select roadID, count(carlD)
from currentTrack
group by roadID
order by count(carlD) desc

第1-2行:选择并统计

sql 复制代码
select roadID, count(carlD)
from currentTrack
  • 注意:这里有拼写错误 carlD 应该是 carid

  • CurrentTrack 视图中查询

  • 选择:roadID 和车辆数量

第3行:分组

sql 复制代码
group by roadID
  • roadID(道路ID)分组

  • 每一条道路为一组

第4行:排序

sql 复制代码
order by count(carlD) desc
  • 按车辆数量降序排序

  • desc:从大到小

  • 车辆最多的道路排在最前面

查询的最终结果:

统计每条道路上有多少辆车的最新位置,并按车辆数量排序。

实际应用场景:

这是一个实时交通监控系统

步骤1:创建实时视图 (CurrentTrack)

  • 监控所有车辆的最新位置

  • 将每个位置匹配到最近的道路

  • 结果为:每辆车 + 所在道路

步骤2:统计道路拥堵情况

  • 统计每条道路上的车辆数量

  • 按车辆数量排序

  • 识别最拥堵的道路

代码优化建议:

1. 修正拼写错误

sql

复制代码
-- 原代码有拼写错误
select roadID, count(carlD)  -- 应该是 carid

-- 修正为:
select roadID, count(carid)

2. 提高性能(视图优化)

原视图使用笛卡尔积和 <= all(...),性能较差:

sql

复制代码
-- 优化版本
create view CurrentTrack_Optimized as
select 
    t.carid,
    t.position,
    r.id as roadID
from (
    -- 每个车辆的最新位置
    select distinct on (carid) carid, position, time
    from track
    order by carid, time desc
) as t
cross join lateral (
    -- 找到最近的道路(更高效的写法)
    select id, geom
    from road
    order by ST_Distance(t.position, geom)
    limit 1
) as r;

3. 完整示例数据

sql

复制代码
-- 轨迹表数据示例
carid | position            | time
------+---------------------+---------------------
   1  | POINT(116.397,39.907) | 2023-01-01 10:00:00
   1  | POINT(116.398,39.908) | 2023-01-01 10:01:00
   2  | POINT(116.400,39.910) | 2023-01-01 10:00:00

-- 道路表数据示例
id | geom
---+----------------------------------------
101| LINESTRING(116.396 39.906,116.399 39.909)
102| LINESTRING(116.399 39.909,116.402 39.912)

-- CurrentTrack 视图结果示例
carid | position            | roadID
------+---------------------+-------
   1  | POINT(116.398,39.908) | 101
   2  | POINT(116.400,39.910) | 102

-- 最终查询结果示例
roadID | count
-------+-------
  101  |   1
  102  |   1

总结:

这段代码实现了一个简单的实时交通监控系统

  1. 视图:追踪每辆车的最新位置,并匹配到最近道路

  2. 查询:统计每条道路上的车辆数量,识别拥堵道路

这样的系统可用于:

  • 交通管理部门监控实时路况

  • 导航系统提供拥堵信息

  • 城市规划分析道路使用情况

相关推荐
AiTop10032 分钟前
英伟达Rubin芯片提前量产,物理AI“ChatGPT 时刻” 降临
人工智能·chatgpt
阿正的梦工坊43 分钟前
Git Rebase 是什么?为什么需要它?
人工智能·git
檐下翻书1731 小时前
法律文书自动生成与逻辑校验
人工智能
de之梦-御风1 小时前
【深度学习】模型从训练完成到产线运行的完整使用方式
人工智能·深度学习
姓蔡小朋友1 小时前
算法-滑动窗口
算法
Java后端的Ai之路1 小时前
【人工智能领域】-YOLO目标检测算法全解析(含大白话解释)
人工智能·yolo·目标检测·cnn
百家方案1 小时前
“十五五”智慧城市解决方案:从技术赋能到场景智治,再造城市生命共同体
人工智能·智慧城市
_codemonster1 小时前
深度学习实战(基于pytroch)系列完整目录
人工智能·深度学习
君义_noip1 小时前
信息学奥赛一本通 2134:【25CSPS提高组】道路修复 | 洛谷 P14362 [CSP-S 2025] 道路修复
c++·算法·图论·信息学奥赛·csp-s
RichardLau_Cx1 小时前
针对不同类别AI设计工具的核心使用方法
人工智能