¿Obtener geometría de varias tablas utilizando PostGIS?

13

Soy muy nuevo en PostGIS, PostgreSQL y SQL en general.

Tengo 44 tablas en mi base de datos PostGIS, y cada una representa una capa diferente de datos vectoriales. Cada uno se cargó desde un shapefile separado, y cada uno tiene una columna que describe la geometría de esa capa, llamada wkb_geometry

Quiero seleccionar un polígono específico en una capa y luego recuperar TODA la geometría de un subconjunto de capas que se superponen al cuadro delimitador de ese polígono. No me siento quisquilloso con la orden de salida, pero sería útil si estuviera organizado por las tablas de las que procedía cada grupo de geometría.

Aquí hay una muestra de mi declaración 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 devuelve un error:

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

¿Cuál es la forma correcta de hacer esto?

    
pregunta BenjaminGolder 01.04.2011 - 01:54

2 respuestas

8

En primer lugar, recibe este mensaje de error, porque no especificó de qué tabla desea seleccionar la columna de geometría (y dado que todos tienen el mismo nombre, Postgres se confunde). Por eso recibes el mensaje de error

  

la referencia de columna "wkb_geometry" es ambigua

Si tiene el mismo nombre de columna en varias tablas, siempre agregue el nombre de la tabla delante del nombre de la columna: por ejemplo, table1.wkb_geometry

Para su consulta: Si te entiendo bien, quieres encontrar los objetos en diferentes capas que se intersecan con un objeto específico en una capa específica.

Empieza a mirar dos tablas a la vez al principio para hacerlo simple:

Table1 es la tabla con el objeto específico, table2 la tabla con los otros objetos

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

Ahora, si desea agregar objetos adicionales de otras tablas, necesita UNION ALL, como ya mencionó Sasa. Los nombres de las columnas no tienen que ser iguales, ¡sino la cantidad de columnas y tipos de datos!

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

Es posible que tenga problemas al abrir la consulta en un visor, ya que no hay una ID única. Una forma sencilla de resolver esto es guardar el resultado como una tabla con una columna de identificación.

divertirse

    
respondido por el Thomas 03.04.2011 - 15:20
6

No tengo un cliente SQL delante de mí, por lo que puede que no sea 100% preciso, pero querrás algo como:

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

y así sucesivamente. Su problema es que la consulta de SQL no sabe a qué tabla (tabla2 / 3/4/5) se refiere cuando especifica SELECT ST_AsEWKT (wkb_geometry), por lo tanto, la referencia ambigua. También puede agregar un ORDEN POR los resultados si desea que se ordenen

    
respondido por el Sasa Ivetic 01.04.2011 - 03:32

Lea otras preguntas en las etiquetas