0

我在 PostGIS 中加载了一个 line shapefile 并pgr_createTopology在 pgRouting 中使用,通过添加源和目标来使表可路由(分配线源编号和目标编号的 2 个端节点)。下图是表格的一部分:

在此处输入图像描述

现在我有一些末端节点的坐标,它们属于表中的行,我想知道这些坐标对应的源/目标数量。

例如,在上表中,假设259463.392, 2737830.062是 和 的端节点之一line id=1line id=2那么这个坐标有source/target=175

我是 SQL 新手,尝试了一些查询,但出现错误:

SELECT ST_AsText(geom) from source;
   FROM public.tc_line15_split;

错误:

ERROR:  syntax error at or near "FROM"
LINE 2:        FROM public.tc_line15_split;
               ^
********** Error **********

ERROR: syntax error at or near "FROM"
SQL state: 42601
Character: 45

更新#1

我想如果列源/目标包含节点坐标的信息,我可以知道我想要什么,但似乎不是,它们只是包含数字的列。

我得到的顶点表如下:

在此处输入图像描述

我使用以下查询来获取下表:

select source, target, st_astext(geom) as geom from public.tc_line15_split;

在此处输入图像描述

我仍在寻找是否可以通过上面的两张表来满足我的需求。

所以我尝试了下面的查询并在给定坐标附近得到了两条线:

select id from tc_line15_split 
where st_dwithin(geom, st_setsrid(st_makepoint(259463.392, 2737830.062), 3826), 0.1);

在此处输入图像描述

后来我从第一张图中显示的表格中发现坐标分别是id 170/51的source/target=54,但仍然效率低下。

我想知道在我发现给定坐标位于这两行之间之后,有没有办法找到相同的源/目标编号,在这种情况下line id=51,它们都包含?line id=170


更新#2

根据顶点表,我使用以下查询来获取给定坐标的对应源编号,也就是点 id:

select id from tc_line15_split_vertices_pgr 
where st_dwithin(the_geom, st_setsrid(st_makepoint(259463.392, 2737830.062), 3826), 0.1);

在此处输入图像描述

4

2 回答 2

1

列出表格:

select source, target, st_astext(geom) as geom from public.tc_line15_split;

您还应该有一个顶点表,其中包含 id 和 geom 等列,如果您想找到离某个位置最近的节点,您可以使用以下内容:

select id from vertices where st_dwithin(geom, st_setsrid(st_makepoint(x,y), 3826), tol);

其中 x,y 是您的坐标,tol 是搜索半径。

于 2016-11-02T13:55:09.317 回答
1

如果您要实现的是计算出有多少网络边共享一个公共节点,那么实现此目的最简单的方法是使用 生成的顶点表pgr_createTopology()。根据文档,它会生成一个名称与边缘表相同但_vertices_pgr附加的表。

如果您随后运行该pgr_analyzeGraph()方法,它将my_table_vertices_pgr使用每个顶点的统计信息填充表内的空列。这些统计数据之一是cnt列,它显示特定顶点被任何相邻边共享的次数。

在此处输入图像描述

编辑:

关于您问题的其他一些方面:

由于语法原因,您问题中的第一个查询返回错误,这应该有效:

SELECT ST_AsText(geom) FROM public.tc_line15_split;

15关于更新 #1 -> 节点坐标未显式存储在顶点表中,但您可以使用以下查询检索它们以获取特定节点 ID(例如):

SELECT ST_AsText(ST_Centroid(the_geom))
    FROM tc_line15_split_vertices_pgr
    WHERE id = 15

或者,如果您只是想要 X 和 Y:

SELECT ST_X(the_geom), ST_Y(the_geom)
    FROM tc_line15_split_vertices_pgr
    WHERE id = 15
于 2016-11-02T20:59:53.890 回答