sql >> Databáze >  >> RDS >> PostgreSQL

Získejte hodnoty s dvojitou přesností z nekonzistentních řetězců pro použití ST_GeomFromText (PostGIS)

Podle dokumentů , ST_GeomFromText vyžaduje (text, integer) , nikoli (double precision) .

Vše, co musíte udělat, je CONCAT() a mělo by to fungovat.

Řešení

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

Pro vaše testování

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";

Jen pro zábavu

Rozhodl jsem se převést váš řetězec na původně požadovanou DOUBLE PRECISION a pak zpět do řetězce... konečný výsledek je stejný jako výše, ale dá to mnohem více práce. Přesto je to to, o co jste požádali.

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";



  1. Jak omezit přístup k databázi v PostgreSQL

  2. Proč je Solr o tolik rychlejší než Postgres?

  3. Upgrade z PostGIS 2.1:Chyba:pokus o předefinování parametru postgis.backend

  4. Spouštění Vites a MySQL pomocí ClusterControl