Obtendo geometria de várias tabelas usando o PostGIS?

13

Eu sou muito novo no PostGIS, PostgreSQL e SQL em geral.

Eu tenho 44 tabelas no meu banco de dados PostGIS e cada uma representa uma camada diferente de dados vetoriais. Cada um foi carregado a partir de um shapefile separado e cada um possui uma coluna que descreve a geometria para essa camada, chamadawkb_geometry

Desejo selecionar um polígono específico em uma camada e recuperar TODA a geometria de um subconjunto de camadas que se sobrepõem à caixa delimitadora desse polígono. Não estou me sentindo exigente quanto ao pedido que será lançado, mas seria útil se ele fosse organizado pelas tabelas de onde cada grupo de geometria veio.

Aqui está um exemplo da minha instrução 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
        );

que retorna um erro:

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

Qual é a maneira certa de fazer isso?

BenjaminGolder
fonte
1
Você pode achar nosso SQL Primer útil. Nós o projetamos para responder a perguntas de iniciantes em SQL principalmente, embora também abranja algumas construções avançadas de SQL. postgis.us/chapter_appendix_c O capítulo 1 também pode ser útil, pois é um iniciador espacial PostGIS.
LR1234567
+1. Esses são os capítulos gratuitos. Compre o livro inteiro, Benjamin, é um investimento que vale a pena. se você quiser aprender sobre o PostGIS e muito mais.
Nicklas Avén

Respostas:

8

Primeiro, você recebe essa mensagem de erro, porque não especificou de qual tabela deseja selecionar a coluna de geometria (e como todas elas têm o mesmo nome, o postgres está ficando confuso). É por isso que você recebe a mensagem de erro

a referência da coluna "wkb_geometry" é ambígua

Se você tiver o mesmo nome de coluna em várias tabelas, adicione sempre o nome da tabela na frente do nome da coluna: por exemplo. table1.wkb_geometry

Para sua consulta: Se eu entendi direito, você deseja encontrar os objetos em diferentes camadas que cruzam um objeto específico em uma camada específica.

Comece a olhar para duas tabelas ao mesmo tempo no início para simplificar:

Tabela1 é a tabela com o objeto específico, tabela2 a tabela com os outros objetos

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

Agora, se você quiser adicionar objetos adicionais de outras tabelas, precisará de UNION ALL, como Sasa já mencionou. Os nomes das colunas não precisam ser os mesmos, mas o número de colunas e tipos de dados!

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

Você pode ter problemas ao abrir a consulta em um visualizador, pois não há um ID exclusivo. Uma maneira simples de resolver isso é salvar o resultado como uma tabela com uma coluna de identificação.

diverta-se

Thomas
fonte
6

Eu não tenho um cliente SQL na minha frente, portanto, isso pode não ser 100% exato, mas você precisará de algo como:

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

e assim por diante. Seu problema é que a consulta sql não sabe a qual tabela (tabela 2/3/4/5) você se refere quando especifica SELECT ST_AsEWKT (wkb_geometry), portanto, a referência ambígua. Você também pode adicionar um ORDER BY aos resultados se desejar que eles sejam solicitados

Sasa Ivetic
fonte