首页 > 解决方案 > 如何检查多线串是否真的是多线串?

问题描述

我有一个带有道路网络的庞大数据库,几何类型是MULTILINESTRING。我想过滤掉具有拓扑错误的MULTILINESTRINGS 。左右两边的线都是一对一记录,由两条线组成。现在它们在右侧连接,所以它并没有真正打扰我,我可以稍后合并它们而不会出现拓扑错误。但是在左侧,它们没有连接,但它们仍然是一个记录。 多线串 到目前为止我已经尝试过:

SELECT gid 
FROM myschema.roads 
WHERE (
NOT ST_Equals(ST_Endpoint(ST_GeometryN(the_geom,1 )),ST_Startpoint(ST_GeometryN(the_geom,2 ))) 
    AND NOT ST_Equals(ST_Endpoint(ST_GeometryN(the_geom,2 )),ST_Startpoint(ST_GeometryN(the_geom,1 )))
)

如果我可以说MULTILINESTRINGS最多由两行组成,那么我认为它会起作用。不幸的是,其中一些由 10-20 行组成,我无法确定这些行部分是按升序还是降序排列的。因此,在我看来,扩展我的 SQL 脚本不是一种选择。

(我将 QGIS 与 PostGIS 数据库一起使用,但我也拥有 ArcMap。)

标签: postgresqlpostgisqgistopologymultilinestring

解决方案


如果您只是在寻找一种方法来识别哪些MultiLineStrings包含多个您可以简单地使用的行ST_LineMerge,那么ST_Dump并计算返回的LineStrings. 如果几何包含非连续线,则查询将返回大于 1 的计数,例如

WITH j (geom) AS (
  VALUES ('MULTILINESTRING((10 10, 20 20, 10 40),(40 40, 30 30, 40 20, 30 10))'),
         ('MULTILINESTRING((10 10, 20 20, 10 40),(10 40, 30 30, 40 20, 30 10))'))
SELECT geom,(SELECT count(*) FROM ST_Dump(ST_LineMerge(geom))) 
FROM j;

                                geom                                 | count 
---------------------------------------------------------------------+-------
 MULTILINESTRING((10 10, 20 20, 10 40),(40 40, 30 30, 40 20, 30 10)) |     2
 MULTILINESTRING((10 10, 20 20, 10 40),(10 40, 30 30, 40 20, 30 10)) |     1
(2 Zeilen)

另一种选择是在应用ST_NumGeometries后使用ST_LineMerge,例如

WITH j (geom) AS (
  VALUES ('MULTILINESTRING((10 10, 20 20, 10 40),(40 40, 30 30, 40 20, 30 10))'),
         ('MULTILINESTRING((10 10, 20 20, 10 40),(10 40, 30 30, 40 20, 30 10))'))
SELECT geom,ST_NumGeometries(ST_LineMerge(geom)) AS count
FROM j;
                                geom                                 | count 
---------------------------------------------------------------------+-------
 MULTILINESTRING((10 10, 20 20, 10 40),(40 40, 30 30, 40 20, 30 10)) |     2
 MULTILINESTRING((10 10, 20 20, 10 40),(10 40, 30 30, 40 20, 30 10)) |     1
(2 Zeilen)

推荐阅读