Получите значения двойной точности из несоответствующих строк для использования ST_GeomFromText (PostGIS)

У меня есть таблица 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...' 

Как вы можете видеть, столбец содержит координаты разной длины в виде строк в одной строке. Я хотел бы использовать функцию PostGIS:

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

Появляются следующие вопросы:

Для функций PostGIS требуются значения двойной точности в правильном формате, как показано выше. Как я могу генерировать значения двойной точности из строк, когда я не знаю, сколько строк будет и сколько символов имеет каждая координата?

Заранее спасибо за помощь!

Янн

Согласно документам , ST_GeomFromText требует (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";