Optimalisasi permintaan basis data Postgis

10

Saya memiliki satu set raster dalam format DTED yang saya muat ke dalam database PostGIS menggunakan alat baris perintah raster2pgsql.

Setiap raster hanya disimpan dalam satu baris dan dijelaskan oleh rid dan nilai format raster.

Sekarang, saya ingin membuat fungsi basis data yang mengambil bujur dan lintang suatu titik dan mengembalikan nilai piksel yang sesuai dengan titik ini.

Masalah yang saya miliki adalah bahwa dibutuhkan cukup banyak waktu untuk melakukan itu (3-4 detik) karena database berfungsi pada papan Odroid.

Saya tahu bahwa dataset yang saya proses cukup besar (raster mencakup seluruh wilayah Inggris) tetapi karena saya tidak terlalu mengenal PostgreSQL dan PostGIS, saya curiga ini bisa dilakukan lebih cepat.

Inilah yang telah saya lakukan sejauh ini:

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;

$1dan $2panjang dan lat masing-masing.

zedsdead
sumber
2
Apakah Anda memotong raster menjadi ubin ketika Anda mengimpor ke postgis? (parameter -t lebar x tinggi)?
mutolisp
Ya saya lakukan. Ini sedikit meningkatkan kinerja. Saya mungkin juga harus menambahkan bahwa database berada di papan Odroid, oleh karena itu bekerja lebih lambat secara signifikan daripada pada PC Desktop. Saya hanya ingin tahu apakah saya bisa mengubah pendekatan pemrosesan raster sehingga perhitungannya tidak perlu. Sebagai contoh pada awalnya, saya memanggil fungsi ST_Value pada semua raster dan kemudian saya akan mencari baris yang sebenarnya mengandung beberapa nilai. Itu adalah pendekatan paling sederhana tetapi bekerja lebih lambat.
zedsdead
2
Menggunakan ST_SetSRID(ST_MakePoint($1, $2),4326)pengganti string concats dapat menghemat waktu Anda jika ada cukup iterasi.
Scro
1
Tampaknya tidak banyak membantu tetapi terima kasih. Saya sedang berpikir tentang menambahkan kolom lain ketika tabel dibuat yang hanya akan berisi kotak pembatas untuk satu raster. Mungkin dengan cara ini raster kanan dapat ditemukan lebih cepat ... Juga, saya bertanya-tanya apakah pra-perhitungan posisi piksel dalam raster berdasarkan koordinat sudut dan langkah piksel dalam lon / lat mungkin membantu ... Jika ada yang punya memikirkan bahwa saya akan berterima kasih untuk berbagi mereka :)
zedsdead
2
Mungkin Anda bisa mencoba menggunakan "jelaskan" untuk memeriksa di mana leher botol itu.
mutolisp

Jawaban:

1

Anda bisa mencoba ini:

--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;

Tetapi masalah sebenarnya adalah raster queriing; ubin data harus mempercepat permintaan. Anda dapat mencoba menggunakan PostGIS WKT Raster dan ikuti tutorial ini .

Semoga bermanfaat,

Benno
sumber