我在PostGIS中加载了一个行shapefile,并在pgRouting中使用pgr_createTopology
通过添加源和目标使该表可路由(分配行源编号和目标编号的2个端节点)。下图是该表的一部分:
现在我有一些坐标的终端节点,它们属于表中的行,我想知道有多少来源/目标对应于这些坐标。
例如,在上表中,假设259463.392, 2737830.062
是line id=1
和line 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;
我仍在寻找能否通过上述2个表格获得我的需求。
所以我尝试了下面的查询并在给定坐标附近得到了2行:
select id from tc_line15_split
where st_dwithin(geom, st_setsrid(st_makepoint(259463.392, 2737830.062), 3826), 0.1);
后来我从表中发现,在第一张图中,坐标分别是id / 170/51的源/目标= 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);
答案 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
列,它显示了任何相邻边共享特定顶点的次数。
关于你问题的其他一些方面:
您问题中的第一个查询因语法而返回错误,这应该有效:
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