PostGIS: функция выбора точек полигона

Я бился над этим несколько часов, но, поскольку я относительно новичок в PostgreSQL и PostGIS, я не могу найти решение. Я пытаюсь создать хранимую процедуру (функцию), которая будет возвращать все местоположения, указанная геометрия точек которых находится в пределах указанного многоугольника.

Вот моя функция PostgreSQL:

CREATE OR REPLACE FUNCTION public.spGeoPoly(polystring text) RETURNS setof locations
AS $$
BEGIN
RETURN QUERY
SELECT * FROM locations
WHERE ST_Contains(ST_GeomFromText('POLYGON((polystring))', 4326), point_geom);
END;
$$ LANGUAGE plpgsql;

Я протестировал это с жестко закодированной полистрокой, которая работает, но как функция с входной строкой, такой как:

SELECT spGeoPoly('50.4 8.2,50.3 9.3,49.9 9.5,49.7 8.8,49.9 7.8,50.4 8.2');

Я получаю сообщение об ошибке:

ERROR:  parse error - invalid geometry
HINT:  "polygon((" <-- parse error at position 9 within geometry

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

Я использую PostgreSQL 8.4.13 и PostGIS 1.5.8.


person alreit    schedule 28.02.2013    source источник
comment
Угадай... должно ли быть WHERE ST_Contains(ST_GeomFromText('POLYGON(('+polystring+'))', 4326), point_geom); ?   -  person AjV Jsy    schedule 28.02.2013
comment
К сожалению, это не так, я получаю ERROR: operator does not exist: unknown + text   -  person alreit    schedule 01.03.2013
comment
Использует ли PostGres || вместо + для соединения строк? :)   -  person AjV Jsy    schedule 01.03.2013
comment
Ага! Я знал, что это что-то простое :) Спасибо!   -  person alreit    schedule 01.03.2013


Ответы (1)


Как вы уже знаете, это простое решение. Я пишу, чтобы объяснить исправление.

Ваша функция:

CREATE OR REPLACE FUNCTION public.spGeoPoly(polystring text) RETURNS setof locations
AS $$
BEGIN
RETURN QUERY
SELECT * FROM locations
WHERE ST_Contains(ST_GeomFromText('POLYGON((polystring))', 4326), point_geom);
END;
$$ LANGUAGE plpgsql;

Проблемная часть:

ST_GeomFromText('POLYGON((polystring))', 4326)

Это говорит PostgreSQL взять строку Polygon((polystring)) и передать ее первому аргументу функции ST_GeomFromText. Это, конечно, не то, что вы имеете в виду. Вы хотите построить многоугольник, используя значение polystring.

Чтобы исправить это, просто объедините строку:

ST_GeomFromText('POLYGON((' || polystring || '))', 4326)

Тогда PostgreSQL будет доволен.

person Chris Travers    schedule 01.05.2013