我已经尝试了数周来解决这个问题:我需要递归搜索拓扑网络,在这种情况下为 OpenStreetMap 街道,寻找死胡同,以及仅与网络其余部分仅一个边缘的社区。如果您的城市如此体贴,这些地方可能会出现禁止出口标志。
我的表记录了网络中的每条边。每条边都有一个“目标”和“源”字段,用于标识该边连接到的节点。我添加了一个名为“dangling”的二进制列,以指示边缘是否已被识别为终止段。我将此列初始化为 FALSE,假设最好。
到目前为止,我已经能够使用以下 SQL 识别简单的分支死胡同
WITH node_counts AS ( -- get all unique nodes
SELECT target AS node FROM edge_table WHERE NOT dangling
UNION ALL
SELECT source AS node FROM edge_table WHERE NOT dangling),
single_nodes AS ( -- select only those that occur once
SELECT node
FROM node_counts
GROUP BY node
HAVING count(*) = 1
) --
UPDATE edge_table SET dangling = true
FROM single_nodes
WHERE node = target OR node = source;
我只是继续运行此查询,直到没有更新任何行。结果如下所示(红色悬空 = true):
http://i.stack.imgur.com/OE1rZ.png
优秀的!这很好用……但如果你愿意的话,仍然有死胡同,它们只通过一个边缘连接到更大的网络。我怎样才能识别那些?
我最好的猜测是,我会在某个时候需要一个 WITH RECURSIVE,但这大约是我的非数学思维所能达到的程度。谁能指出我正确的方向?