Postgresql POSTGIS-查找给定点(lon、lat)是否在表的地理列(多边形表示)内

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

问:我从PostGIS中提供的几何图形的函数内的ST_获取错误。不确定在什么仪式上实现ST_的第一个参数

注:变量经度和纬度为函数提供的字符类型。但是,我无法在内部构造传递给ST_的值

从自定义函数中提取代码:

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日添加了编辑。请检查一下。谢谢很多。