¿Obtener geometría de múltiples tablas usando 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 archivo de forma separado, y cada uno tiene una columna que describe la geometría de esa capa, llamadawkb_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 el orden de salida, pero sería útil si estuviera organizado por las tablas de 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?

BenjaminGolder
fuente
1
Puede encontrar útil nuestro Primer SQL. Lo diseñamos para responder preguntas novatas sobre SQL principalmente, aunque también cubre algunas construcciones SQL avanzadas. postgis.us/chapter_appendix_c Capítulo 1 también puede ser útil ya que es un manual espacial PostGIS.
LR1234567
+1. Esos son los capítulos libres. Compre todo el libro, Benjamin, es una inversión que vale la pena. si quieres aprender sobre PostGIS y mucho más.
Nicklas Avén 01 de

Respuestas:

8

En primer lugar, recibe este mensaje de error, ya que no especificó de qué tabla desea seleccionar la columna de geometría (y dado que todos tienen su mismo nombre, Postgres se está confundiendo). Es por eso que 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 lo entiendo bien, desea encontrar los objetos en diferentes capas que se cruzan con un objeto específico en una capa específica.

Comience a mirar dos tablas a la vez al principio para que sea 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 columna no necesitan ser iguales, ¡sino el número de columnas y los 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...

Puede tener problemas al abrir la consulta en un visor, ya que no hay una identificación única. Una manera simple de resolver esto es guardar el resultado como una tabla con una columna de identificación.

que te diviertas

Thomas
fuente
6

No tengo un cliente SQL delante de mí, por lo que esto puede no ser 100% exacto, 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í. Su problema es que la consulta 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 ORDER BY a los resultados si desea ordenarlos

Sasa Ivetic
fuente