postgresql - 如何检查多线串是否真的是多线串?
问题描述
我有一个带有道路网络的庞大数据库,几何类型是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。)
解决方案
如果您只是在寻找一种方法来识别哪些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)
推荐阅读
- tcl - 使用 TCL 替换 URI
- python - python内置函数Iter()重调的Object类是什么样子的?
- excel - 如何编写具有多个条件的此公式的 IF 语句
- excel - 将单元格背景颜色分配给引用单元格中的 rgb 并重复多行或所有行
- azure - 在 Azure 目录中注册应用程序时谁获得权限?
- sql - 使用访问查询更改数据字段类型
- powershell - 使用 powershell 查找和压缩
- reactjs - 渲染平面列表时缺少图像
- django - Django + backgroundtask + AWS Elasticbeanstalk 部署超时
- linux - 运行高内存使用率的进程“oka” - Linux NAS - Asustor AS5202T