如何将 PostGIS ST_Within 应用于列中的所有行

How to apply PostGIS ST_Within to all rows in a column

我正在尝试使用 PostGIS 来确定每个地理位置发生在哪个政治区(多边形)。在一个 table 中,我将 shapefile 加载到一个名为 table 的 table 中25=],在另一个中,我有一个事件列表,这些事件以 POINT(long lat) 的形式在一个名为 gdelt_full_geo 的 table 中给出。我的目标是能够将 ST_Within 应用于特定列中的每个事件,并使其 return 它适用的政治选区。

我来自更多的 R 背景,所以我习惯于能够对整个列进行向量运算。所以,我想知道如何在 PostgreSQL 中做到这一点。使用以下代码我可以获得一行:

SELECT statefp, cd113fp, geoid, namelsad
FROM public."113th_congress_shp"
WHERE ST_Within(ST_SetSRID((SELECT action_coord FROM public.gdelt_full_geo LIMIT 1), 4269)::geometry, geom);

然而,当我这样做时:

SELECT statefp, cd113fp, geoid, namelsad
FROM public."113th_congress_shp"
WHERE ST_Within(ST_SetSRID((SELECT action_coord FROM public.gdelt_full_geo), 4269)::geometry, geom);

我收到以下错误:

"ERROR: more than one row returned by a subquery used as an expression SQL state: 21000"

当我执行以下操作时,我从 gdelt_full_geo table 获取每个 globaleventid,其中纬度落在 113th_congress_shp table 的多边形内。但是,我无法将点从 113th_congress_shp table 落入的特定 statefp 和 namelsad 加入到 gdelt_full_geo table 的 globeventid 中,以便我知道是什么多边形eventid属于。

SELECT a.globaleventid
FROM public.gdelt_test a
WHERE EXISTS (
        SELECT x.statefp, x.namelsad
        FROM public."113th_congress_shp" x
        WHERE ST_Within((
                ST_SetSRID(a.action_coord , 4269))::geometry
                , x.geom)
        ) 
        ;

您的查询需要 标量 子查询,但您的子查询结果不止一行。 您需要 某种 的 JOIN 来关联两个表,例如:


SELECT a.statefp, a.cd113fp, a.geoid, a.namelsad
FROM public."113th_congress_shp" a
WHERE EXISTS(
        SELECT 1
        FROM public.gdelt_full_geo x
        WHERE ST_Within(
                ST_SetSRID(x.action_coord , 4269)::geometry
                , a.geom)
        )
        ;

在@wildplasser 的建议之后,我能够开始朝着正确的方向挖掘并且能够实现我想要的,这样所有的 geoeventid 都通过以下方式加入了各自的国会选区:

SELECT a.globaleventid, x.statefp, x.namelsad
FROM public.gdelt_full_113 a
JOIN public."113th_congress_shp" x
ON ST_Within(ST_SetSRID(a.action_coord , 4269)::geometry, geom)