Я використовую PostGIS2.0, щоб зробити кілька растрових / багатокутних перетинів. Мені важко зрозуміти, яку операцію я повинен використовувати, і який найшвидший спосіб виконання цього. Моя проблема полягає в наступному:
- У мене є багатокутник і растр
- Я хочу знайти всі пікселі, які потрапляють у полігон, і отримати суму значення пікселя
- І (оновлена проблема): я отримую масові значення для деяких пікселів, які не існують у вихідному растрі, коли я виконую запит
У мене важко зрозуміти , чи повинен я використовувати ST_Intersects()
або ST_Intersection()
. Я також не знаю, який найкращий підхід для підсумовування пікселів. Ось перший підхід, який я спробував (№1):
SELECT
r.rast
FROM
raster as r,
polygon as p
WHERE
ST_Intersects(r.rast, p.geom)
Це повертає список rast
значень, з якими я не впевнений, що з цим робити. Я спробував обчислити підсумкову статистику, ST_SummaryStats()
але я не впевнений, чи це зважена сума всіх пікселів, що лежать у полігоні.
SELECT
(result).count,
(result).sum
FROM (
SELECT
ST_SummaryStats(r.rast) As result
FROM
raster As r,
polygon As p
WHERE
ST_Intersects(r.rast, p.geom)
) As tmp
Інший підхід, який я спробував (№2), використовує ST_Intersection()
:
SELECT
(gv).geom,
(gv).val
FROM
(
SELECT
ST_Intersection(r.rast, p.geom) AS gv
FROM
raster as r,
polygon as p
WHERE
ST_Intersects(r.rast, p.geom)
) as foo;
Це повертає список геометрій, які я аналізую далі, але я вважаю, що це менш ефективно.
Мені незрозуміло, за яким також є найшвидший порядок роботи. Чи слід завжди вибирати raster, polygon
чи polygon, raster
перетворювати багатокутник у растр так, щоб він був raster, raster
?
EDIT: Я оновив підхід №2 з деякими деталями із R.K.
посилання 's.
Використовуючи підхід №2, я помітив наступну помилку в результатах, яка є частиною причини, чому я не зрозумів вихід. Ось зображення мого оригінального растру та контур багатокутника, який використовується для його перетину, накладений зверху:
І ось результат перехрестя за допомогою PostGIS:
Проблема з результатом полягає в тому, що є значення 21474836, які повертаються, яких немає в початковому растрі. Я не знаю, чому це відбувається. Я підозрюю, що він десь пов'язаний з невеликою кількістю (ділиться майже на 0), але це повертає неправильний результат.
ST_SummaryStats()
для №1, але не знаю, як це зробити для №2.