Existem limitações ao usar uma varredura PostGIS out-db?

8

Eu tenho tentado importar uma grande varredura para um banco de dados PostGIS 2.0 e atingido alguns obstáculos.

Inicialmente, quando tentei importar a varredura usando raster2pgsql, eu receberia o seguinte erro: rt_band_set_pixel_line: Coordenadas fora do intervalo

Depois de encontrar esta página e usar o gdalinfo, descobri que a varredura excedia o tamanho máximo permitido de 65535 x 65535.

saída gdalinfo:

$ gdalinfo ari100.tif
Driver: GTiff / GeoTIFF
... O tamanho é 42971, 77138 O
sistema de coordenadas é:
GEOGCS ["WGS 84",
...
AUTORIDADE ["EPSG", "4326"]] Origem = (152.741676637167842, -26.215302802012008 )
Pixel Size = (,000009239757419, -,000009239757419)
Metadados:
AREA_OR_POINT = Área de
estrutura de imagem Metadados:
intercalar = BAND
Canto Coordenadas:
superior Esquerdo (152,7416766, -26,2153028) (152d44'30.04 "E, 26d12'55.09" S)
inferior esquerdo (152,7416766 , -26,9280392) (152d44'30,04 "E, 26d55'40,94" S)
superior direito (153,1387183, -26,2153028) (153d 8'19,39 "E, 26d12'55.09 "S)
Centro inferior direito (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)
Banda 1 bloco = 42971x1 Tipo = Float32 , ColorInterp = Cinza
...

Então, decidi usar a funcionalidade out-db usando o sinalizador -R no raster2pgsql.

Na documentação: Registre a varredura como uma varredura do sistema de arquivos (out-db). Somente os metadados da localização da varredura e do caminho para a varredura são armazenados no banco de dados (não nos pixels).

Importei a varredura usando o seguinte comando:

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

Mas quando eu tentei uma consulta:

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

Estou tendo o erro a seguir:

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

No entanto, se eu usar o GDAL (através do Python) para consultar o raster diretamente usando esse script

python val_at_coord.py 152.9632 -26.4878

Eu posso recuperar o valor corretamente.

Decidi encontrar as extensões da varredura no banco de dados:

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

rastheight | rastwidth  
11602      | 42971  

A altura está completamente incorreta (deve ser 77138).

Então, minha pergunta é: fiz algo errado (ao usar o raster2pgsql) ou há uma limitação no uso de rasters out-db com o PostGIS?

obrigado

Philip D'Rozario
fonte
4
Apenas uma observação: parece que estourou muito bem, já que 77138 = 65536 + 11602.
Lynxlynxlynx

Respostas:

8

Você definitivamente vai querer ladrilhar sua varredura. A largura máxima x altura permitida para o tipo de varredura PostGIS é 65535 x 65535, independentemente de a varredura estar dentro ou fora de banco de dados ou fora de banco de dados. O outro motivo para agrupar sua varredura (embora isso não se aplique no seu caso) é que o tamanho máximo do campo permitido pelo PostgreSQL é de 1 GB [1].

Quanto ao tamanho ideal de ladrilhos, só posso sugerir duas coisas.

  1. Os tamanhos de ladrilho <= 100 x 100 são os melhores. menor é mais rápido, mas consome mais espaço de armazenamento.

  2. Se possível, encontre um tamanho de ladrilho divisível das dimensões da varredura. Portanto, para uma varredura de 42971 x 77138, nenhum tamanho de bloco <= 100 x 100 funciona corretamente. Nessas situações, eu costumo ir 50 x 50 ou algo assim naquele bairro.

-bborie

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

dustymugs
fonte