SQL:如何在PostGIS表的line shapefile中获取给定坐标的源/目标?

时间:2016-11-01 15:38:03

标签: sql postgresql postgis pgrouting

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

enter image description here

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

例如,在上表中,假设259463.392, 2737830.062line 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

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

我得到了如下的顶点表:

enter image description here

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

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

enter image description here

我仍在寻找能否通过上述2个表格获得我的需求。

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

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

enter image description here

后来我从表中发现,在第一张图中,坐标分别是id / 170/51的源/目标= 54,但它仍然效率低下。

我想知道有没有办法找到相同的源/目标号码,在这种情况下line id=51line 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);

enter image description here

2 个答案:

答案 0 :(得分: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是搜索半径。

答案 1 :(得分:1)

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

如果然后运行pgr_analyzeGraph()方法,它将使用每个顶点的统计信息填充my_table_vertices_pgr表中的空列。其中一个统计信息是cnt列,它显示了任何相邻边共享特定顶点的次数。

enter image description here

编辑:

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

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

SELECT ST_AsText(geom) FROM public.tc_line15_split;

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

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