Как применить PostGIS ST_Within ко всем строкам в столбце - PullRequest
0 голосов
/ 02 октября 2019

Я пытаюсь использовать PostGIS, чтобы определить, в каком политическом районе (полигоне) имелось каждое географическое местоположение. В одной таблице у меня загружен шейп-файл в таблицу с именем 113th_congress_shp, а в другой - список событий. это произошло в форме POINT (long lat) в таблице с именем gdelt_full_geo. Моя цель - иметь возможность применить ST_Within к каждому событию в определенном столбце и вернуть ему политический район, к которому он относится.

Я пришел из более 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);

Я получаю следующую ошибку:

«ОШИБКА: более одной строки, возвращенной подзапросом, используемым в качестве выражения состояния SQL: 21000»

Когда я делаю следующее, я получаю каждый глобальный идентификатор из таблицы gdelt_full_geo, где находится длинный латмногоугольник из таблицы 113th_congress_shp. Тем не менее, я не могу присоединиться к конкретному statefp и namelsad, в который попадает точка из таблицы 113th_congress_shp в globaleventid из таблицы gdelt_full_geo, так что я знаю, к какому полигону относится четная точка.

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)
        ) 
        ;

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Ваш запрос требует скалярного подзапроса, но ваш подзапрос приводит к более чем одной строке. Вам нужно какой-то 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)
        )
        ;
0 голосов
/ 04 октября 2019

После предложения @wildplasser я смог начать копать в правильном направлении и добиться того, что хотел, так что все геоэвентиды были присоединены к соответствующим округам Конгресса, выполнив:

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)
...