Вставьте объект PostGIS (например, ST_GeomFromText) из переменных строки в сценарии plpgsql - PullRequest
2 голосов
/ 08 декабря 2011

У меня есть две таблицы src_pos и dest_pos.

src_pos хранит позиции с долготой, широтой и высотой, а dest_pos хранит объект PosGIS Geometry.

Теперь я хочу переместить несколькоданные из src_pos в dest_pos с помощью следующего сценария plpgsql.Но это не удалось, потому что переменная строки (например, row_data.longitude) не может быть правильно интерпретирована.Как я могу преодолеть эту проблему !?

--create language 'plpgsql';
drop function createPosition();
create function createPosition() returns integer AS 
$$
  DECLARE 
    updated INTEGER = 0;
    row_data src_pos%ROWTYPE;       
  BEGIN 
    FOR row_data IN SELECT * FROM src_pos
    LOOP
        INSERT INTO dest_pos (coord) VALUES (ST_GeomFromText('POINT(row_data.longitude row_data.latitude row_data.altitude)', 4326));
        updated := updated + 1;
    END LOOP;
    RETURN updated;
  END;
$$
LANGUAGE 'plpgsql';

Ответы [ 2 ]

1 голос
/ 19 марта 2015

Еще лучше, используйте ST_MakePoint , чтобы напрямую создать геометрический объект.Это не только быстрее, чем ST_GeomFromText, но и без потерь, поскольку вам не нужно преобразовывать числа в текст в числа.

...
WITH result AS (
  INSERT INTO dest_pos (coord)
  SELECT ST_SetSRID(ST_MakePoint(longitude, latitude, altitude), 4326)
  FROM src_pos
  RETURNING 1
)
SELECT count(*) INTO updated FROM result;
RETURN updated;
...
1 голос
/ 24 марта 2013

В комментарии вы дали собственное решение:

 ST_GeomFromText('POINT(' || row_data.longitude || ' ' || row_data.latitude || 
     ' ' || row_data.altitude || ')', 4326)

Это очень хорошее решение. Я на самом деле делаю нечто относительно похожее в некоторых случаях в других областях postgresql.

Дело в том, что каждый тип PostgreSQL может быть представлен как текст. Если вы готовы манипулировать ими, вы можете переходить между типами способами, которые не разрешены обычной системой приведения типов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...