Skip to content

feat: Add globe view support for tile traversal#268

Open
espg wants to merge 7 commits intodevelopmentseed:mainfrom
englacial:feat/globe-view
Open

feat: Add globe view support for tile traversal#268
espg wants to merge 7 commits intodevelopmentseed:mainfrom
englacial:feat/globe-view

Conversation

@espg
Copy link

@espg espg commented Feb 26, 2026

Ported from #266.

Summary

  • Implement globe view tile traversal by threading projectTo4326 through the tileset and computing bounding volumes in 3D globe common space via viewport.projectPosition
  • Add _getGlobeBoundingVolume() and sampleReferencePointsInWgs84() for globe-mode bounds conversion in getTileIndices()
  • Fix LOD calculation to use centerLatitude instead of Mercator-specific worldToLngLat()
  • Add 25 new unit tests for tile traversal (bounds, LOD, child ranges, OBB) — up from 1 placeholder test
  • Add a globe-view example demonstrating GlobeView + COGLayer with debug controls

This is in response to the discussion in source-cooperative/source.coop#230, about the possibility of defaulting to a global viewer in the source.coop stac-map viewer.

Closes #82

Test plan

  • All unit tests pass (pnpm test in deck.gl-raster)
  • Run globe-view example with NZ imagery URL — verify tiles render on the globe
  • Run cog-basic example — verify no regression in Mercator rendering

espg added 7 commits February 26, 2026 13:13
Expand __TEST_EXPORTS to expose helper functions (getOverlappingChildRange,
getMetersPerPixel, rescaleEPSG3857ToCommonSpace, sampleReferencePointsInEPSG3857)
and add 21 tests covering:

- computeProjectedTileBounds for WebMercatorQuad and UTM31
- rescaleEPSG3857ToCommonSpace coordinate mapping and clamping
- sampleReferencePointsInEPSG3857 interpolation
- getOverlappingChildRange parent-child tile relationships
- getMetersPerPixel zoom/latitude behavior
- RasterTileNode.insideBounds AABB overlap logic
- RasterTileNode.getBoundingVolume OBB computation (Mercator path)
- RasterTileNode.children quadtree traversal

Establishes regression baseline before globe view changes.
Remove the assert(false, "TODO") blocker in getBoundingVolume() and implement
full globe view support in the tile traversal code:

- Thread projectTo4326 through TileMatrixSetTileset → getTileIndices() →
  RasterTileNode (alongside existing projectTo3857)
- Add _getGlobeBoundingVolume() which samples reference points in WGS84 and
  projects them into globe common space via viewport.projectPosition
- Add sampleReferencePointsInWgs84() helper (parallel to the existing
  sampleReferencePointsInEPSG3857)
- Return centerLatitude from getBoundingVolume() so LOD computation works in
  both Mercator and Globe views without calling worldToLngLat()
- Handle globe-mode bounds conversion in getTileIndices() by projecting WGS84
  bounds corners through the globe project function instead of lngLatToWorld()
- Remove unused assert import

Closes developmentseed#82
Provides a minimal example using deck.gl's GlobeView with COGLayer
for visualizing COG imagery on a 3D globe. Includes a dark background
sphere, debug mesh controls, and commented URLs for both mid-latitude
and polar datasets.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Support for rendering in globe view

1 participant