Skip to content

Multi-Aperture Grid Support ​

This document describes the multi-aperture (mixed aperture sequence) grid feature added to WebDggrid.

Overview ​

Multi-aperture grids allow you to specify different apertures for each resolution level, enabling more flexible grid configurations. Instead of using a single aperture value (3, 4, or 7) for all resolution levels, you can define a custom sequence.

Basic Usage ​

Single-Aperture Grid (Traditional) ​

typescript
import { Webdggrid, Topology, Projection } from 'webdggrid';

const dggs = await Webdggrid.load();

// Standard grid with aperture 4 at all resolutions
dggs.setDggs({
  poleCoordinates: { lat: 0, lng: 0 },
  azimuth: 0,
  aperture: 4,
  topology: Topology.HEXAGON,
  projection: Projection.ISEA,
}, 5);

Multi-Aperture Grid (New) ​

typescript
// Mixed aperture sequence: res1=4, res2=3, res3=4, res4=7, res5=4, res6=7
dggs.setDggs({
  poleCoordinates: { lat: 0, lng: 0 },
  azimuth: 0,
  apertureSequence: "434747",  // Each character is the aperture for that resolution
  topology: Topology.HEXAGON,
  projection: Projection.ISEA,
}, 5);

// Use normally
const cells = dggs.nCells(5);
const cellIds = dggs.geoToSequenceNum([[0, 0]], 5);

Constraints and Limitations ​

Topology Restriction ​

  • ✅ HEXAGON topology: Multi-aperture sequences are supported
  • ❌ TRIANGLE topology: Not supported (will throw error)
  • ❌ DIAMOND topology: Not supported (will throw error)

Valid Aperture Values ​

Only three aperture values are allowed in sequences:

  • '3' - Aperture 3 (3 child cells per parent)
  • '4' - Aperture 4 (4 child cells per parent)
  • '7' - Aperture 7 (7 child cells per parent)

Any other character will throw a validation error.

Resolution Limits ​

The maximum resolution is limited by the length of the aperture sequence string:

typescript
// Sequence length is 6, so maximum resolution is 6
apertureSequence: "434747"  // res 1-6 are valid

// Attempting resolution 7 will throw an error
dggs.nCells(7);  // ❌ Error: Resolution exceeds sequence length

Addressing System Restrictions ​

Multi-aperture grids have the following addressing limitations:

  • ❌ SEQNUM (sequence number) operations are not supported
    • geoToSequenceNum(), sequenceNumToGeo() will fail
    • This is a DGGRID library limitation
  • ❌ Z3/Z7 hierarchical indexing is not supported
  • ✅ Other addressing systems (GEO, Q2DI, Q2DD, PROJTRI, PLANE) work normally

Validation ​

The implementation includes comprehensive validation at multiple levels:

C++ Level Validation ​

cpp
// Validates in dggrid_transform.cpp buildTransformer()
- Topology must be HEXAGON
- Sequence string must not be empty
- All characters must be '3', '4', or '7'
- Resolution must not exceed sequence length

TypeScript Level ​

The TypeScript interface provides type safety and documentation:

typescript
interface IDGGSProps {
    aperture?: 3 | 4 | 5 | 7;  // Optional if apertureSequence is provided
    apertureSequence?: string;  // Optional multi-aperture sequence
    // ...
}

Examples ​

Example 1: Planet Risk Grid ​

typescript
// Replicate PlanetRisk-style grid (aperture 4, then mostly 7)
dggs.setDggs({
  poleCoordinates: { lat: 0, lng: 0 },
  azimuth: 0,
  apertureSequence: "43334777777777777777777",
  topology: Topology.HEXAGON,
  projection: Projection.ISEA,
}, 10);

Example 2: Custom Mixed Grid ​

typescript
// Custom sequence for specific analysis needs
dggs.setDggs({
  poleCoordinates: { lat: 0, lng: 0 },
  azimuth: 0,
  apertureSequence: "733447",
  topology: Topology.HEXAGON,
  projection: Projection.ISEA,
}, 6);

// Compare cell counts at each resolution
for (let res = 1; res <= 6; res++) {
    console.log(`Resolution ${res}: ${dggs.nCells(res)} cells`);
}

Example 3: Error Handling ​

typescript
try {
    dggs.setDggs({
        apertureSequence: "425",  // Invalid: '2' is not allowed
        topology: Topology.HEXAGON,
        projection: Projection.ISEA,
    }, 2);
    dggs.nCells(2);
} catch (error) {
    console.error(error.message);
    // "aperture_sequence contains invalid character '2'. Only '3', '4', and '7' are allowed."
}

Testing ​

Multi-Aperture Grid Example ​

This example demonstrates how to use multi-aperture (mixed aperture sequence) grids with WebDggrid.

Running the Example ​

bash
npm run build
node examples/multi-aperture-example.mjs

Example Code ​

See examples/multi-aperture-example.mjs for the complete source code.

Example Output ​

═══════════════════════════════════════════════
  Multi-Aperture Grid Example
═══════════════════════════════════════════════

✓ DGGRID module loaded successfully

1. Standard Single-Aperture Grid (Aperture 4)
   ─────────────────────────────────────────
   Resolution 5:
   - Number of cells: 10,242
   - Cell area: 49811.10 km²

2. Multi-Aperture Grid (Sequence: "434747")
   ─────────────────────────────────────────
   This sequence means:
   - Resolution 1: aperture 4
   - Resolution 2: aperture 3
   - Resolution 3: aperture 4
   - Resolution 4: aperture 7
   - Resolution 5: aperture 4
   - Resolution 6: aperture 7

   Resolution 1 (aperture 4):           42 cells,  12751640.54 km²
   Resolution 2 (aperture 3):          122 cells,   4250546.85 km²
   Resolution 3 (aperture 4):          482 cells,   1062636.71 km²
   Resolution 4 (aperture 7):        3,362 cells,    151805.24 km²
   Resolution 5 (aperture 4):       13,442 cells,     37951.31 km²

3. Coordinate Conversion with Multi-Aperture Grid
   ─────────────────────────────────────────
   Converting geographic coordinates to cell IDs at resolution 5:

   [        0,        0] → Cell ID: 1
   [ -73.9857,  40.7484] → Cell ID: 1118
   [   2.2945,  48.8584] → Cell ID: 6385

4. Generate Cell Geometry (GeoJSON)
   ─────────────────────────────────────────
   Generated GeoJSON for cell 1:
   - Type: FeatureCollection
   - Features: 1
   - Cell vertices: 5 (pentagon)

5. Validation Examples
   ─────────────────────────────────────────
   ✓ Valid: apertureSequence with HEXAGON topology
     Configuration accepted

   ✗ Invalid configurations (validation in C++, error details may be limited)

═══════════════════════════════════════════════
  Example completed successfully!
═══════════════════════════════════════════════

Key Features Demonstrated ​

  1. Standard single-aperture grid - Traditional DGGRID configuration
  2. Multi-aperture grid - Custom aperture sequence "434747" showing different apertures per resolution
  3. Grid statistics - Cell counts and areas at each resolution level
  4. Coordinate conversion - Converting lat/lng coordinates to cell IDs
  5. GeoJSON generation - Creating polygon geometries for visualization
  6. Validation - Examples of valid and invalid configurations

Understanding the Output ​

Cell Count Progression ​

Notice how cell counts increase based on the aperture at each level:

  • Resolution 1 → 2: multiplied by ~2.9x (aperture 3)
  • Resolution 2 → 3: multiplied by ~4.0x (aperture 4)
  • Resolution 3 → 4: multiplied by ~7.0x (aperture 7)
  • Resolution 4 → 5: multiplied by ~4.0x (aperture 4)

Cell Area Reduction ​

Cell areas decrease proportionally at each resolution:

  • Higher apertures = faster refinement
  • Aperture 7 creates the most dramatic area reduction

Pentagon Cells ​

The example shows cell 1 has 5 vertices (pentagon). This is expected - every hexagonal DGGS contains exactly 12 pentagonal cells at the vertices of the underlying icosahedron. These are not errors but fundamental geometric features of tiling a sphere.

Common Use Cases ​

Multi-aperture grids are useful for:

  • Variable detail - High refinement in areas of interest, coarser elsewhere
  • Computational efficiency - Reduce cell count in less important regions
  • Legacy system compatibility - Match existing grid systems like PlanetRisk
  • Hierarchical analysis - Different granularity at different scales

Technical Notes ​

DGGRID Library Integration ​

This feature leverages the DgHexIDGGS::makeRF() factory function from the DGGRID v8 library, which supports the DgApSeq (Aperture Sequence) class for defining mixed aperture grids.

Caching ​

The transformer cache includes aperture sequence information in the cache key, ensuring separate cached transformers for different aperture sequences.

Performance ​

Multi-aperture grids have the same performance characteristics as single-aperture grids once the transformer is built and cached.

References ​

  • Original DGGRID documentation: submodules/DGGRID/documentation/
  • DGGRID meta-file example: submodules/DGGRID/examples/mixedAperture/mixedAperture.meta
  • PlanetRisk grid preset: submodules/DGGRID/examples/planetRisk*/