Re: Composing raster tiles?

Thiemo Kellner <[email protected]>
Newsgroups gmane.comp.gis.postgis
Message-ID <[email protected]>
Thanks for your nudge

07.11.2024 23:00:04 David Haynes <[email protected]>:

> 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 <[email protected]> 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[http://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[http://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
>>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.