20 votos

Carga de un ráster en una base de datos PostGIS 2.0 en Windows

Estoy tratando de averiguar cómo cargar una trama en una base de datos PostGIS2.0 (he hecho preguntas anteriores sobre este tema aquí y aquí ). Estoy intentando utilizar el raster2pgsql.exe suministrado con PostGIS2.0.

Después de averiguar que el símbolo del sistema en Windows debe ejecutarse como administrador (En Windows 7 para ejecutar la línea de comandos como administrador, escriba cmd en la barra de búsqueda y pulsa ctrl + shift + enter ) para activar raster2pgsql.exe para funcionar he conseguido más o menos cargar una trama en mi base de datos. Tengo un archivo raster llamado ras_test.tif que coloqué temporalmente en el bin carpeta de mi postgresql instalación. Usando el siguiente código convierto y cargo este raster:

C:\Program Files (x86)\PostgreSQL\9.1\bin>raster2pgsql -s 102003 ras_test.tif -t> elev.sql
Processing 1/1: ras_test.tif

C:\Program Files (x86)\PostgreSQL\9.1\bin>psql.exe -p 5434 -U postgres -d test2 -f elev.sql
BEGIN
psql:elev.sql:2: NOTICE:  CREATE TABLE will create implicit sequence "-t_rid_seq" for serial column "-t.rid"
psql:elev.sql:2: NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "-t_pkey" for table "-t"
CREATE TABLE
INSERT 0 1
COMMIT

Cuando veo esta tabla en PostGIS tiene este aspecto:

enter image description here

Sin embargo, no he podido ver esto en QGIS, y no estoy seguro de si lo he cargado correctamente, ya que parece que no hay datos en este archivo. Parece que he cargado el nombre del archivo como una trama, en lugar del contenido de los datos. ¿He cometido algún error evidente que me impida cargar una trama en mi base de datos?


El PostGIS documentación proporciona un ejemplo de cómo cargar una trama, pero no entiendo qué argumentos son opcionales, y sigo sin tener claro qué debo usar si quiero utilizar el esquema por defecto. Por ejemplo, en el siguiente ejemplo de la documentación:

raster2pgsql -s 4236 -I -C -M *.tif -F -t myschema.demelevation > elev.sql 
psql -d gisdb -f elev.sql
  1. ¿Tengo que proporcionar un SRID? -s 4236

  2. ¿Son los argumentos -I -C -M ¿todo opcional?

  3. -t parece ser el tamaño de las baldosas; ¿tengo que especificarlo si no tengo un esquema personalizado?

  4. ¿Puedo omitir myschema.demelevation ?


EDIT: He incluido el resultado de las sugerencias a continuación:

C:\Program Files (x86)\PostgreSQL\9.1\bin>raster2pgsql -s 102003 -t 300x300 ras_test.tif ras_test | psql.exe -U postgres
 -d raster_analysis -h localhost -p 5434
Processing 1/1: ras_test.tif
BEGIN
NOTICE:  CREATE TABLE will create implicit sequence "ras_test_rid_seq" for serial column "ras_test.rid"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "ras_test_pkey" for table "ras_test"
CREATE TABLE
INSERT 0 1
INSERT 0 1
INSERT 0 1
INSERT 0 1
COMMIT

El resultado es una tabla con dos columnas rid y rast . rid tiene cuatro valores, nad rast no tiene. Cuando intento usar más argumentos:

C:\Program Files (x86)\PostgreSQL\9.1\bin>raster2pgsql -I -C -e -Y -F -s 102003 -t 300x300 ras_test.tif ras_test1 | psql
.exe -U postgres -d raster_analysis -h localhost -p 5434
Processing 1/1: ras_test.tif
NOTICE:  CREATE TABLE will create implicit sequence "ras_test1_rid_seq" for serial column "ras_test1.rid"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "ras_test1_pkey" for table "ras_test1"
CREATE TABLE
CREATE INDEX
ANALYZE
NOTICE:  Adding SRID constraint
CONTEXT:  PL/pgSQL function "addrasterconstraints" line 49 at RETURN
NOTICE:  Adding scale-X constraint
CONTEXT:  PL/pgSQL function "addrasterconstraints" line 49 at RETURN
NOTICE:  Adding scale-Y constraint
CONTEXT:  PL/pgSQL function "addrasterconstraints" line 49 at RETURN
NOTICE:  Adding blocksize-X constraint
CONTEXT:  PL/pgSQL function "addrasterconstraints" line 49 at RETURN
NOTICE:  Adding blocksize-Y constraint
CONTEXT:  PL/pgSQL function "addrasterconstraints" line 49 at RETURN
NOTICE:  Adding alignment constraint
CONTEXT:  PL/pgSQL function "addrasterconstraints" line 49 at RETURN
NOTICE:  Adding number of bands constraint
CONTEXT:  PL/pgSQL function "addrasterconstraints" line 49 at RETURN
NOTICE:  Adding pixel type constraint
CONTEXT:  PL/pgSQL function "addrasterconstraints" line 49 at RETURN
NOTICE:  Adding nodata value constraint
CONTEXT:  PL/pgSQL function "addrasterconstraints" line 49 at RETURN
NOTICE:  Unable to add constraint "enforce_nodata_values_rast"
CONTEXT:  PL/pgSQL function "_add_raster_constraint_nodata_values" line 40 at RETURN
PL/pgSQL function "addrasterconstraints" line 94 at assignment
PL/pgSQL function "addrasterconstraints" line 49 at RETURN
WARNING:  Unable to add constraint: 'nodata_values'.  Skipping
CONTEXT:  PL/pgSQL function "addrasterconstraints" line 49 at RETURN
NOTICE:  Adding maximum extent constraint
CONTEXT:  PL/pgSQL function "addrasterconstraints" line 49 at RETURN
 addrasterconstraints
----------------------
 t
(1 row)

Obtengo el siguiente resultado. El resultado es una nueva tabla con la siguiente estructura:

enter image description here

Supongo que no se trata de una trama correctamente cargada, ya que no puedo ver los datos. ¿Hay alguna otra opción que pueda probar?

EDIT: Este último intento funcionó, sólo que no estaba accediendo a la trama correctamente.

10voto

dlanod Puntos 8661

Celenius,

Si no utiliza el -t con dimensiones de tamaño, entonces su archivo raster llegará como un único registro. Acabo de notar un error en los documentos que es probablemente lo que te confunde. Voy a arreglarlo. El -t debe ir siempre seguido de widthxheight.

Si quieres que se trocee digamos en 100x100 pixeles ancho alto -- como dice Mapperz -- usa la opción -t.

Así que tu orden sería:

raster2pgsql -s 102003  -t 100x100 ras_test.tif ras_test > elev.sql

Echa un vistazo al ejemplo aéreo en la documentación. http://www.postgis.org/documentation/manual-svn/using_raster.xml.html#RT_Raster_Loader

Que es el que utilizan muchos de los ejemplos manuales:

raster2pgsql -I -C -e -Y -F -s 26986 -t 128x128 -l 2,4 bostonaerials2008/*.jpg aerials.boston | psql -U postgres -d gisdb -h localhost -p 5432

Sé que los interruptores pueden ser un poco desalentadores porque son muchos y la mayoría son opcionales. Quizás en la 2.1 tengamos una interfaz similar a la de la shp2pgsql-gui para hacer esto un poco más sencillo para los novatos.

En la última versión de raster2pgsql existe una lógica para inferir el srid a partir de la información de georeferencia en el tif u otro archivo raster (esta versión está disponible como binario de ventana ahora). Aún no he probado esta función, pero si funciona, puedes incluso omitir la srid y la calculará (esperemos que correctamente).

6voto

Erik Öjebo Puntos 6937

¿SRID? -s 4236 (obligatorio)

¿Los argumentos -I -C -M son todos opcionales?

-C Aplicar restricciones de raster -- srid, pixelsize etc. para asegurar que el raster se registra correctamente en la vista raster_columns. (obligatorio)

-M (Análisis en vacío de la tabla raster.) opcional

-I (Crear un índice GiST en la columna raster. ) opcional pero recomendado

-t TILE_SIZE (Corta la trama en mosaicos que se insertarán uno por fila de tabla. TILE_SIZE se expresa como ANCHURAxALTURA).

myschema.demelevation omitir (sí)

http://postgis.net/docs/using_raster_dataman.html#RT_Loading_Rasters

-2voto

grahammechanical Puntos 1626

En la vista SQL, no se pueden ver los datos cuando son grandes. Puede ejecutar la consulta en un archivo y mostrará los datos.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X