TERRAIN STREAMING
Terrain streaming is how STREAM opens a survey that is far bigger than your graphics memory and keeps it responsive: the terrain is cut into fixed tiles at several levels of detail, and every frame the camera asks only for the tiles it can actually see. The rest stays on disk. That is why a gigabyte DEM pans without a loading bar, why a point cloud becomes a surface you can measure on, and why several DEMs of the same site behave as one — all on your own machine.
A large DEM does not fit on the GPU, and it should not have to. Terrain streaming keeps the full dataset on disk in a tiled, multi-resolution form and moves only the visible part into graphics memory — coarse tiles for the whole view first, then the fine tiles where the camera is focused.
STREAM does this with a two-level raster path. The source GeoTIFF or BigTIFF is read once through GDAL and converted into a native optimized copy: a deterministic 512 × 512 tile layout with overview levels, Float32 for elevation and RGBA8 for orthophotos. Once that copy is complete, the renderer reads tiles from it directly instead of going back through the source file.
The result is that the file's size stops being the limit. What matters is how much you are looking at, and that is bounded by the screen.
Each terrain tile has an identity of level, x and y. Every frame the camera state produces a request set: a pinned coarse set covering the whole view, and a detail set for where you are focused. Tiles outside that set are not decoded, not uploaded and not held.
On first open STREAM builds its native optimized copy — 512 × 512 tiles, overview levels, ZSTD-compressed tiled BigTIFF. A tile table records what has been built; the cache counts as complete only when every tile is built. From then on the renderer reads tiles directly and reopening is fast.
Tile decode runs on worker threads as jobs with five priority levels, from background prediction up to critical, under an in-flight limit. Stale jobs are cancelled by generation, so a fast camera move does not leave a queue of tiles nobody needs.
Upload order follows camera focus and visibility. If a fine tile is not ready yet, the coarser level stands in for it, so the surface is always closed; detail sharpens as the tiles arrive.
When atlas memory is full, the eviction policy prefers to drop tiles of the same or a coarser level than the incoming one, considers distance from the camera focus, and protects the coverage-fallback pages — so freeing memory for detail never opens a gap in the base.
When more than one DEM is visible, STREAM binds the stack into a single virtual mosaic: the topmost valid pixel wins and NoData falls through to the layer beneath. Analysis, contours, cross-sections and hydrology read that same mosaic the renderer draws — not just the first file.
A LAS/LAZ file is probed first — point count, classification, RGB, bounds — then rasterized asynchronously into the same native tile format. You choose what the surface is: ground points only, all points, or an orthophoto from the point colours.
Elevation and orthophoto are tracked as separate sparse page sets, each with its own residency, so a heavy orthophoto never starves the terrain of height tiles. Rendering is Vulkan on the GPU, and on a laptop STREAM selects the discrete card itself.
Add the DEM (GeoTIFF or BigTIFF). On the very first open STREAM converts it to its native tiled format; a progress card at the bottom right shows the build and can be cancelled.
Pan and zoom. Coarse tiles cover the view at once; fine tiles stream in where the camera is focused. There is no full-file load to wait for.
Add the orthophoto GeoTIFF. It streams as its own page set at native resolution, independent of the height tiles.
Add a LAS/LAZ file and pick the surface you want from it: ground DEM, all-points DEM, or an orthophoto from point colours. The result is a streamed surface like any other.
Load the DEMs of the same site. Visible layers are combined into one virtual mosaic — the top valid pixel shows, NoData falls through — and every analysis reads that mosaic.
The native copy stays with the project. Next time, the same survey opens in seconds because the conversion is already done.
| Option | Which points are used | What you get |
|---|---|---|
| Ground DEM | Class-2 (ground) points, the minimum elevation in each cell. | A bare-earth terrain surface for volumes, slopes and design work. |
| All-points DEM | Every point, the maximum elevation in each cell. | A surface that includes vegetation and structures — what a DSM shows. |
| Orthophoto | The colour of the highest point in each cell, when the cloud carries RGB. | An image layer draped over the terrain, streamed as its own page set. |
Keeping a large terrain dataset on disk in a tiled, multi-resolution form and moving only the visible tiles into graphics memory each frame — coarse tiles for the whole view, fine tiles where the camera is focused. The file's size stops being the limit; what you are looking at is, and that is bounded by the screen.
STREAM is built for gigabyte-scale DEMs. Because only the visible tiles are resident, size affects the one-time conversion on first open rather than how the terrain feels afterwards.
On first open STREAM converts the source into its native optimized copy: 512 × 512 tiles, overview levels, compressed. That build runs once and shows as a cancellable progress card. Afterwards the renderer reads tiles from the native copy directly, so reopening takes seconds.
No. The source is read through GDAL; STREAM writes its own optimized copy alongside and works from that. Your original file is not rewritten.
Yes. Visible DEMs are bound into a single virtual mosaic — the topmost valid pixel wins and NoData falls through to the layer beneath — and analysis reads that same mosaic the renderer draws. This was a real fix: earlier, some tools only ever read the first DEM.
It is probed for point count, classification, RGB and bounds, then rasterized asynchronously into the same native tile format. You choose the surface: ground points only (class 2, minimum elevation), all points (maximum elevation), or an orthophoto from the point colours.
Because the coarse level stands in until the fine tiles for your focus arrive. Uploads follow camera focus and visibility, decode runs on worker threads under an in-flight limit, and stale requests from a fast move are cancelled rather than queued.
STREAM renders with Vulkan on the GPU. On a laptop with two cards it selects the discrete one itself and records the high-performance preference for the app; you can see the card actually in use under Help ▸ Performance Diagnostics.
No. Everything — conversion, streaming, rendering — runs on your machine. Nothing is uploaded and the data does not leave the computer.
The first valid raster CRS becomes the project CRS. A raster whose CRS does not match is still imported, but it is not drawn into the terrain until the mismatch is resolved — STREAM does not silently guess a transform.
Free beta for Windows x64. Works fully offline with GeoTIFF, LAS/LAZ and DXF.
Download STREAM free