PostGISでMultiLinestringをLinestringに変換しますか?


16

複数行の文字列があり、それをラインストリングに変換して、ラインストリングでのみ機能するいくつかの関数を使用したい。ST_Dump()ジオメトリのコレクションを使用して取得しました。それらをマージして戻すと、まだ複数線ストリングが得られます。単純なラインストリングで終わるために、Npointsを取得し、それらを一緒に結合するか、何かにする必要がありますか?ST_LineMerge()私の複数線ストリングでも機能せず、同じ結果を返します。

私の例、

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

回答:


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

変換したいすべてのMultiLinesを変換できると確信していますか?

単純なジオメトリは、自己交差や自己接触などの異常な幾何学的点を持たず、主に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))')));

更新

これは、指定した複数線ストリングです。ここから有効に見えます。

ここに画像の説明を入力してください

ただし、検査のためにズームインすると、これ有効な線ストリングに変換できないことがはっきりとわかります。

ここに画像の説明を入力してください ここに画像の説明を入力してください

有効:

ここに画像の説明を入力してください ここに画像の説明を入力してください

無効:

ここに画像の説明を入力してください ここに画像の説明を入力してください

しかし、あなたのポイントの有効なサブセットを取ると、それはうまく機能します:

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))')));

これは実際には正しくありません。自己交差のあるラインストリングは、依然としてOGC有効です。元のMultiLineStringを単一のLineStringに変換できない理由は、接続された頂点の3つの互いに素なセットが含まれているためです。
dr_jts

@dr_jts正しいです。だから、LineStringが無効であることではなく、入力が無効です。交差する線を変換することはできません。したがって、ラインストリングの有効な入力は、交差のない入力です。
CaptDragon

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.