Saya memiliki database raster di postgresql / postgis dengan kolom-kolom ini:
(ID, rast, data_of_data) .
'rast' adalah kolom yang memiliki file raster dalam format WKT. Contoh kueri untuk menemukan nilai DN suatu titik dalam sistem WGS84 (30.424, -1.66) dan untuk 2002-01-09 adalah sebagai berikut:
SELECT
st_value(rast,(st_GeomFromText('POINT(30.424 -1.66)', 4326))) as val
FROM
my_table
WHERE
date_of_data='2002-01-09'
Apakah ada metode (mis. Indeks spasial) untuk mempercepat pertanyaan semacam itu?
postgis
raster
query
performance
spatial-index
f.ashouri
sumber
sumber
Jawaban:
Ini pertanyaan yang menarik! Seberapa besar raster yang ingin Anda tanyakan? WKTRaster disimpan dalam database sebagai BLOB . Untuk menemukan nilai pada titik tertentu, dari sudut koordinat kolom / baris yang diketahui (x_0, y_0) (i, j) dihitung menggunakan langkah (dx, dy) dan rotasi dan rotasi. Dengan (i, j) diketahui, fungsi ST_Value () dapat mengakses data aktual pada offset byte yang benar.
Ini berarti bahwa DB harus membaca rata-rata setidaknya setengah dari gumpalan data ketika menjawab permintaan untuk suatu titik (tergantung pada implementasinya, ia mungkin benar-benar membaca semua data setiap saat). Karena itu saya akan menebak bahwa kinerja WKTRaster menderita ketika data BLOB menjadi terlalu besar. Ubin dataset harus mempercepat kueri. Lihat bagaimana data SRTM (datang dalam potongan 6000x6000 piksel) ditangani dalam tutorial ini . Mereka benar-benar memasang data menjadi 50x50 piksel sangat kecil, yang merupakan petunjuk jelas bahwa dugaan saya mungkin tidak terlalu jauh dari kebenaran.
Pengindeksan data raster secara spasial mungkin hanya akan mengindeks kotak pembatas, yang sebenarnya tidak membantu untuk masalah Anda.
sumber
CREATE INDEX srtm_tiled_rast_gist_idx ON srtm_tiled USING GIST (ST_ConvexHull(rast));
( sumber )Dua aspek yang saya temukan mempercepat perhitungan raster PostGIS saya, menggunakan nilai integer dalam raster, dan menggunakan raster multi-band jika memungkinkan. Dalam hal ini, dapatkah nilai DN disimpan sebagai bilangan bulat, jika ini belum dilakukan?
Pikiran lain (dan saya tidak yakin itu relevan di sini) adalah menggunakan raster multi-band. Misalnya, jika Anda melihat potongan data bulanan, setiap bulan bisa menjadi layer raster. Kemudian Anda dapat mengambil beberapa nilai dari suatu titik pada irisan waktu yang berbeda dengan menanyakan raster berlapis. Saya menemukan pendekatan ini lebih cepat daripada meminta raster yang terpisah.
Akhirnya, ketika Anda memuat data Anda ada
-t
bendera untuk TILE_SIZE . Anda dapat menjelajahi apakah ukuran ubin yang Anda gunakan berfungsi dengan baik untuk kueri Anda.sumber
Bergantung pada distribusi data Anda, Anda mungkin mendapatkan beberapa speedup yang sangat baik hanya dengan mengindeks
date_of_data
kolom.Anda dapat menggunakan sintaks EXPLAIN ANALYZE untuk mengetahui apakah indeks Anda sedang digunakan atau tidak.
sumber
create index tbl_name_date_idx on tbl_name (date_of_data)
. Jika Anda memiliki banyak tanggal yang berbeda, ini akan secara drastis mengurangi jumlah data yang harus diproses PostGIS.WHERE
klausa, Anda harus selalu mempertimbangkan untuk mengindeksnya. Ini tidak hanya akan membantu dalam kasus ini jika Anda memiliki banyak tanggal yang berbeda (yaitu domain nilai besar) tetapi juga jika Anda memiliki sejumlah besar catatan dalam tabel.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'
?