[Gfoss] postgis e query "on the fly"

Salve a tutti.
Oggi mi si è presentato un problema che pensavo fosse banalissimo ma invece non è così: ovvero fare query spaziali con tabelle che hanno srid differenti. Io ero convinto che postgis potesse fare query “on the fly” gestendo srid differenti e invece non è così! Io ho risolto facendo una select annidata con un st_transform per portare tutto al solito srid. Ma ho sbagliato qualcosa io oppure veramente non si possono fare query con tabelle cha hanno srid diversi?

Grazie e saluti a tutti.

Il 20 gennaio 2011 13:32, Francesco Geri <francescogeri@yahoo.it> ha scritto:

Salve a tutti.

ciao francesco

Oggi mi si è presentato un problema che pensavo fosse banalissimo ma invece
non è così: ovvero fare query spaziali con tabelle che hanno srid
differenti. Io ero convinto che postgis potesse fare query "on the fly"
gestendo srid differenti e invece non è così! Io ho risolto facendo una
select annidata con un st_transform per portare tutto al solito srid. Ma ho
sbagliato qualcosa io oppure veramente non si possono fare query con tabelle
cha hanno srid diversi?

intendi query spaziali vero?
se è così direi che è abbastanza normale (forse perchè lavorando tanto
con GRASS che costringe ad avere dati nello stesso sistema di
coordinate)...

Grazie e saluti a tutti.

--
ciao
Luca

www.lucadelu.org

On Thu, 20 Jan 2011 12:32:46 +0000 (GMT), Francesco Geri wrote

Io ero convinto che postgis potesse fare query
"on the fly" gestendo srid differenti

Francesco,

certo che puoi (almeno, in linea di massima).
come dici tu stesso, ST_Transform() serve
proprio per questo.

Ma quando tu dici "on the fly", cosa intendi
dire esattamente ?

cerco di farti un esempio "tera tera"; ammesso
che tbl1.geom abbia SRID=32632 mentre
tbl2.geom abbia SRID=4326

---------------------------
SELECT *
FROM tbl1, tbl2
WHERE ST_Intersects(tbl1.geom, tbl2.geom);

questa sicuramente fallisce, perchè SQL non ha la bacchetta
magica, e non ha nessuna idea che tu intendi applicare
una riproiezione.

------------------------
SELECT *
FROM tbl1, tbl2,
WHERE ST_Intersects(tbl1.geom, ST_Transform(tbl2.geom, 32632));

oppure

SELECT *
FROM tbl1, tbl2,
WHERE ST_Intersects(ST_Transform(tbl1.geom, 4326), tbl2.geom);

invece queste funzioneranno sicuramente,
perchè ora *entrambe* le geometrie appartengono
al medesimo SRID
ma glielo devi spiegare tu a SQL che occorre
applicare una riproiezione :slight_smile:

ciao Sandro

questa sicuramente fallisce, perchè SQL non ha la bacchetta 
magica, e non ha nessuna idea che tu intendi applicare 
una riproiezione.

------------------------ 
SELECT * 
FROM tbl1, tbl2, 
WHERE ST_Intersects(tbl1.geom, ST_Transform(tbl2.geom, 32632));

oppure

SELECT * 
 FROM tbl1, tbl2, 
 WHERE ST_Intersects(ST_Transform(tbl1.geom, 4326), tbl2.geom);

invece queste funzioneranno sicuramente,
perchè ora *entrambe* le geometrie appartengono
al medesimo SRID
ma glielo devi spiegare tu a SQL che occorre
applicare una riproiezione :-)

ciao Sandro

Si. Esattamente come ho fatto anch’io.

select count(*) from flora3,bioitaly where st_contains(st_transform(bioitaly.the_geom,4326),flora3.the_geom) and bioitaly."DESCZPS" like '%Apuane%';

Solo che speravo che postgis avesse la bacchetta magica appunto e facesse una riproiezione al volo in funzione degli srid. Ho preteso un po’ troppo. :slight_smile:
Grazie e ciao!

Francesco

Salve a tutti.

Volevo utilizzare gdal rasterize per rasterizzare uno shapefile contenente curve di livello in un file geotiff.
il comando lo trovo anche in qgis, ma mi dice che il file .tif deve già esistere ma non capisco come creare questo .tif vuoto...
Ho provato anche a lanciare gdal rasterize da riga di comando per creare il file tif ex novo, aggiungendo il parametro -ts...
mi sa che manca qualcosa....

ciao e grazie

alberto

Il 20 gennaio 2011 15:24, albertobonati <albertobonati@libero.it> ha scritto:

Salve a tutti.

Volevo utilizzare gdal rasterize per rasterizzare uno shapefile contenente
curve di livello in un file geotiff.
il comando lo trovo anche in qgis, ma mi dice che il file .tif deve già
esistere ma non capisco come creare questo .tif vuoto...
Ho provato anche a lanciare gdal rasterize da riga di comando per creare il
file tif ex novo, aggiungendo il parametro -ts...
mi sa che manca qualcosa....

ma non è che sbagli e metti la destinazione nel sorgente? gdal da
linea di comando funziona così, prima la destinazione e poi il
sorgente (strano ma vero :slight_smile: )

ciao e grazie

alberto

--
ciao
Luca

www.lucadelu.org

Volevo utilizzare gdal rasterize per rasterizzare uno shapefile contenente
curve di livello in un file geotiff.
il comando lo trovo anche in qgis, ma mi dice che il file .tif deve già
esistere ma non capisco come creare questo .tif vuoto...
Ho provato anche a lanciare gdal rasterize da riga di comando per creare il
file tif ex novo, aggiungendo il parametro -ts...
mi sa che manca qualcosa....

ciao
dalla pagina di documentazione:

dst_filename:
The GDAL supported output file. Must support update mode access.
Before GDAL 1.8.0, gdal_rasterize could not create new output files.

Quindi con GDAL 1.8 non avresti problemi, con versioni precedenti devi
creare tu stesso il raster di output prima di lanciare gdal_rasterize.

Esiste anche una FAQ che spiega la questione, e fornisce possibili
soluzioni per generare il raster di output:
http://trac.osgeo.org/gdal/wiki/FAQRaster#Howtoconvertarastertoalayerofpolygons

L'approccio con gdal_translate mi sembra quello piu' semplice nella
maggior parte dei casi.
Ovviamente tutto cio' se non ti e' possibile effettuare l'update a GDAL 1.8 :wink:

ciao
P

--
Paolo Corti
Geospatial software developer
web: http://www.paolocorti.net
twitter: @paolo_corti

Il giorno gio, 20/01/2011 alle 15.55 +0100, Paolo Corti ha scritto:

Quindi con GDAL 1.8 non avresti problemi, con versioni precedenti devi
creare tu stesso il raster di output prima di lanciare gdal_rasterize.

Esiste anche una FAQ che spiega la questione, e fornisce possibili
soluzioni per generare il raster di output:
http://trac.osgeo.org/gdal/wiki/FAQRaster#Howtoconvertarastertoalayerofpolygons

L'approccio con gdal_translate mi sembra quello piu' semplice nella
maggior parte dei casi.

Se usi QGIS, un'alternativa semplice e' utilizzare il raster calculator
e trasformare un raster esistente con raster*0
Saluti.
--
http://www.faunalia.it/pc

Il 21/01/2011 9.01, Paolo Cavallini ha scritto:

Se usi QGIS, un'alternativa semplice e' utilizzare il raster calculator
e trasformare un raster esistente con raster*0
Saluti.

Grazie a tutti per i consigli.

Ho scaricato la gdal 1.8 e con quella il file lo crea ex novo, il problema era che credevo di avere l' ultima versione di gdal ma non era così...

Non ho comunque risolto il problema visto che mi crea una immagine tutta rigata (sembra che generi una colonna di pixel si ed una no...). Ho provato a modificare i parametri -b e -burn ma nulla da fare e d' altronde la guida non è molto ricca di esempi.

Non so se il problema deriva dal fatto di creare ex novo il file,

Altro problema è che il file shp con le curve di livello, ottenuto con gdal contour senza problemi, è uno shp che contiene le curve di livello con dettaglio 10 mt di una estensione corrispondente ad un grado di ampiezza e il file rasterizzato dpovrebbe essere molto grande, il mio scopo sarebbe poi di trasformarlo in tiles.

Non ho trovato nulla che mi generi direttamente le tiles da shp, mi viene comunque il dubbio che gdal rasterize non sia adatto allo scopo.

ciao

alberto

Non ho comunque risolto il problema visto che mi crea una immagine tutta
rigata (sembra che generi una colonna di pixel si ed una no...). Ho provato
a modificare i parametri -b e -burn ma nulla da fare e d' altronde la guida
non è molto ricca di esempi.

Non so se il problema deriva dal fatto di creare ex novo il file,

secondo me devi aumentare la risoluzione dell'output, per far cio'
puoi impostare ad es. il parametro -ts

Altro problema è che il file shp con le curve di livello, ottenuto con gdal
contour senza problemi, è uno shp che contiene le curve di livello con
dettaglio 10 mt di una estensione corrispondente ad un grado di ampiezza e
il file rasterizzato dpovrebbe essere molto grande, il mio scopo sarebbe poi
di trasformarlo in tiles.

le tile si generano a partire da un immagine, quindi nel tuo caso e'
giusto l'approccio di rasterizzare inizialmente lo shapefile.
Puoi usare poi gdal_retile (un'altra utility di GDAL) per generare le
tiles (puoi anche impostare piu livelli piramidali).

ciao
P

--
Paolo Corti
Geospatial software developer
web: http://www.paolocorti.net
twitter: @paolo_corti