Я пытаюсь использовать 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)
)
;