hero丨me 2024-06-17 16:34 采纳率: 0%
浏览 41
已结题

如何使用postGis实现最短领规划?

如何使用PostGIS和pgRouting实现最短路径规划?
条件是有两张表:

CREATE TABLE "public"."line" (
  "smid" int4 NOT NULL DEFAULT nextval('line_smid_seq'::regclass),
  "smuserid" int4 NOT NULL DEFAULT 0,
  "smtopoerror" int4 NOT NULL DEFAULT 0,
  "smlength" float8 NOT NULL DEFAULT 0,
  "smgeometry" "public"."geometry",
  "smgeoparam" bytea,
  "line_id" varchar(50) COLLATE "pg_catalog"."default",
  "line_length" float8,
  "left_point_id" varchar(50) COLLATE "pg_catalog"."default",
  "left_depth" float8,
  "left_height" float8,
  "left_longitude" float8,
  "left_latitude" float8,
  "right_point_id" varchar(50) COLLATE "pg_catalog"."default",
  "right_depth" float8,
  "right_height" float8,
  "right_longitude" float8,
  "right_latitude" float8,
  "life_length" float8
);
CREATE TABLE "public"."point" (
  "smid" int4 NOT NULL DEFAULT nextval('point_smid_seq'::regclass),
  "smuserid" int4 NOT NULL DEFAULT 0,
  "smgeometry" "public"."geometry",
  "point_id" varchar(50) COLLATE "pg_catalog"."default",
  "longitude" float8,
  "latitude" float8,
  "x" varchar(50) COLLATE "pg_catalog"."default",
  "y" varchar(50) COLLATE "pg_catalog"."default",
  "height" float8,
  "depth" float8,
  "line_id" varchar(50) COLLATE "pg_catalog"."default"
);

需要通过这两张表计算出两个点之间的最短路径规划;以下是我写的实现方案,但是结果是不正确的(查出来的路径乱七八糟的,有连接的,也有不连接的)。

--pgrouting依赖postgis
CREATE EXTENSION PostGIS;
CREATE EXTENSION pgRouting;
--创建字段
ALTER TABLE line ADD COLUMN "source" INTEGER  default null;
ALTER TABLE line ADD COLUMN "target" INTEGER  default null;
ALTER TABLE line ADD COLUMN "the_geom" geometry default null;
ALTER TABLE line ADD COLUMN "cost" DOUBLE PRECISION  default null;
--创建拓扑
-- select pgr_createtopology('line',0.000001,the_geom:='the_geom',id:='gid',source:='source',target:='target',rows_where:='true', clean:=false)
select pgr_createtopology('line',0.000001,the_geom:='the_geom',id:='smid',source:='source',target:='target',rows_where:='true', clean:=TRUE);
-- -- 计算线的长度
UPDATE line SET cost =st_length(ST_Transform(smgeometry,4326));
UPDATE line SET the_geom = st_makeline(st_point(left_longitude,left_latitude),st_point(right_longitude,right_latitude));  
--计算最短距离 测试语句
select b2.SmId as smId,b2.line_id as lineId,a1.seq as seq,b2.left_longitude as leftLongitude,b2.left_latitude as leftLatitude,
       b2.right_longitude as rightLongitude,b2.right_latitude as rightLatitude,a1.agg_cost as aggCost
from pgr_dijkstra('select smid as id,source,target,cost from line',78015,61218,false) a1
         join line b2 on a1.node=b2.SmId order by a1.seq;

78015,61218 为起点线的ID与终点线的ID;

卡住我太久了,求解决办法。

  • 写回答

34条回答 默认 最新

报告相同问题?

问题事件

  • 系统已结题 6月25日
  • 创建了问题 6月17日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?