Eu tenho um banco de dados raster no postgresql / postgis com estas colunas:
(ID, rast, dados_de_dados) .
'rast' é a coluna que possui arquivos rasterizados no formato WKT. Uma consulta de exemplo para localizar o valor DN de um ponto no sistema WGS84 (30.424, -1.66) e para 09-01-2002 é a seguinte:
SELECT
st_value(rast,(st_GeomFromText('POINT(30.424 -1.66)', 4326))) as val
FROM
my_table
WHERE
date_of_data='2002-01-09'
Existe um método (por exemplo, índice espacial) para acelerar esse tipo de consulta?
postgis
raster
query
performance
spatial-index
f.ashouri
fonte
fonte
Respostas:
Esta é uma pergunta emocionante! Qual é o tamanho da varredura que você deseja consultar? O WKTRaster é armazenado no banco de dados como um BLOB . Para encontrar o valor em um ponto específico, a partir de um índice conhecido (x_0, y_0) de coordenadas de linha / coluna de canto (i, j) é calculado usando etapas (dx, dy) e rotação. Com (i, j) conhecido, a função ST_Value () pode acessar os dados reais no deslocamento de bytes correto.
Isso significa que o banco de dados precisa ler, em média, pelo menos metade do blob de dados ao responder a uma consulta de um ponto (dependendo da implementação, ele pode realmente ler todos os dados o tempo todo). Portanto, eu acho que o desempenho do WKTRaster sofre quando os BLOBs de dados ficam muito grandes. A colocação em bloco do conjunto de dados deve acelerar as consultas. Veja como os dados SRTM (que vêm em pedaços de 6000x6000 pixels) são tratados neste tutorial . Eles na verdade agrupam os dados em pixels 50x50 muito pequenos, o que é uma dica clara de que minhas suposições podem não estar muito longe da verdade.
A indexação espacial dos dados raster provavelmente indexará apenas a caixa delimitadora, o que não é uma ajuda real para o seu problema.
fonte
CREATE INDEX srtm_tiled_rast_gist_idx ON srtm_tiled USING GIST (ST_ConvexHull(rast));
( fonte )Dois aspectos que eu achei aceleraram meus cálculos de varredura do PostGIS, usando valores inteiros na varredura e usando rasters multibanda sempre que possível. Nesse caso, o valor DN pode ser armazenado como números inteiros, se isso ainda não estiver sendo feito?
O outro pensamento (e não tenho certeza de que seja relevante aqui) é usar raspadores de várias bandas. Por exemplo, se você estiver vendo fatias mensais de dados, cada mês poderá ser uma camada raster. Em seguida, você pode recuperar vários valores de um ponto em diferentes intervalos de tempo consultando a varredura em camadas. Achei essa abordagem muito mais rápida do que consultar rasters separados.
Finalmente, quando você carrega seus dados, há o
-t
sinalizador para TILE_SIZE . Você pode explorar se o tamanho do bloco que você está usando funciona bem para sua consulta.fonte
Dependendo da distribuição dos seus dados, você pode obter algumas acelerações muito boas apenas indexando a
date_of_data
coluna.Você pode usar a sintaxe EXPLAIN ANALYZE para descobrir se seus índices estão sendo usados ou não.
fonte
create index tbl_name_date_idx on tbl_name (date_of_data)
. Se você tiver muitas datas distintas, isso reduzirá drasticamente a quantidade de dados que o PostGIS precisa processar.WHERE
cláusula, considere sempre indexá-la. Não só ajudará neste caso se você tiver muitas datas distintas (por exemplo, um domínio de grande valor), mas também se você tiver um grande número de registros na tabela.explain analyze SELECT st_value(rast,(st_GeomFromText('POINT(30.424 -1.66)', 4326))) as val from my_table where date_of_data='2002-01-09'
?