Postgis veritabanı sorgu optimizasyonu


10

Ben raster2pgsql komut satırı aracını kullanarak PostGIS veritabanına yüklediğiniz DTED biçiminde rasters bir dizi var.

Rasterlerin her biri bir sıra halinde saklanır ve rid ve raster formatının bir değeri ile tanımlanır.

Şimdi, bir noktanın boylamını ve enlemini alan ve bu noktaya karşılık gelen piksel değerini döndüren bir veritabanı işlevi oluşturmak istiyorum.

Benim sorunum veritabanı Odroid tahtada çalıştığı için bunu yapmak için çok zaman alması (3-4 sn) olmasıdır.

İşlediğim veri kümesinin oldukça büyük olduğunu biliyorum (rasterler tüm İngiltere alanını kapsıyor), ancak PostgreSQL ve PostGIS'e çok aşina olmadığım için daha hızlı yapılabileceğinden şüpheleniyorum.

Şimdiye kadar yaptığım şey bu:

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;

$1ve $2sırasıyla uzun ve lat.


2
Postgis'e aktardığınızda rasterleri fayanslara mı kestiniz? (parametre -t genişlik x yükseklik)?
mutolisp

Evet yaptım. Bir performansı biraz geliştirdi. Muhtemelen veritabanının Odroid panosunda olduğunu da eklemeliyim, bu nedenle Masaüstü PC'den çok daha yavaş çalışıyor. Sadece rasterlerin işleme yaklaşımını bir şekilde değiştirip değiştiremeyeceğimi merak ediyordum, böylece daha az gereksiz hesaplamalar yapıyor. Örneğin başlangıçta, tüm rasterlerde ST_Value işlevini çağırıyordum ve sonra aslında bazı değer içeren satırı ararım. Bu en basit yaklaşımdı ama çok daha yavaş çalıştı.
zedsdead

2
ST_SetSRID(ST_MakePoint($1, $2),4326)Dize kesişmeleri yerine kullanmak , yeterli yineleme varsa size biraz zaman kazandırabilir.
Scro

1
Çok yardımcı görünmüyor ama teşekkür ederim. Tablo oluşturulduğunda tek bir tarama için sınırlayıcı bir kutu içerecek başka bir sütun eklemeyi düşünüyordum. Belki bu şekilde doğru bir raster daha hızlı bulunabilir ... Ayrıca, rasterdeki piksel konumunun köşe koordinatlarına dayalı ön hesaplamasının ve lon / lat içindeki piksel adımının yardımcı olabileceğini merak ediyordum ... Onları paylaşmak için minnettar olacağım düşünceler :)
zedsdead

2
Belki de şişe boynunun nerede olduğunu kontrol etmek için “açıklamak” için deneyebilirsiniz.
mutolisp

Yanıtlar:


1

Bunu deneyebilirsiniz:

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

Ama asıl sorun raster sorgulamasıdır; veri kümesinin döşenmesi sorguları hızlandırmalıdır. PostGIS WKT Raster'ı kullanmayı deneyebilir ve bu eğiticiyi takip edebilirsiniz .

Umarım faydalı olur,

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.