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

如何使用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 咨询一下有关于王者荣耀赢藏战绩
  • ¥100 求购一套带接口实现实习自动签到打卡
  • ¥50 MacOS 使用虚拟机安装k8s
  • ¥500 亚马逊 COOKIE我如何才能实现 登录一个亚马逊账户 下发新 COOKIE ..我使用下发新COOKIE 导入ADS 指纹浏览器登录,我把账户密码 修改过后,原来下发新COOKIE 不会失效的方式
  • ¥20 玩游戏gpu和cpu利用率特别低,玩游戏卡顿
  • ¥25 oracle中的正则匹配
  • ¥15 关于#vscode#的问题:把软件卸载不会再出现蓝屏
  • ¥15 vimplus出现的错误
  • ¥15 usb无线网卡转typec口
  • ¥30 怎么使用AVL fire ESE软件自带的优化模式来优化设计Soot和NOx?