Composing raster tiles?

David Haynes haynesd2 at gmail.com
Thu Nov 7 13:59:24 PST 2024


I'll try and help you with A & B

a) Is it more efficient to convert the raster to vector data and calculate
on the those than to calculate directly on the raster?
>> I don't think it would be faster to convert to vector because that would
be dumping the raster into polygons. I think for specifically calculating
slope, you are better off staying in raster.

b) To my understanding, if I calculate the slope on a raster tile,
the slope,… of the borders will have accuracy problems. My I idea, was
to "stitch" a tile with its direct neighbours, calculate on the composed
tile, and either save a cropped calculated composed tile to its  original
dimension or save the calculated composed tile as is,  probably the latter.

>> Overall correct, some small adjustments. For any raster operation, the
tiles are operated on independently, so you need to "stitch" them together.
I've provided a couple of ways in pseduo code

Way 1
1) Use ST_Union and make a big tile,
2) Do the spatial operation,
3) Break it up using ST_Tile()
The downside is you might run out of memory doing this. Also consider
ST_MemUnion()

SELECT ST_Tile(ST_Slope(ST_Union(r1.ras)), 350,350)
FROM raster_table

Way 2)
A second option is to basically create an aggregate, which is likely
faster.
1) Union the tiles based on ST_Touch  - make mega_tiles
2) Do the spatial operation on the mega_tiles
3) Clip the mega_tiles by the old tiles bounding box

WITH rtest as
(
SELECT r1.ras, ST_Union (r1.ras) as megatile
FROM raster_table r1
LEFT JOIN raster_table r2
ON ST_Touches (r1.geom, r2.geom)
GROUP BY r1.ras
)
SELECT ST_CLIP(ST_SLOPE(megatile), ST_Envelop(r1.rast) ) as ras
FROM rtest

Maybe someone wants to make an aggregate for the raster functions?

On Thu, Nov 7, 2024 at 3:31 PM <thiemo at gelassene-pferde.biz> wrote:

> Hi
>
> In my project
>
> https://sourceforge.net/p/treintaytres/code/HEAD/tree/trunk/code_files/data_storage/
> I have the
> table
>
> TABLE_SCHEMA    TABLE_NAME      DATA_TYPE       TYPE_NAME       COLUMN_NAME
> treintaytres    topo_files␟t    1111            uuid            id
> treintaytres    topo_files␟t    93              timestamptz     entry_pit
> treintaytres    topo_files␟t    1111            uuid            source_id
> treintaytres    topo_files␟t    12              text            file_name
> treintaytres    topo_files␟t    1111            raster          tile
> treintaytres    topo_files␟t    93              timestamptz
>  file_creation_pit
> treintaytres    topo_files␟t    12              text            file_hash
>
> TILE contains topographical height raster data from OpenTopography.
> They are from different regions, let's say, some tiles cover
> Switzerland, some cover New Zealand. I want to create slope and other
> data from the height data and I have some questions I hope you can
> answer or point me to answers.
>
> a) Is it more efficient to convert the raster to vector data and
> calculate on the those than to calculate directly on the raster?
>
> b) To my understanding, if I calculate the slope on a raster tile, the
> slope,… of the borders will have accuracy problems. My I idea, was to
> "stitch" a tile with its direct neighbours, calculate on the composed
> tile, and either save a cropped calculated composed tile to its
> original dimension or save the calculated composed tile as is,
> probably the latter.
> Can I compose as follows?
> with RASTER_NEIGHBORS as (         select R1.TILE   as CURRENT_TILE
>                                           ,R2.TILE   as NEIGHBOR_TILE
>                                           ,R1.ID     as CURRENT_ID
>                                       from TOPO_FILES␟T R1
>                            left outer join TOPO_FILES␟T R2
>                                         on ST_Touches(R1.TILE
>                                                      ,R2.TILE)
>                                         or ST_Intersects(R1.TILE
>                                                         ,R2.TILE)
>                                      where TRUE
>                                        --and R1.ID =
> '6b8ca53a-bb5f-4c2b-a9c9-94b6a706e9b0'
>                                        and TRUE)
>     ,NION as (select CURRENT_TILE as TILE
>                     ,CURRENT_ID
>                 from RASTER_NEIGHBORS
>               union
>               select NEIGHBOR_TILE as TILE
>                     ,CURRENT_ID
>                 from RASTER_NEIGHBORS)
>    select ST_Union(TILE) as COMPOSED_TILE
>          ,CURRENT_ID
>      from NION
> group by CURRENT_ID;
>
> c) Finally, I want to select all the areas where slope, TRI,… conform
> certain criteria and have a minium surface size. Do I do it this
> better on vector data and do I need to do this on data composed of all
> the contiguous areas?
>
> I would be grateful for any nudge into the right direction. Maybe URLs
> with samples.
>
> Kind regards
>
> Thiemo
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20241107/b216ab19/attachment.htm>


More information about the postgis-users mailing list