PostgreSQL и PostGIS для извлечения определенной c области, покрытой полигоном ROI - PullRequest
1 голос
/ 07 января 2020

Уважаемое сообщество переполнения стека,

Я работаю с облаком цифровых точек возвышения (средняя глубина 4-10 точек / м², точность позиционирования +/- 30 см, точность высоты +/- 15 см, площадь : 1000x1000 м). Я интерполировал растровый файл с разрешением 1м х 1м. Далее обозначается как DEM.

Кроме того, у меня есть 4-канальное, высокоточное, ортографическое c изображение (средняя точность позиционирования +/- 20-30 см, горизонтальное разрешение 20 см х 20 см) для та же область. Далее обозначается как DOP

. Я хранился как в PostgreSQL -DB с расширением PostGIS и размером листов 40x40.

Цель для создания полигонов и запроса растровых данных обоих слоев, упомянутых выше. покрыты этими полигонами. Я создал многоугольник с продолжением e. \, G. 32 х 32м. Этот многоугольник смещается по интересующей области, так что вся область покрыта множеством многоугольников. После этого я создал запрос для покрытых растровых данных:

WITH 
    ref AS(
            SELECT 
            ST_Transform(rast,25832) AS align_to
            FROM geodata.dsm LIMIT 1
    ), 
    aligned AS(
        SELECT
            ST_Union(
                ST_Transform(
                        ST_Clip(
                                dsm.rast,
                                    p.geom
                            ),
                            align_to
                    )
        ) as rast1,
            ST_Union(
                ST_AsRaster(
                        p.geom,
                            align_to
                    )
            ) rast2
            FROM 
            geodata.dsm AS dsm,
            public.classification_result_overlap_35cm_ss8 AS p
        CROSS JOIN ref
        WHERE 
        p.gid=1 AND ST_Intersects(dsm.rast, p.geom) 
    )
    SELECT
        ST_MapAlgebra(rast1, rast2,'[rast1]') as raster FROM aligned;

После визуальной проверки результатов стало очевидно, что сопоставление между запрашиваемой ЦМР и DOP не является точным на 100%. Это стало более очевидным, когда я уменьшил размер многоугольника, скажем, 8 х 8 м. Я запросил с помощью ST_GeoReference верхние левые координаты запрашиваемых данных DEM и DOP и определил с помощью pyproj.Geod (...). Inv расстояние между верхними левыми координатами. Я выяснил, что сдвиг между верхними левыми координатами данных DEM и DOP находится в диапазоне от 0 до 1,2. Может быть, я что-то не так сделал в своем запросе? Я подумал, что, возможно, максимальная разница между DEM и DOP может быть обусловлена ​​различным горизонтальным разрешением наборов данных. В этом случае максимальная разница между данными может составлять \ sqrt {2} м.

Кстати, у кого-нибудь есть подсказка для дальнейшего ускорения этого запроса?

Система настройка:

  • БД: PostgreSQL версия 12.1
  • ОС: Ubuntu 18.04
  • Расширение: POSTGIS = "3.0.0 r17983" [EXTENSION] PGSQL = " 120 "GEOS =" 3.8.0-CAPI-1.13.1 "PROJ =" 6.3.0 "GDAL =" GDAL 3.1.0dev-437c92a187, выпущено в 2020/01/05 "LIBXML =" 2.9.9 "LIBJSON =" 0,12 .1 "РАСТР

Заранее спасибо.

С наилучшими пожеланиями

...