postgis的使用问题

BreakAndUp 2017-05-17 06:41:46
这是一个创建查询空间数据库中最短路径函数的sql,直接上代码:

CREATE OR REPLACE FUNCTION pgr_fromAtoB(
IN tbl varchar,
IN x1 double precision,
IN y1 double precision,
IN x2 double precision,
IN y2 double precision,
OUT seq integer,
OUT gid integer,
OUT name text,
OUT heading double precision,
OUT cost double precision,
OUT geom geometry
)
RETURNS SETOF record AS
$BODY$
DECLARE
sql text;
rec record;
source integer;
target integer;
point integer;

BEGIN
-- 查询距离出发点最近的道路节点
EXECUTE 'SELECT id::integer FROM beijingroad_vertices_pgr
ORDER BY the_geom <-> ST_GeometryFromText(''POINT('
|| x1 || ' ' || y1 || ')'',900913) LIMIT 1' INTO rec;
source := rec.id;

-- 查询距离目的地最近的道路节点
EXECUTE 'SELECT id::integer FROM beijingroad_vertices_pgr
ORDER BY the_geom <-> ST_GeometryFromText(''POINT('
|| x2 || ' ' || y2 || ')'',900913) LIMIT 1' INTO rec;
target := rec.id;

-- 最短路径查询
seq := 0;
sql := 'SELECT gid, geom, roadeng as name, cost, source, target,
ST_Reverse(geom) AS flip_geom FROM ' ||
'pgr_bdAstar(''SELECT gid as id, source::int, target::int, '
|| 'length::float AS cost,x1,y1,x2,y2 FROM '
|| quote_ident(tbl) || ''', '
|| source || ', ' || target
|| ' ,false, false), '
|| quote_ident(tbl) || ' WHERE id2 = gid ORDER BY seq';


-- Remember start point
point := source;

FOR rec IN EXECUTE sql
LOOP
-- Flip geometry (if required)
IF ( point != rec.source ) THEN
rec.geom := rec.flip_geom;
point := rec.source;
ELSE
point := rec.target;
END IF;

-- Calculate heading (simplified)
EXECUTE 'SELECT degrees( ST_Azimuth(
ST_StartPoint(''' || rec.geom::text || '''),
ST_EndPoint(''' || rec.geom::text || ''') ) )'
INTO heading;

-- Return record
seq := seq + 1;
gid := rec.gid;
name := rec.name;
cost := rec.cost;
geom := rec.geom;
RETURN NEXT;
END LOOP;
RETURN;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE STRICT;

问题:

EXECUTE 'SELECT id::integer FROM beijingroad_vertices_pgr
ORDER BY the_geom <-> ST_GeometryFromText(''POINT('
|| x2 || ' ' || y2 || ')'',900913) LIMIT 1' INTO rec;
target := rec.id;

这句话的本意是从beijingroad_vertices_pgr表中找到与POINT( x2 y2)距离最近的点的id(表中每一条数据的the_geom字段存储的都是一个点)。但是执行结果是,无论x,y如何变化,只查询出同一个id。测试代码如下:

SELECT id::integer FROM beijingroad_vertices_pgr ORDER BY the_geom <-> ST_GeometryFromText('POINT(3.8873795927116 36.614514386508)',900913) LIMIT 1;

这里的LIMIT 1是取第一条数据,去掉LIMIT 1,得到的顺序也是一样的。数据出现问题的可能性不大。求大家指点我的问题,先谢谢了:

1.语句中的<->是什么意思?
2.geometry数据可以使用order by进行排序吗?排序结果可以表示距离远近吗?
...全文
581 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

955

社区成员

发帖
与我相关
我的任务
社区描述
PostgreSQL相关内容讨论
sql数据库数据库架构 技术论坛(原bbs)
社区管理员
  • PostgreSQL社区
  • yang_z_1
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧