1

我已经为此努力了几个小时,但由于我对 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。

4

1 回答 1

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 会很高兴。

于 2013-05-01T15:17:33.483 回答