0

次の形式の文字列を含む列を持つ PostgreSQL テーブルがあります。

    '3.985 58.934, 4.56 61.2323, 5.4 63.234355, 3.25982 59.309' 
    '3.985 58.934, 4.56 61.2323, 5.4 63.234355, 3.25982 59.309, 4.5632 58.32423'
    'and so on...'

ご覧のとおり、列には1行の文字列としてさまざまな長さの座標が含まれています。PostGIS 関数を使用したい:

    ST_GeomFromText('LINESTRING(3.985 58.934, 4.56 61.2323, 5.4 63.234355, 3.25982 
    59.309)', 4326)  

次の質問が表示されます。

PostGIS 関数は、上に示されているように、正しい形式の倍精度値を必要とします。文字列の長さと各座標の文字数がわからない場合、文字列から倍精度値を生成するにはどうすればよいですか?

事前にご協力いただきありがとうございます。

ヤン

4

1 に答える 1

1

ドキュメントによると、requireではなく、ST_GeomFromTextrequiresです。(text, integer)(double precision)

あなたがする必要があるのはCONCAT()、それがうまくいくはずです。

解決

ST_GeomFromText(CONCAT('LINESTRING(', "YourTable"."YourString", ')'), 4326);

あなたのテストのために

SELECT
    ST_GeomFromText('LINESTRING(3.985 58.934, 4.56 61.2323, 5.4 63.234355, 3.25982 59.309)', 4326),
    CONCAT('LINESTRING(', "T1"."C1", ')'),
    ST_GeomFromText(CONCAT('LINESTRING(', "T1"."C1", ')'), 4326)
FROM
    (
        SELECT '3.985 58.934, 4.56 61.2323, 5.4 63.234355, 3.25982 59.309, 4.5632 58.32423' AS "C1"
    ) AS "T1";

楽しみのためだけに

あなたの文字列を最初に要求されたものに変換してから、文字列にDOUBLE PRECISION戻すことにしました...最終結果は上記と同じですが、より多くの作業が必要です。それにもかかわらず、それはあなたが求めたものです。

SELECT
    ST_GeomFromText(CONCAT('LINESTRING(', (SELECT STRING_AGG(ARRAY_TO_STRING("Line"."Points", ' '), ',') FROM REGEXP_MATCHES(ARRAY_TO_STRING(REGEXP_SPLIT_TO_ARRAY("T1"."C1", E', | ')::DOUBLE PRECISION[], ' '), '(\d*\.\d*) (\d*\.\d*)', 'g') AS "Line"("Points")), ')'), 4326)
FROM
    (
        SELECT '3.985 58.934, 4.56 61.2323, 5.4 63.234355, 3.25982 59.309, 4.5632 58.32423'::TEXT AS "C1"
    ) AS "T1";
于 2013-10-07T15:12:15.810 に答える