2013-02-28 2 views
1

Я уже несколько часов стучаю по этому вопросу, но поскольку я относительно новичок в PostgreSQL и PostGIS, я не могу найти решение. Я пытаюсь создать хранимую процедуру (функцию), которая вернет все местоположения, указанная геометрия точек которых находится в указанном полигоне.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; 

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

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.

+0

Угадай ... это должно быть 'WHERE ST_Contains (ST_GeomFromText ('POLYGON ((' + polystring + '))', 4326), point_geom);'? –

+0

Это не так, к сожалению, я получаю 'ERROR: оператора не существует: неизвестно + текст' – alreit

+2

Использует ли PostGres || вместо + для соединения строк? :) –

ответ

2

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

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

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 будет счастлив.