HGDB企业版数据库应用:基于GIS的最短路径规划及实时车辆位置查询和道路拥挤程度监测

299 阅读7分钟

一、目的

在当今数字时代,地理信息系统(GIS)和数据库技术的融合为城市规划、交通管理和实时数据分析带来了前所未有的便利。本文将介绍HGDB企业版数据库在GIS应用中的引人瞩目的成果,着重探讨了最短路径规划和实时车辆位置拥挤程度查询两个方面的创新性解决方案。

最短路径规划:让出行更高效

HGDB企业版数据库的强大性能使得基于GIS的最短路径规划变得更加高效和实用。通过结合GIS的空间路网数据和HGDB的pgRouting插件特性,我们能够在城市交通网络中轻松实现最短路径的规划与导航。这为城市居民提供了更便捷、更智能的出行选择,最大程度地减少了交通拥堵和时间浪费。

实时车辆位置拥挤程度查询:智慧交通管理的关键

HGDB企业版数据库不仅支持空间数据的存储与查询,还能够快速处理大规模的实时数据。通过结合车载传感器、GPS技术和HGDB企业版数据库的强大查询能力,我们能够实时监测城市道路上车辆的位置信息以及附近道路拥挤程度。这样的实时数据分析为城市交通管理者提供了宝贵的信息,使他们能够更灵活地调整交通信号灯、优化道路规划,以及更好地应对交通拥堵。

二、内容与设计思想

1,最短路径查询功能

HGDB企业版的pgRouting插件提供了空间数据库中的路网分析功能。最短路径查询是 pgRouting 中常见的应用之一,该功能允许你在网络中查找两个地点之间的最短路径。

2,实现车辆位置实时更新功能

本实验中,可在HGDB企业版数据库中构造触发器来监听是否有数据采集终端将新坐标写入或者更新,当触发器被触发时,服务器端监听到消息并将消息传递给客户端进行展示。

3,通过聚类算法查看车辆周围道路拥挤度

对数据库中的所有车辆进行聚类,按照每类中车辆的数量区分等级,如果用户查询的车辆等级靠前,说明此车辆的附近车辆较多,道路较为拥挤。

三、使用环境

环境如下:windows11系统

四、实验过程

1、环境配置

(1)HGDB企业版数据库安装

根据HGDB官方文档安装HGDB企业版数据库,安装好之后首先初始化数据库,然后创建数据库和用户,并将创建数据库的权限赋予给这个用户。

(2)安装扩展

为实现上述功能,需要打开HGDB企业版数据库的空间能力,需要安装HGDB企业版的postgis与pgRouting插件,使用SQL命令CREATE EXTENSION POSTGIS;CREATE EXTENSION PGROUTING;安装即可,方便快捷。

(3)安装node

安装node.js安装包,去官网nodejs.org/en/下载就好了,安装完成后,打开控制台或者打开node自带的控制命令窗口输入node -v显示版本号,就说明成功了。

2、具体设计

(1)路网数据获取

首先要下载OpenStreetMap中国地区数据,下载地址:Geofabrik Download Server。下载shapefile格式的数据,然后剪裁出济南历下区范围的路网数据。 由于OSM数据是WGS84坐标系(EPSG:4326)的,所以还需将其转换为Web墨卡托坐标系(EPSG:3857)。另外还需要使用ArcGIS中的“要素转线”这个工具将折线数据在相交点处打断。这样就可以获得济南历下区的路网数据。

osm.png

(2)建立数据库并导入数据

通过瀚高数据库管理工具直接创建一个名为pgrouting的数据库,为数据库安装postgis、pgRouting扩展,使用PostGIS Shapefile and DBF Exporter Manager工具将获取的济南历下区路网数据导入到pgRouting数据库中,生成表lixia_feature。将车辆位置数据也通过该工具导入到数据库中,生成表car。

li.png

表lixia_feature

car.png

表car

(3)设置路径成本并建立路网拓扑

首先为lixia_feature表添加四个字段(后面涉及到对应字段时再详细解释):

  • source —— 用于保存路径起始顶点的id
  • target —— 用于保存路径终止顶点的id
  • cost —— 用于保存路径正向的成本(或者代价)
  • reverse_cost —— 用于保存路径反向的成本(或者代价)

SQL语句:

ALTER TABLE lixia_feature
ADD COLUMN source INTEGER,
ADD COLUMN target INTEGER,
ADD COLUMN cost DOUBLE PRECISION,
ADD COLUMN reverse_cost DOUBLE PRECISION;

OSM数据包含一个oneway列,它的值可能是以下三个值之一:

  • 'F' —— 表示该路径是单向的,且路径方向是正向的。
  • 'T' —— 表示该路径是单向的,且路径方向是反向的。
  • 'B' —— 表示该路径是双向的。

现在就根据路径的方向来计算各个路径的成本。

将路径的长度作为成本,如果路径是正向的,则cost值为路径的长度,reverse_cost值为-1;如果路径是反向的,则reverse_cost值为路径的长度,cost值为-1;如果路径是双向的,则cost和reverse_cost的值都为路径的长度。

①正向路径的成本:

UPDATE lixia_feature
SET cost = ST_Length(geom), reverse_cost = -1
WHERE oneway = 'F';

②反向路径的成本:

UPDATE lixia_feature
SET reverse_cost = ST_Length(geom), cost = -1
WHERE oneway = 'T';

③双向路径的成本:

UPDATE lixia_feature
SET cost = ST_Length(geom), reverse_cost = ST_Length(geom)
WHERE oneway = 'B';

创建路网拓扑需要调用pgr_createTopology函数:

SELECT pgr_createTopology(
	'lixia_feature', 
	0.001,
	'geom',
	'gid',
	'source',
	'target'
); 

拓扑路径创建完成后,数据库中会自动多出一张表lixia_feature_vertices_pgr,这张表保存了路径的起始、终止顶点数据:

微信截图_20231212174745.png

表lixia_feature_vertices_pgr

(3)使用pgr_dijkstra函数查找最短路径

HGDB企业版数据库的pgRouting插件可以使用pgr_dijkstra函数结合数据库路网数据使用Dijkstra算法实现最短路径搜索的功能。我们只需输入起始点与目标点,下面查询语句中的5834与4073代表起始点与目标点。

 SELECT
    ST_AsGeoJSON(ST_LineMerge(st_union(st_transform(lixia_feature.geom,4326))))::json AS geojson
FROM
    pgr_dijkstra(
        'SELECT gid AS id,
                source, target,
                cost, reverse_cost,
                name,
                geom
         FROM lixia_feature',
         5834,4073,
        directed := TRUE
    ) AS dijkstra
JOIN lixia_feature ON dijkstra.edge = lixia_feature.gid;

通过HGDB企业版数据库postgis插件的 ST_AsGeoJSON函数将查询结果转为GeoJSON格式方便前端渲染。

(4)构造HGDB数据库触发器,对car表的增删改查进行监测

CREATE OR REPLACE FUNCTION changes()
RETURNS TRIGGER AS
$$
BEGIN
-- 发送 JSON 格式的变化数据到名为 'spatial_table_changes' 的通道
PERFORM pg_notify('car_changes', row_to_json(NEW)::text);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;


CREATE TRIGGER after_change
AFTER INSERT OR UPDATE OR DELETE
ON car
FOR EACH ROW
EXECUTE FUNCTION changes();

(5)聚类分析判断道路拥挤程度

通过HGDB-postgis函数ST_ClusterDBSCAN对所有车辆的坐标进行聚类,类簇中坐标点的数目可以代表车辆密集程度,根据车辆所在类簇中车辆的数目可以判断小车周围道路的拥挤程度,按照同一类簇中车辆数目我们把拥挤程度分为“拥堵”,“一般”和“畅通”。

 WITH ClusteredData AS (
          SELECT
            id,
            ST_ClusterDBSCAN(st_transform(geom, 3857), eps := 100, minpoints := 2) OVER () AS cid
          FROM
            car
        )
        SELECT
          COUNT(*) AS num_points_in_cluster
        FROM
          ClusteredData
        WHERE
          cid = (SELECT cid FROM ClusteredData WHERE id = 5834)

实时监测id=5834车辆周围道路的拥挤情况。

(6)服务器端和客户端

创建项目,项目中包含两个文件,server与traffic.html。服务端文件server负责连接数据库,根据路网数据查询起始点到终点的最短路径并监听数据库car表的车辆位置信息,当位置信息更新时,服务端通过触发器获取车辆位置变化并通过聚类分析查询车辆当前周围道路拥挤程度。客户端是html文件,对查询到的最短路径与车辆情况进行实时渲染。

20231206_180601.gif

下面是该项目的仓库地址,里面有所用到的一些数据以及前后端的设计。

github.com/zuochenwei/…