Postgis数据库查询优化


10

我有一组DTED格式的栅格,可以使用raster2pgsql命令行工具将其加载到PostGIS数据库中。

每个栅格都简单地存储在一行中,并由rid和一个栅格格式的值来描述。

现在,我想创建一个数据库函数,该函数接受点的经度和纬度,并返回与该点相对应的像素值。

我的问题是,由于数据库在Odroid板上工作,因此需要花费很多时间(3-4秒)。

我知道我处理的数据集很大(栅格覆盖了整个英国地区),但是由于我对PostgreSQL和PostGIS不太熟悉,我怀疑它可以更快地完成。

到目前为止,这是我所做的:

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;

$1$2分别为long和lat。


2
导入到Postgis后,您是否将栅格切成瓷砖?(参数-t宽x高)?
mutolisp 2014年

是的,我做到了。它改善了性能。我可能还应该补充一点,该数据库位于Odroid板上,因此它的工作速度明显比台式PC慢。我只是想知道我是否可以以某种方式更改栅格处理方法,从而减少不必要的计算。例如,最初,我在所有栅格上调用ST_Value函数,然后寻找实际上包含某些值的行。这是最简单的方法,但工作起来却慢得多。
zedsdead 2014年

2
ST_SetSRID(ST_MakePoint($1, $2),4326)如果有足够的迭代次数,则使用字符串concat代替您可以节省一些时间。
Scro 2014年

1
似乎没有什么帮助,但谢谢。我正在考虑在创建表时添加另一列,该列将仅包含单个栅格的边界框。也许这样可以更快地找到合适的栅格...另外,我想知道基于角坐标和lon / lat中像素步长对栅格中像素位置的预先计算是否可能会有所帮助...关于我将非常感激分享的想法:)
zedsdead 2014年

2
也许您可以尝试使用“解释”来检查瓶颈在哪里。
mutolisp 2014年

Answers:


1

您可以尝试这样:

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

但是真正的问题是栅格查询; 切片数据集应加快查询速度。您可以尝试使用PostGIS WKT Raster并遵循本教程

我希望这会有用

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.