Оптимізація запитів до баз даних 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є довгими та лат відповідно.


2
Ви розрізали растр на плитці під час імпорту на постгігі? (параметр -t ширина х висота)?
mutolisp

Так. Це трохи покращило продуктивність. Ймовірно, слід також додати, що база даних знаходиться на платі Odroid, тому вона працює значно повільніше, ніж на настільних ПК. Мені було просто цікаво, чи можу я якось змінити підхід до обробки растру, щоб зробити менше зайвих обчислень. Наприклад, спочатку я викликав функцію ST_Value на всіх растрах, а потім шукаю рядок, який насправді містить деяке значення. Це був найпростіший підхід, але він працював набагато повільніше.
zedsdead

2
Використання ST_SetSRID(ST_MakePoint($1, $2),4326)замість строкових контактів може заощадити певний час, якщо буде достатньо ітерацій.
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 і дотримуватися цього посібника .

Сподіваюся, це буде корисним,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.