我一直在敲打这几个小时,但由于我对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。
答案 0 :(得分: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会很高兴。