使用PostGIS将MultiLinestring转换为Linestring?


16

我有一个多行字符串,并且想要将其转换为行字符串,以便使用某些仅适用于行字符串的功能。我使用ST_Dump()并收集了我的几何形状。如果将它们合并在一起,我仍然会得到多线串。我应该得到Npoints并将它们组合在一起,还是以某种简单的线串结尾?ST_LineMerge()在我的multilinestring上也不起作用,它返回相同的结果。

我的例子

MULTILINESTRING(( - 3.16420835153456 55.9269166007097,-3.164222 55.926918),( - 3.1642070167833 55.9269296196706,-3.16421351659546 55.9268662214904),( - 3.16421351659546 55.9268662214904,-3.16421636372824 55.9268384509897),( - 3.16421636372824 55.9268384509897,-3.16422182573761 55.9267851753802),( - 3.16422182573761 55.9267851753802,-3.16422870102352 55.926718114886 ),( - 3.16422870102352 55.926718114886,-3.16423309121073 55.926675293667),( - 3.16423309121073 55.926675293667,-3.16423565148822 55.9266503211093),( - 3.16423565148822 55.9266503211093,-3.16424103159897 55.9265978443265),( - 3.16424103159897 55.9265978443265,-3.16424680776317 55.9265415044985),( - 3.16424680776317 55.9265415044985,-3.16425267254583 55.9264843002995 ),(-3.16425267254583 55.9264843002995,-3.16425541048045 55.9264575949012),(-3.16425541048045 55.9264575949012,-3.16426111146586 55.9264019883556),(-3.16426111146586 55.9264019883556,-3.1642667032531 55.9263474469124),( - 3.1642667032531 55.9263474469124,-3.16426957768543 55.9263194101362),( - 3.16426957768543 55.9263194101362,-3.16427488261739 55.9262676666359),( - 3.16427488261739 55.9262676666359,-3.16428009893088 55.9262167875066),( - 3.16428009893088 55.9262167875066,-3.164282741107 55.9261910161221), (-3.1642875546472 55.9261440655823,-3.164282741107 55.9261910161221),( - 3.1642875546472 55.9261440655823,-3.16429466890915 55.9260746741522),( - 3.16429466890915 55.9260746741522,-3.16430092974527 55.9260136069079),( - 3.16430092974527 55.9260136069079,-3.16430822838418 55.9259424170929),( - 3.16430822838418 55.9259424170929,-3.16431547242401 55.925871759829), (-3.16431547242401 55.925871759829,-3.16431448732505 55.9258328901507),(-3.16431770120536 55.9257327846001,-3.16431547242401 55.925871759829),(-3。164339 55.925777,-3.16431770120536 55.9257327846001))


给我们一个您要转换的多线串示例,以便我们对其进行测试。
CaptDragon 2012年

Answers:


6

您也可以使用ST_SnapToGrid修复数据,但是您需要使用参数来正确处理数据。

SELECT ST_AsText(
    ST_LineMerge(
        ST_SnapToGrid(
            ST_GeomFromText('MULTILINESTRING((-3.16420835153456 55.9269166007097,-3.164222 55.926918),(-3.1642070167833 55.9269296196706,-3.16421351659546 55.9268662214904),(-3.16421351659546 55.9268662214904,-3.16421636372824 55.9268384509897),(-3.16421636372824 55.9268384509897,-3.16422182573761 55.9267851753802),(-3.16422182573761 55.9267851753802,-3.16422870102352 55.926718114886),(-3.16422870102352 55.926718114886,-3.16423309121073 55.926675293667),(-3.16423309121073 55.926675293667,-3.16423565148822 55.9266503211093),(-3.16423565148822 55.9266503211093,-3.16424103159897 55.9265978443265),(-3.16424103159897 55.9265978443265,-3.16424680776317 55.9265415044985),(-3.16424680776317 55.9265415044985,-3.16425267254583 55.9264843002995),(-3.16425267254583 55.9264843002995,-3.16425541048045 55.9264575949012),(-3.16425541048045 55.9264575949012,-3.16426111146586 55.9264019883556),(-3.16426111146586 55.9264019883556,-3.1642667032531 55.9263474469124),(-3.1642667032531 55.9263474469124,-3.16426957768543 55.9263194101362),(-3.16426957768543 55.9263194101362,-3.16427488261739 55.9262676666359),(-3.16427488261739 55.9262676666359,-3.16428009893088 55.9262167875066),(-3.16428009893088 55.9262167875066,-3.164282741107 55.9261910161221),(-3.1642875546472 55.9261440655823,-3.164282741107 55.9261910161221),(-3.1642875546472 55.9261440655823,-3.16429466890915 55.9260746741522),(-3.16429466890915 55.9260746741522,-3.16430092974527 55.9260136069079),(-3.16430092974527 55.9260136069079,-3.16430822838418 55.9259424170929),(-3.16430822838418 55.9259424170929,-3.16431547242401 55.925871759829),(-3.16431547242401 55.925871759829,-3.16431448732505 55.9258328901507),(-3.16431770120536 55.9257327846001,-3.16431547242401 55.925871759829),(-3.164339 55.925777,-3.16431770120536 55.9257327846001))'),
            0.001)
        )
    );

25

您确定要转换的所有MultiLine 都可以转换吗?

简单几何是没有异常几何点(例如自相交或相切)的几何,主要指的是0或1维几何

否则,ST_LineMerge应工作:

SELECT ST_AsText(ST_LineMerge(ST_GeomFromText('MULTILINESTRING((-29 -27,-30 -29.7,-36 -31,-45 -33),(-45 -33,-46 -32))')));

更新

这就是您提供的Multilinestring。从这里看起来有效。:

在此处输入图片说明

但是放大放大以进行检查时,您可以清楚地看到它不能转换为有效的线串。

在此处输入图片说明 在此处输入图片说明

有效:

在此处输入图片说明 在此处输入图片说明

无效:

在此处输入图片说明 在此处输入图片说明

但是取一个有效的点子集,就可以了:

SELECT ST_AsText(ST_LineMerge(ST_GeomFromText('MULTILINESTRING((-3.16422182573761 55.9267851753802,-3.16422870102352 55.926718114886),(-3.16422870102352 55.926718114886,-3.16423309121073 55.926675293667),(-3.16423309121073 55.926675293667,-3.16423565148822 55.9266503211093),(-3.16423565148822 55.9266503211093,-3.16424103159897 55.9265978443265),(-3.16424103159897 55.9265978443265,-3.16424680776317 55.9265415044985),(-3.16424680776317 55.9265415044985,-3.16425267254583 55.9264843002995),(-3.16425267254583 55.9264843002995,-3.16425541048045 55.9264575949012),(-3.16425541048045 55.9264575949012,-3.16426111146586 55.9264019883556),(-3.16426111146586 55.9264019883556,-3.1642667032531 55.9263474469124),(-3.1642667032531 55.9263474469124,-3.16426957768543 55.9263194101362),(-3.16426957768543 55.9263194101362,-3.16427488261739 55.9262676666359),(-3.16427488261739 55.9262676666359,-3.16428009893088 55.9262167875066))')));

这实际上是不正确的。具有自相交的LineString仍然是OGC有效的。原始MultiLineString不能转换为单个LineString的原因是它包含3个不相交的连接顶点集。
dr_jts

@dr_jts对,所以不是LineString无效,而是输入无效。您不能转换相交线。因此,线串的有效输入是没有交集的输入。
CaptDragon

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.