Оптимизация запросов к базе данных Postgis

10

У меня есть набор растров в формате DTED, которые я загружаю в базу данных PostGIS с помощью инструмента командной строки raster2pgsql.

Каждый из растров просто хранится в строке и описывается ридом и значением растрового формата.

Теперь я хочу создать функцию базы данных, которая принимает долготу и широту точки и возвращает значение пикселя, соответствующее этой точке.

У меня проблема в том, что это занимает довольно много времени (3-4 секунды), потому что база данных работает на плате Odroid.

Я знаю, что обрабатываемый мной набор данных довольно большой (растры покрывают всю территорию Великобритании), но, поскольку я не очень хорошо знаком с 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длинные и лат соответственно.

zedsdead
источник
2
Вы разрезали растр на плитки при импорте в postgis? (параметр -t ширина x высота)?
Mutolisp
Да, я сделал. Это немного улучшило производительность. Я должен также добавить, что база данных находится на плате Odroid, поэтому она работает значительно медленнее, чем на настольных ПК. Мне просто интересно, смогу ли я как-то изменить подход к обработке растров, чтобы он делал меньше ненужных вычислений. Например, сначала я вызывал функцию ST_Value для всех растров, а затем я искал строку, которая на самом деле содержит некоторое значение. Это был самый простой подход, но он работал намного медленнее.
zedsdead
2
Использование ST_SetSRID(ST_MakePoint($1, $2),4326)вместо строк concats может сэкономить вам время, если будет достаточно итераций.
Scro
1
Кажется, это не очень помогает, но спасибо. Я думал о добавлении еще одного столбца при создании таблицы, который будет содержать просто ограничивающий прямоугольник для одного растра. Может быть, таким образом, правильный растр мог бы быть найден быстрее ... Кроме того, мне было интересно, может ли помочь предварительный расчет положения пикселя в растре на основе угловых координат и шага пикселя в lon / lat ... Если у кого-нибудь есть мысли о том, что я буду благодарен за то, что поделился ими :)
zedsdead
2
Возможно, вы могли бы попытаться использовать «объяснение», чтобы проверить, где находится горлышко бутылки.
mutolisp

Ответы:

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 и следовать этому руководству .

Надеюсь, это будет полезно,

Бенно
источник