¿Existen limitaciones al usar un ráster de salida de PostGIS?

8

He estado tratando de importar un gran ráster en una base de datos PostGIS 2.0 y toqué algunos escollos.

Inicialmente, cuando intentaba importar el ráster usando raster2pgsql, recibía el siguiente error: rt_band_set_pixel_line: Coordenadas fuera del rango

Después de encontrar esta página y usar gdalinfo, descubrí que el ráster excedía el tamaño máximo permitido de 65535 x 65535.

Salida de gdalinfo:

$ gdalinfo ari100.tif
Controlador: GTiff / GeoTIFF
... El tamaño es 42971, 77138 El
sistema de coordenadas es:
GEOGCS ["WGS 84",
...
AUTHORITY ["EPSG", "4326"]] Origin = (152.741676637167842, -26.215302802012008 )
Tamaño de píxel = (0.000009239757419, -0.000009239757419)
Metadatos:
AREA_OR_POINT =
Metadatos de estructura de imagen de área :
INTERLEAVE = BAND
Coordenadas de esquina:
Superior izquierda (152.7416766, -26.2153028) (152d44'30.04 "E, 26d12'55.09" S)
Inferior izquierda , -26.9280392) (152d44'30.04 "E, 26d55'40.94" S)
Superior derecha (153.1387183, -26.2153028) (153d 8'19.39 "E, 26d12'55.09 "S)
Inferior derecha (153.1387183, -26.9280392) (153d 8'19.39 "E, 26d55'40.94" S)
Centro (152.9401974, -26.5716710) (152d56'24.71 "E, 26d34'18.02" S)
Bloque de banda 1 = 42971x1 Tipo = Float32 , ColorInterp = Gris
...

Así que decidí usar la funcionalidad out-db usando el indicador -R en raster2pgsql.

De la documentación: Registre el ráster como un ráster del sistema de archivos (out-db). Solo los metadatos del ráster y la ubicación de la ruta al ráster se almacenan en la base de datos (no los píxeles).

Importé el ráster usando el siguiente comando:

raster2pgsql /gis/Flood/ari100.tif -R | psql -U username database

Pero cuando probé una consulta:

SELECT ST_Value(rast, ST_PointFromText('POINT(152.9632 -26.4878)')) FROM ari100

Obtuve el siguiente error:

NOTICE:  Attempting to get pixel value with out of range raster coordinates: (23975, 29491)  
CONTEXT:  PL/pgSQL function "st_value" line 13 at RETURN  

Sin embargo, si uso GDAL (a través de Python) para consultar el ráster directamente usando este script

python val_at_coord.py 152.9632 -26.4878

Puedo recuperar el valor correctamente.

Decidí encontrar la extensión del ráster en la base de datos:

SELECT ST_Height(rast) As rastheight, ST_Width(rast) As rastwidth from ari100;

rastheight | rastwidth  
11602      | 42971  

La altura es completamente incorrecta (debe ser 77138).

Entonces mi pregunta es: ¿hice algo mal (al usar raster2pgsql) o hay una limitación al usar rásteres out-db con PostGIS?

Gracias

Philip D'Rozario
fuente
44
Solo una nota: parece que se desbordó muy bien, ya que 77138 = 65536 + 11602.
lynxlynxlynx

Respuestas:

8

Definitivamente querrás enlosar tu trama. El ancho máximo x la altura permitida para el tipo de ráster PostGIS es 65535 x 65535, independientemente de si el ráster está dentro o fuera de base de datos. La otra razón para enlosar su ráster (aunque esto puede no aplicarse en su caso) es que el tamaño de campo máximo permitido por PostgreSQL es de 1 GB [1].

En cuanto al tamaño de mosaico óptimo, solo puedo sugerir dos cosas.

  1. Los tamaños de mosaico <= 100 x 100 son los mejores. más pequeño es más rápido pero consume más espacio de almacenamiento.

  2. Si es posible, busque un tamaño de mosaico que sea claramente divisible de las dimensiones del ráster. Entonces, para un ráster de 42971 x 77138, ningún tamaño de mosaico <= 100 x 100 funciona de manera limpia. En estas situaciones, generalmente solo voy 50 x 50 o algo en ese vecindario.

-bborie

[1] http://www.postgresql.org/about/

polvo
fuente