Postgresql POSTGIS-查找给定点(lon、lat)是否在表的地理列(多边形表示)内
问:我从PostGIS中提供的几何图形的函数内的ST_获取错误。不确定在什么仪式上实现ST_的第一个参数 注:变量经度和纬度为函数提供的字符类型。但是,我无法在内部构造传递给ST_的值 从自定义函数中提取代码:Postgresql POSTGIS-查找给定点(lon、lat)是否在表的地理列(多边形表示)内,postgresql,gis,postgis,Postgresql,Gis,Postgis,问:我从PostGIS中提供的几何图形的函数内的ST_获取错误。不确定在什么仪式上实现ST_的第一个参数 注:变量经度和纬度为函数提供的字符类型。但是,我无法在内部构造传递给ST_的值 从自定义函数中提取代码: pointText := 'POINT(longitude || || latitude )'; result := (select p_code from public.parking_lot b where ST_Within (S
pointText := 'POINT(longitude || || latitude )';
result := (select p_code
from public.parking_lot
b where ST_Within (ST_GeomFromText(pointText)::geometry::geography,wkb_geography) limit 1);
编辑:2019年11月14日
根据@jim jones的建议,我重新创建了我的函数,如下所示:
CREATE OR REPLACE FUNCTION public.returnParkingLot(
longitude character,
latitude character)
RETURNS character AS
$BODY$
declare result text;
declare pointText text;
BEGIN
IF longitude = '0' THEN
return '';
ELSE
pointText := 'POINT(' || longitude || ' ' || latitude || ')';
result := (select p_code from public.parking_lot b where ST_Within (ST_GeomFromText(pointText),b.wkb_geography::GEOMETRY) limit 1);
return result;
END IF;
END;$BODY$
LANGUAGE plpgsql VOLATILE STRICT
COST 100;
ALTER FUNCTION public.returnParkingLot(character, character)
OWNER TO mother;
select public.returnParkingLot('103.84472222','1.28333333');
访问:
我使用select语句使用上述函数,如下所示:
CREATE OR REPLACE FUNCTION public.returnParkingLot(
longitude character,
latitude character)
RETURNS character AS
$BODY$
declare result text;
declare pointText text;
BEGIN
IF longitude = '0' THEN
return '';
ELSE
pointText := 'POINT(' || longitude || ' ' || latitude || ')';
result := (select p_code from public.parking_lot b where ST_Within (ST_GeomFromText(pointText),b.wkb_geography::GEOMETRY) limit 1);
return result;
END IF;
END;$BODY$
LANGUAGE plpgsql VOLATILE STRICT
COST 100;
ALTER FUNCTION public.returnParkingLot(character, character)
OWNER TO mother;
select public.returnParkingLot('103.84472222','1.28333333');
注:希望了解此实现是否正确
编辑:11月21日
根据@jim jones的要求,更改下面用户输入的数据类型
CREATE OR REPLACE FUNCTION public.returnParkingLot(
longitude double precision,
latitude double precision)
RETURNS character AS
$BODY$
declare result text;
declare pointText text;
BEGIN
IF longitude = '0' THEN
return '';
ELSE
pointText := 'POINT(' || longitude || ' ' || latitude || ')';
result := (select p_code from public.parking_lot b where ST_Within (ST_GeomFromText(pointText),b.wkb_geography::GEOMETRY) limit 1);
return result;
END IF;
END;$BODY$
LANGUAGE plpgsql VOLATILE STRICT
COST 100;
ALTER FUNCTION public.returnParkingLot(double precision, double precision)
OWNER TO mother;
Select语句:
select public.returnParkingLot(103.84472222, 1.28333333);
考虑到a)pointText
包含有效的数值参数,b)wkb_geography
确实属于geography类型,我们可以假设问题在于参数数据类型。根据文档要求,几何图形应为。你可能想试试这个:
SELECT p_code
FROM public.parking_lot b
WHERE ST_Within(ST_GeomFromText('POINT(2 2)'),b.wkb_geography::GEOMETRY);
您的函数应该如下所示:
CREATE OR REPLACE FUNCTION public.returnParkingLot(
longitude NUMERIC,
latitude NUMERIC) RETURNS character AS
$BODY$
DECLARE result text;
DECLARE pointText text;
BEGIN
IF longitude = '0' THEN
RETURN '';
ELSE
pointText := 'POINT(' || longitude || ' ' || latitude || ')';
result := (SELECT p_code FROM public.parking_lot b
WHERE ST_Within(ST_GeomFromText(pointText),b.wkb_geography::GEOMETRY) LIMIT 1);
RETURN result;
END IF;
END;
$BODY$ LANGUAGE plpgsql VOLATILE STRICT COST 100;
测试:
旁注:
你真的需要这么高的精确度来定位停车场吗?小数点后八位几乎就是显微镜领域 谢谢你的解决方案。我已经编辑了qn,包括我对lon,lat如何提供给功能的修改。请告知这是否是正确的实施方式。谢谢,我觉得还可以。我只是不太确定参数的数据类型。您将它们声明为字符,它们应该是数字。为了避免异常,我建议更改这些数据类型:我已尝试将输入数据类型替换为双精度,但对于给定的输入仍然没有返回结果。但数据存在于给定的表列中。除了ST_in外,在返回给定点位于地理列中的数据行时,还有哪个函数有用?ST_in应该实际完成这项工作。你能展示一下你的函数现在是什么样子吗?我已经在上面11月21日添加了编辑。请检查一下。谢谢很多。