У меня есть растровая база данных в postgresql / postgis с этими столбцами:
(ID, раст, data_of_data) .
«Раст» - это столбец с растровыми файлами в формате WKT. Пример запроса для поиска значения DN точки в системе WGS84 (30.424, -1.66) и для 2002-01-09 выглядит следующим образом:
SELECT
st_value(rast,(st_GeomFromText('POINT(30.424 -1.66)', 4326))) as val
FROM
my_table
WHERE
date_of_data='2002-01-09'
Есть ли способ (например, пространственный индекс) для ускорения таких запросов?
postgis
raster
query
performance
spatial-index
f.ashouri
источник
источник
Ответы:
Это захватывающий вопрос! Насколько большой растр вы хотите запросить? WKTRaster хранится в базе данных как BLOB . Чтобы найти значение в конкретной точке, из известных (x_0, y_0) угловых координат строки / столбцов индексы (i, j) вычисляются с использованием (dx, dy) шагов и поворота. С известным (i, j), функция ST_Value () может получить доступ к фактическим данным с правильным байтовым смещением.
Это означает, что при ответе на запрос к точке БД должна в среднем прочитать хотя бы половину большого двоичного объекта данных (в зависимости от реализации она может фактически всегда считывать все данные). Поэтому я бы предположил, что производительность WKTRaster страдает, когда большие двоичные объекты данных становятся слишком большими. Черепица набора данных должна ускорить запросы. Посмотрите, как обрабатываются данные SRTM (поступающие в виде фрагментов размером 6000x6000 пикселей) в этом руководстве . Они на самом деле разбивают данные на очень маленькие 50x50 пикселей, что является явным намеком на то, что мои догадки могут быть не слишком далеки от истины.
Пространственная индексация растровых данных, вероятно, будет просто индексировать ограничивающий прямоугольник, что не поможет в вашей проблеме.
источник
CREATE INDEX srtm_tiled_rast_gist_idx ON srtm_tiled USING GIST (ST_ConvexHull(rast));
( источник )Два аспекта, которые я обнаружил, ускорили мои расчеты растра PostGIS: использование целочисленных значений в растре и использование многоканальных растров, где это возможно. В этом случае, может ли значение DN быть сохранено как целые числа, если это еще не сделано?
Другая мысль (и я не уверен, что это уместно здесь) заключается в использовании многоканальных растров. Например, если вы просматриваете ежемесячные фрагменты данных, каждый месяц может быть растровым слоем. Затем вы можете получить несколько значений точки на разных временных срезах, запросив многоуровневый растр. Я обнаружил, что такой подход намного быстрее, чем запросы к отдельным растрам.
Наконец, когда вы загружаете свои данные, появляется
-t
флаг для TILE_SIZE . Вы можете выяснить, подходит ли используемый вами размер плитки для вашего запроса.источник
В зависимости от распределения ваших данных, вы можете получить очень хорошие ускорения, просто проиндексировав
date_of_data
столбец.Вы можете использовать синтаксис EXPLAIN ANALYZE, чтобы выяснить, используются ли ваши индексы или нет.
источник
create index tbl_name_date_idx on tbl_name (date_of_data)
. Если у вас много разных дат, это резко сократит объем данных, которые должен обрабатывать PostGIS.WHERE
предложении, вы всегда должны учитывать его индексацию. Это поможет не только в этом случае, если у вас много разных дат (т. Е. Домен с большим значением), но также если у вас есть большое количество записей в таблице.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'
?