Ottenere la geometria da più tabelle usando PostGIS?


13

Sono molto nuovo con PostGIS, PostgreSQL e SQL in generale.

Ho 44 tabelle nel mio database PostGIS e ognuna rappresenta un diverso livello di dati vettoriali. Ciascuno è stato caricato da un file di forma separato e ciascuno ha una colonna che descrive la geometria per quel livello, chiamatawkb_geometry

Voglio selezionare un poligono specifico su un livello, quindi recuperare TUTTA la geometria da un sottoinsieme di livelli che si sovrappongono al riquadro di delimitazione del poligono. Non mi sento pignolo per l'ordine in uscita, ma sarebbe utile se fosse organizzato dai tavoli da cui proveniva ogni gruppo di geometria.

Ecco un esempio della mia istruzione 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
        );

che restituisce un errore:

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

Qual è il modo giusto per farlo?


1
Potresti trovare utile il nostro SQL Primer. Lo abbiamo progettato per rispondere alle domande dei neofiti di SQL soprattutto se copre anche alcuni costrutti SQL avanzati. postgis.us/chapter_appendix_c Il capitolo 1 potrebbe essere utile anche poiché è un primer spaziale PostGIS.
LR1234567,

+1. Questi sono i capitoli gratuiti. Acquista l'intero libro, Benjamin, è un investimento degno. se vuoi conoscere PostGIS e molto altro.
Nicklas Avén

Risposte:


8

prima di tutto ricevi questo messaggio di errore, perché non hai specificato da quale tabella vuoi selezionare la colonna della geometria (e poiché hanno tutti lo stesso nome, postgres si confonde). Ecco perché ricevi il messaggio di errore

il riferimento di colonna "wkb_geometry" è ambiguo

Se hai lo stesso nome di colonna in più tabelle, aggiungi sempre il nome della tabella davanti al nome della colonna: ad es. table1.wkb_geometry

Per la tua domanda: se ti capisco bene, vuoi trovare gli oggetti in diversi livelli che si intersecano con un oggetto specifico in un livello specifico.

Inizia a guardare due tavoli alla volta all'inizio per renderlo semplice:

Table1 è la tabella con l'oggetto specifico, table2 la tabella con gli altri oggetti

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

Ora, se vuoi aggiungere altri oggetti da altre tabelle, hai bisogno di UNION ALL, come già menzionato da Sasa. I nomi delle colonne non devono necessariamente essere gli stessi, ma il numero di colonne e tipi di dati!

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

Potresti avere problemi aprendo la query in un visualizzatore, poiché non esiste un ID univoco. Un modo semplice per risolverlo è salvare il risultato come una tabella con una colonna id.

divertiti


6

Non ho un client SQL di fronte a me, quindi questo potrebbe non essere accurato al 100%, ma vorrai qualcosa sulla falsariga di:

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

e così via. Il tuo problema è che la query sql non sa a quale tabella (tabella 2/3/4/5) ti riferisci quando specifichi SELECT ST_AsEWKT (wkb_geometry), quindi il riferimento ambiguo. Puoi anche aggiungere un ORDER BY ai risultati se desideri che vengano ordinati

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.