Otimização de consulta ao banco de dados Postgis

10

Eu tenho um conjunto de rasters no formato DTED que carrego no banco de dados PostGIS usando a ferramenta de linha de comando raster2pgsql.

Cada rasters é simplesmente armazenado em uma linha e descrito por rid e um valor no formato raster.

Agora, eu quero criar uma função de banco de dados que tome longitude e latitude de um ponto e retorne um valor de pixel correspondente a esse ponto.

O problema que tenho é que leva muito tempo para fazer isso (3-4 segundos) porque o banco de dados funciona na placa Odroid.

Eu sei que o conjunto de dados que eu processo é bastante grande (os rasters cobrem toda a área do Reino Unido), mas como eu não estou muito familiarizado com o PostgreSQL e o PostGIS, suspeito que possa ser feito mais rapidamente.

Isto é o que eu fiz até agora:

SELECT ST_Value(rast, ST_GeomFromText(CONCAT('POINT(', $1, ' ', $2, ')'), 4326))
FROM (
    SELECT * FROM rasters
    WHERE rast && ST_GeomFromText(CONCAT('POINT(', $1, ' ', $2, ')'), 4326)
) x;

$1e $2são longos e lat, respectivamente.

zedsdead
fonte
2
Você cortou a varredura em blocos ao importar para o postgis? (parâmetro -t largura x altura)?
Mutolisp 16/10
Sim eu fiz. Melhorou um pouco a performance. Provavelmente, devo acrescentar que o banco de dados está na placa Odroid, portanto, funciona significativamente mais devagar que no PC de mesa. Eu só estava me perguntando se posso mudar de alguma forma a abordagem do processamento de rasters, para fazer cálculos menos desnecessários. Por exemplo, inicialmente, eu estava chamando a função ST_Value em todas as rasters e depois procurava a linha que realmente contém algum valor. Era a abordagem mais simples, mas funcionava muito mais devagar.
zedsdead
2
Usar ST_SetSRID(ST_MakePoint($1, $2),4326)no lugar de concats de string pode economizar algum tempo se houver iterações suficientes.
Scro
1
Não parece ajudar muito, mas obrigado. Eu estava pensando em adicionar outra coluna quando a tabela é criada que conteria simplesmente uma caixa delimitadora para uma única varredura. Talvez desta maneira uma varredura correta possa ser encontrada mais rapidamente ... Além disso, eu queria saber se o pré-cálculo da posição do pixel na varredura com base nas coordenadas do canto e a etapa do pixel em lon / lat pode ajudar ... Se alguém tiver alguma pensamentos sobre isso eu serei grato por compartilhá-los :)
zedsdead
2
Talvez você possa tentar usar o "explicar" para verificar onde está o gargalo da garrafa.
Mutolisp 16/10

Respostas:

1

Você pode tentar o seguinte:

--calculate and store geom point just One time
WITH point_geom AS 
(
    SELECT ST_setsrid(ST_GeomFromText('POINT('|| $1 || ' '|| $2 || ')'), 4326) as geom
)
-- Your subquery is maybe useless , alias "x" isn't used
SELECT ST_Value( rast, point_geom.geom )
FROM rasters
WHERE rast && point_geom.geom;

Mas o verdadeiro problema é a consulta raster; a disposição do conjunto de dados deve acelerar as consultas. Você pode tentar usar o PostGIS WKT Raster e seguir este tutorial .

Espero que seja útil,

Benno
fonte