Отримання геометрії з декількох таблиць за допомогою PostGIS?


13

Я дуже новачок у PostGIS, PostgreSQL та SQL взагалі.

У моїй базі PostGIS 44 таблиці, і кожна з них представляє різний рівень векторних даних. Кожен був завантажений з окремого файлу форми, і кожен має стовпець, який описує геометрію цього шару, званий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 */

Який правильний спосіб це зробити?


1
Вам може бути корисний наш праймер SQL. Ми розробили його для відповіді на запитання для початківців SQL, хоча він охоплює також деякі передові SQL конструкції. postgis.us/chapter_appendix_c Глава 1 також може бути корисною, оскільки це просторовий праймер PostGIS.
LR1234567

+1. Це вільні глави. Купуйте всю книгу, Бенджамін, це варті кошти. якщо ви хочете дізнатися про PostGIS та багато іншого.
Nicklas Avén

Відповіді:


8

Перш за все, ви отримуєте це повідомлення про помилку, оскільки ви не вказали, з якої таблиці ви хочете вибрати стовпчик геометрії (а оскільки всі вони мають одне ім’я, постгреси плутаються). Ось чому ви отримуєте повідомлення про помилку

посилання стовпця "wkb_geometry" неоднозначне

Якщо у кількох таблицях є однакове ім’я стовпця, завжди додайте назву таблиці перед ім'ям стовпця: наприклад. table1.wkb_geometry

Для вашого запиту: Якщо я вас правильно зрозумів, ви хочете знайти об'єкти в різних шарах, які перетинають певний об'єкт в одному конкретному шарі.

Спочатку спочатку переглядайте дві таблиці, щоб зробити це просто:

Таблиця1 - таблиця з конкретним об'єктом, table2 - таблиця з іншими об'єктами

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(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), таким чином, неоднозначне посилання. Ви також можете додати ЗАМОВЛЕННЯ ДО результатів, якщо ви хочете, щоб вони були впорядковані

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.