Получение геометрии из нескольких таблиц с использованием PostGIS?

13

Я очень новичок в PostGIS, PostgreSQL и SQL в целом.

У меня есть 44 таблицы в моей базе данных PostGIS, и каждая из них представляет отдельный слой векторных данных. Каждый был загружен из отдельного шейп-файла, и у каждого есть столбец, который описывает геометрию для этого слоя, называемыйwkb_geometry

Я хочу выбрать конкретный многоугольник на одном слое, а затем извлечь ВСЕ геометрию из поднабора слоев, которые перекрывают ограничивающий прямоугольник этого многоугольника. Я не чувствую придирчивости к выходу заказа, но было бы полезно, если бы он был организован по таблицам, из которых пришла каждая группа геометрии.

Вот пример моего оператора SQL:

SELECT
    ST_AsEWKT(wkb_geometry) /* Some of this data has z values, hence the EWKT */
FROM
    table2, table3, table4, table5
WHERE 
    wkb_geometry &&
        (
        SELECT
            wkb_geometry
        FROM
            table1
        WHERE
            ogc_fid = 25
        );

который возвращает ошибку:

column reference "wkb_geometry" is ambiguous
/* note that every table that I am selecting from has a "wkb_geometry" column */

Как правильно это сделать?

BenjaminGolder
источник
1
Вы можете найти наш учебник по SQL полезным. Мы разработали его, чтобы отвечать на вопросы новичков в SQL, в первую очередь, хотя он также охватывает некоторые сложные конструкции SQL. postgis.us/chapter_appendix_c Глава 1 также может быть полезна, поскольку это пространственный учебник по PostGIS.
LR1234567
+1. Это бесплатные главы. Купите всю книгу, Бенджамин, это стоит инвестиций. если вы хотите узнать о PostGIS и многое другое.
Никлас Авен

Ответы:

8

Прежде всего, вы получаете это сообщение об ошибке, потому что вы не указали, из какой таблицы вы хотите выбрать столбец геометрии (и так как все они имеют одинаковое имя, postgres запутывается). Вот почему вы получаете сообщение об ошибке

ссылка на столбец "wkb_geometry" неоднозначна

Если у вас одинаковое имя столбца в нескольких таблицах, всегда добавляйте имя таблицы перед именем столбца: например. table1.wkb_geometry

По вашему запросу: Если я вас правильно понял, вы хотите найти объекты в разных слоях, которые пересекают определенный объект в одном конкретном слое.

Начните смотреть на две таблицы одновременно, чтобы упростить процесс:

Table1 - таблица с конкретным объектом, table2 - таблица с другими объектами.

SELECT
ST_AsEWKT(table2.wkb_geometry)
FROM
table1, table2
WHERE
(table2.wkb_geometry && table1.wkb_geometry)
AND
table1.ogc_fid = 25

Теперь, если вы хотите добавить дополнительные объекты из других таблиц, вам нужен UNION ALL, как уже упоминал Sasa. Имена столбцов не обязательно должны быть одинаковыми, но количество столбцов и типы данных!

SELECT
ST_AsEWKT(table2.wkb_geometry)
FROM
table1, table2
WHERE
(table2.wkb_geometry && table1.wkb_geometry)
AND
table1.ogc_fid = 25

UNION ALL

SELECT
ST_AsEWKT(table3.wkb_geometry)
FROM
table1, table3
WHERE
(table3.wkb_geometry && table1.wkb_geometry)
AND
table1.ogc_fid = 25

UNION ALL

etc...

Вы можете столкнуться с проблемами при открытии запроса во вьюере, так как нет уникального идентификатора. Простой способ решить эту проблему - сохранить результат в виде таблицы со столбцом id.

веселиться

Томас
источник
6

У меня нет клиента SQL передо мной, так что это может быть не на 100% точно, но вам нужно что-то вроде:

SELECT ST_AsEWKT(wkb_geometry) FROM table2 WHERE ...
UNION ALL
SELECT ST_AsEWKT(wkb_geometry) FROM table3 WHERE ...

и так далее. Ваша проблема в том, что SQL-запрос не знает, на какую таблицу (table2 / 3/4/5) вы ссылаетесь, когда задаете SELECT ST_AsEWKT (wkb_geometry), таким образом, неоднозначная ссылка. Вы также можете добавить ORDER BY к результатам, если хотите, чтобы они были упорядочены.

Саша Иветик
источник