SELECT pgr_node网络查询失败

Ahs*_*tar 5 postgresql postgis pgrouting

我正在 Windows 上工作,并在数据库上启用了扩展 postgis、pgrouting。我安装了 postgreSQL 9.4,并且正在使用来自无界研讨会( http://workshops.boundlessgeo.com/tutorial-routing/ )的数据。

SELECT pgr_nodeNetwork('edges',0.001,'geom','gid','noded')
Run Code Online (Sandbox Code Playgroud)

当我运行此查询时,它运行大约 1 分钟,之后会生成FAIL. 我该如何解决这个问题?我的 pgr_createTopology 查询已成功运行。

NOTICE:  PROCESSING:
NOTICE:  pgr_nodeNetwork('edges',0.001,'geom','gid','noded')
NOTICE:  Performing checks, pelase wait .....
NOTICE:  Processing, pelase wait .....
ERROR:  line_locate_point: 1st arg isnt a line
CONTEXT:  SQL statement "create temp table inter_loc on commit drop as ( select * from (
        (select l1id, l2id, st_linelocatepoint(line,source) as locus from intergeom)
         union
        (select l1id, l2id, st_linelocatepoint(line,target) as locus from intergeom)) as foo
        where locus<>0 and locus<>1)"
PL/pgSQL function pgr_nodenetwork(text,double precision,text,text,text) line 184 at EXECUTE statement
********** Error **********

ERROR: line_locate_point: 1st arg isnt a line
SQL state: XX000
Context: SQL statement "create temp table inter_loc on commit drop as ( select * from (
        (select l1id, l2id, st_linelocatepoint(line,source) as locus from intergeom)
         union
        (select l1id, l2id, st_linelocatepoint(line,target) as locus from intergeom)) as foo
        where locus<>0 and locus<>1)"
PL/pgSQL function pgr_nodenetwork(text,double precision,text,text,text) line 184 at EXECUTE statement
Run Code Online (Sandbox Code Playgroud)

all*_*ejo 1

我在我的项目中遇到了这个问题,我花了几个小时试图找出导致它的原因以及如何解决它。我将描述我的情况以及我如何解决它,希望它能在将来帮助其他人。

我正在使用ogr2ogr将 Shapefile 导入到我的数据库中,并且-nlt PROMOTE_TO_MULTI在导入过程中我使用了作为我的参数之一;这导致我的几何图形被导入为 MultiLineStrings。

从我观察到的行为以及其他人(以及更多人)提到的情况来看,该函数不能很好地与 MutliLineStrings 配合使用。pgr_nodeNetwork()

由于 MultiLineStrings 不适用于路由,因此我从 dkastl 的答案中获取了 SQL并在我的数据上运行它,以查看我是否确实需要MultiLineStrings 或者我是否可以使用 LineStrings。

SELECT
    COUNT(
        CASE WHEN ST_NumGeometries(geom) > 1 THEN 1 END
    ) AS multi,
    COUNT(geom) AS total
FROM network_nodes;
Run Code Online (Sandbox Code Playgroud)

运行之后,我发现我对 MultiLineStrings 的需求为零,因此我使用 ogr2ogr 重新导入了我的 Shapefile -nlt LINESTRING,然后就可以pgr_nodeNetwork()毫无问题地运行了。