PostGis+GeoServer+OpenLayers最短路径分析

使用PostGis存储路线数据,在GeoServer中发布路网图层和最短路径图层,通过OpenLayers建立路网和展示图层。

1、PostGis:PostgreSQL 12.4,
2、GeoServer:geoserver-2.17.2
3、OpenLayers:6.4.3

一、做成路网数据

1、在PostGis建立路网数据表,主键使用sequence,路网geom 使用geometry(LineString,4326)

CREATE SEQUENCE public.my_roads_id_seq
    INCREMENT 1
    START 1
    MINVALUE 1
    MAXVALUE 2147483647
    CACHE 1;
    
ALTER SEQUENCE public.my_roads_id_seq OWNER TO postgres;

CREATE TABLE public.my_roads
(
    id integer NOT NULL DEFAULT nextval('my_roads_id_seq'::regclass),
    name character varying(32) COLLATE pg_catalog."default",
    geom geometry(LineString,4326),
    CONSTRAINT my_roads_pkey PRIMARY KEY (id)
)TABLESPACE pg_default;

ALTER TABLE public.my_roads OWNER to postgres;

2、在GeoServer中发布路网图层

建立工作区,建立postgis的数据存储,发布my_roads图层。
在这里插入图片描述
EPSG使用4326,边框及经纬度为:【-180,-90 】【180,90】即可。
在这里插入图片描述

3、OpenLayers中建立路网

使用vue开发路网编辑画面。
在这里插入图片描述
实现方式,请参考:OpenLayers 在Vue中增删改

注意点:新增的线不再是newFeature.setGeometry(new MultiLineString([geometry.getCoordinates()]))

// 转换坐标
 let geometry = this.drewFeature.getGeometry().clone();
 geometry.applyTransform(function (flatCoordinates, flatCoordinates2, stride) {
   
   
     for (let j = 0; j < flatCoordinates.length; j += stride) {
   
   
         let y = flatCoordinates[j];
         let x = flatCoordinates[j + 1];
         flatCoordinates[j] = x;
         flatCoordinates[j + 1] = y;
     }
 });

 // 设置feature对应的属性,这些属性是根据数据源的字段来设置的
 let newFeature = new Feature();
 newFeature.setId('nyc_roads.new.' + this.newId);
 newFeature.setGeometryName('the_geom');
 newFeature.set('the_geom', null);
 newFeature.set('name', newFeature.getId());
 newFeature.setGeometry(new MultiLineString([geometry.getCoordinates()]));

而是newFeature.setGeometry(geometry);

// 转换坐标
let geometry = this.drewFeature.
### 基于 PostGISGeoServerOpenLayers 的路径规划功能原理与实现方法 #### 1. 路径规划的基本原理 路径规划是指在地理空间网络中找到从起点到终点的最优或最短路径。通常基于图论算法,例如 Dijkstra 算法或 A* 算法,在 GIS 中通过拓扑结构和空间数据库进行实现。PostGIS 提供了强大的空间数据存储与处理能力,结合 GeoServer 可以将路径分析结果发布为 WMS 或 WFS 服务,最终使用 OpenLayers 在前端地图上展示路径结果 [^1]。 #### 2. 数据准备与处理 - **数据格式要求**:用于路径规划的数据应为 LineString 类型,而非 MultiLineString。若原始数据是 MultiLineString 类型,则需进行打断处理,使其转换为多个独立的 LineString 片段。 - **打断工具**: - 使用 ArcMap 中的功能将 MultiLineString 转换为 LineString; - 利用 ArcPy 中的 `FeatureToLine_management` 函数进行线要素打断 [^2]。 - **数据入库问题**:即使打断后存入数据库,仍可能显示为 MultiLineString 类型。解决方法是使用 PostGIS 自带的 **PostGIS Shapefile Import/Export Manager** 插件,在导入数据前勾选相应选项,确保数据类型正确转换 [^1]。 #### 3. 空间函数的应用 在 PostgreSQL + PostGIS 环境下,常用的空间函数包括: - `ST_Line_Locate_Point`:用于计算点在线上的位置比例,常用于路径定位。注意该函数仅接受 LineString 类型作为第一个参数,否则会报错:“line_locate_point : 1st arg isn’t a line” [^2]。 - 解决方案:对 MultiLineString 类型的数据调用 `ST_GeometryN(geom, 1)` 来提取其中的第一个 LineString 片段,再传入函数进行处理 [^1]。 #### 4. GeoServer 配置与服务发布 - 将处理后的路径数据发布为图层; - 配置 WMS/WFS 服务,支持路径可视化及属性查询; - 可通过 GeoServer 的样式管理器(SLD)定义路径颜色、宽度等样式信息。 #### 5. OpenLayers 实现路径展示 OpenLayers 是一个开源的 JavaScript 地图库,可以加载 GeoServer 发布的地图服务,并实现交互式路径展示。 - 加载 WMS 图层示例: ```javascript import Map from 'ol/Map'; import View from 'ol/View'; import TileLayer from 'ol/layer/Tile'; import OSM from 'ol/source/OSM'; import ImageWMS from 'ol/source/ImageWMS'; const map = new Map({ target: 'map', layers: [ new TileLayer({ source: new OSM() }), new ImageWMS({ url: 'http://geoserver:8080/geoserver/wms', params: {'LAYERS': 'workspace:path_layer'}, serverType: 'geoserver' }) ], view: new View({ center: [0, 0], zoom: 2 }) }); ``` - 对于路径查询结果,可通过 AJAX 请求获取 GeoJSON 数据并在地图上绘制路径线。 #### 6. 最短路径分析实现流程 1. 客户端(OpenLayers)发送起点与终点坐标请求; 2. GeoServer 接收请求并调用 PostGIS 的 SQL 查询语句执行路径分析; 3. 使用 Dijkstra 算法结合 pgRouting 扩展模块计算最短路径; 4. 返回路径几何对象(LineString); 5. GeoServer 渲染路径并返回图像或 GeoJSON 格式; 6. OpenLayers 展示路径结果并支持用户交互操作。 #### 7. 常见问题及解决方案 - **路径线条杂乱**:可能是由于路径数据未正确打断导致,检查数据是否为 LineString 类型; - **函数参数错误**:如 `ST_Line_Locate_Point` 报错,需确认输入为 LineString 类型,可使用 `ST_GeometryN` 转换; - **找不到插件**:如 PostGIS Shapefile Import/Export Manager 缺失,可参考相关博客排查安装问题。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值