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
fonte
Respostas:
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.
Os tamanhos de ladrilho <= 100 x 100 são os melhores. menor é mais rápido, mas consome mais espaço de armazenamento.
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/
fonte