postgresql 如何查询Postgis数据库,从一个表中提取所有用户坐标,从另一个多边形中提取

ndh0cuux  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(1)|浏览(367)

我有一个Postgis数据库,在geom::geometry列中包含多边形。我有一个“点”型坐标列表。我想提取所有user_coordinates行,它们的坐标在特定的多边形中找到。
我在stackoverflow上搜索了好几天。我试过各种各样的查询(ST_Contains,ST_Within),大多数都告诉我一个函数存在,不存在。我认为它被我给出的点所抛弃,并且想知道点列应该采用什么格式或类型。
这里有一个查询,我试图给予你一个想法,我在...

select u.user_id 
from electorial_boundries as e 
INNER JOIN user_coordinates as u on
   ST_Contains(e.geom,ST_GeomFromText('SRID=4326;POINT(u.user_coor))) 
where e.org_id = 595

/按要求添加
期待什么:
列出user_coordinates中的所有行,其中user_coordinates.user_coor中的坐标显示在electorial_boundries.geom中的选定面中
下面是表的sql……(对不起,我不熟悉如何最好地使用fiddle)

CREATE TABLE public.user_coordinates
(
    id integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
    user_id integer NOT NULL,
    user_coor point NOT NULL,
    CONSTRAINT user_coordinates_pkey PRIMARY KEY (id)
)

CREATE TABLE public.electorial_boundries
(
    id integer NOT NULL DEFAULT nextval('electorial_boundries_id_seq'::regclass),
    data_id bigint,
    geom geometry(MultiPolygon,4326),
    district_name character(120) COLLATE pg_catalog."default",
    CONSTRAINT electorial_boundries_pkey PRIMARY KEY (id)
)

错误是我得到“函数(ST_Contains或ST_Within)不存在”。但似乎它只是与我试图给予的点相冲突,因为实际坐标代替u.user_coor会产生一些结果,尽管不限于多边形中的用户。

yjghlzjz

yjghlzjz1#

user_coor的类型为point,这是一个本地postgres类型,不能直接用于PostGIS函数。
错误消息可能会告诉您function ST_Contains(geometry, point) does not exist,这突出显示了错误的“点”类型,因为该函数仅适用于两个几何图形。
如果可以的话,应该将列定义更改为geometry(point,4326)类型。
但是,您可以将point强制转换为geometry

select u.user_id 
from electorial_boundries as e 
INNER JOIN user_coordinates as u on
   ST_Contains(e.geom, u.user_coor::geometry) 
where e.org_id = 595

相关问题