MMGIS supports a rich ecosystem of geospatial data formats and layer types designed for planetary science missions. This specification provides a comprehensive reference for all supported layer types, file formats, storage locations, and configuration options available in the MMGIS mapping platform.
The system is built around flexibility, allowing mission teams to integrate diverse data sources—from rover telemetry to orbital imagery—into a unified geospatial interface with both 2D (Leaflet) and 3D (Cesium) rendering capabilities.
MMGIS supports 10 distinct layer types, each optimized for specific data visualization needs:
- Vector - Point, line, and polygon features with rich metadata
- Tile - Hierarchical raster imagery tilesets (TMS/WMTS/WMS)
- Data - WebGL shader-based dynamic visualization from DEM data
- Model - 3D models for Globe view (OBJ, GLTF, DAE)
- Image - Single-band GeoTIFF/COG imagery with dynamic colormaps
- VectorTile - Mapbox Vector Tiles for efficient vector rendering
- Velocity - Flow/wind data visualization (streamlines, particles, arrows)
- Video - Video overlays on the map surface
- Header - Organizational grouping layer (no data rendering)
- Query - Internal layer type for query results
Display GeoJSON point, line, and polygon features with extensive styling and metadata capabilities. Primary layer type for mission annotations, rover paths, science targets, and collaborative drawing.
- Standard GeoJSON specification
- Enhanced GeoJSON with MMGIS-specific properties
- Nested property access via dot notation (e.g.,
properties.metadata.temperature) - Per-feature styling via
properties.styleobject
- STAC Items via
stac-item:URL prefix - STAC Catalogs via
stac-catalog:URL prefix - STAC Collections via
stac-collection:URL prefix - Automatic conversion to GeoJSON features
- Path: Relative or absolute paths to
.geojsonfiles in mission directories - Example:
Missions/MyMission/layers/science_targets.geojson - Access: Direct file serving or through MMGIS tile server
- Format:
geodatasets:{dataset_name} - Backend: PostgreSQL with PostGIS extension
- Tables: Dynamic
g{n}_geodatasetstables with spatial indexing - Features:
- GIST spatial index on geometry column
- Temporal indexing (start_time, end_time)
- Group and feature ID indexing
- JSON properties storage
- Support for all GeoJSON geometry types
- Published Features:
api:publishedall- All published DrawTool features - Intent-Based:
api:published:{intent}where intent is:roi- Regions of Interestcampaign- Campaign boundariescampsite- Campsite locationssignpost- Waypoint markerstrail- Traverse pathsall- All intents
- Specific File:
api:drawn:{file_id}- Specific DrawTool file by ID - Tactical Targets:
api:tacticaltargets- Ingested tactical target data
- Any URL returning valid GeoJSON
- Cross-origin requests supported with CORS
- Optional authentication headers
name(string, required): Display name in UIurl(string, required): Data source URL or pathtype(string, required): Must be"vector"opacity(number, 0-1): Layer opacity, default 1initialVisibility(boolean): Layer visible on load, default false
minZoom(number): Minimum zoom level for visibilitymaxZoom(number): Maximum zoom level for visibilityvisibilityCutoff(number): Features beyond this zoom level are not rendered
Stroke (Lines/Polygon Borders):
strokeColor(string): CSS color or hex, default '#000000'strokeOpacity(number, 0-1): Stroke opacity, default 1strokeWeight(number): Line width in pixels, default 2dashArray(string): SVG dash pattern (e.g., "5, 5" for dashes)
Fill (Polygons):
fillColor(string): CSS color or hex, default '#ffffff'fillOpacity(number, 0-1): Fill opacity, default 0.3
Markers (Points):
radius(number): Circle marker radius in pixels, default 8shape(string): Marker shape -circle,square,triangle,diamond,starsymbol(string): Material Design icon name or custom SVG pathsymbolSize(number): Symbol size multiplier, default 1symbolRotation(number): Symbol rotation in degrees, default 0symbolColor(string): Symbol color override
Per-Feature Styling:
Features can override layer styling via properties.style:
{
"type": "Feature",
"properties": {
"style": {
"fillColor": "#ff0000",
"fillOpacity": 0.7,
"strokeColor": "#000000",
"strokeWeight": 3
}
},
"geometry": {...}
}Time Type:
time.type(string):"global"- Uses application-wide TimeControl"individual"- Layer has independent time controls"requery"- Fetches new data when time changes"local"- Filters existing data client-side
Time Filtering (Local Mode):
time.startProp(string): Path to feature start time property (dot notation supported)time.endProp(string): Path to feature end time property (optional, for ranges)time.format(string): Time format -"unix"(milliseconds) or"ISO"(UTC with 'Z')
Time Requery (Requery Mode):
- URL Placeholders:
{time}- Single time value{starttime}- Start of time range{endtime}- End of time range
time.format(string): strftime format string (e.g.,"%Y-%m-%dT%H:%M:%SZ")
Refresh Intervals:
time.refreshInterval(number): Auto-refresh interval in seconds, default 60
Purpose: Query only features within the current map viewport, enabling server-side spatial filtering for large datasets.
Configuration:
controlled(boolean): Enable dynamic extent mode, default falsecontrolledUrl(string): Base URL for dynamic queries (overridesurl)
URL Parameter Injection: MMGIS automatically injects these parameters into the controlled URL:
{minx},{miny},{maxx},{maxy}- Bounding box coordinates{starttime},{endtime}- Time range (if time-enabled){startprop},{endprop}- Time property names{crscode}- Coordinate reference system code{zoom}- Current zoom level
Move Threshold:
controlledMoveThreshold(number): Minimum map movement (in map units) before re-querying, default varies by zoom level
Labels:
layerAttachments.labels(object):initialVisibility(boolean): Labels visible on loadproperty(string): Feature property to displaycolor(string): Text colorsize(number): Font size in pixelsweight(string): Font weight -"normal","bold"backgroundColor(string): Label background coloroffset(array[2]): Pixel offset [x, y] from feature
Pairings (Cross-Layer Feature Linking):
layerAttachments.pairings(object):layerUUID(string): Target layer UUID to link withprop(string): Property containing pairing IDcolor(string): Pairing line colorweight(number): Pairing line width
Coordinate Markers:
layerAttachments.markers(boolean): Show marker at every coordinate, default false
Uncertainty Ellipses:
layerAttachments.uncertainty(object):initialVisibility(boolean): Ellipses visible on loadellipseMode(string):"2d"or"3d"ellipseProperties(array[6]): Property names for [x, y, z, xx, yy, zz] covariancecolor(string): Ellipse coloropacity(number, 0-1): Ellipse opacity
Images (Feature-Attached Image Overlays):
layerAttachments.images(object):initialVisibility(boolean): Images visible on loadpath(string): Property containing image URLscale(string): Property for image scale factorrotation(string): Property for rotation in degreesopacity(number, 0-1): Image opacity
3D Models (Feature-Attached Models):
layerAttachments.model(object):initialVisibility(boolean): Models visible on loadpath(string): Property containing model file URL (.obj, .gltf)mtl(string): Property containing material file URL (.mtl for OBJ)scale(string): Property for model scale factorrotation(array[3]): Properties for rotation [X, Y, Z] in radians
Path Gradients (Value Visualization Along Paths):
pathAttachments.gradient(object):initialVisibility(boolean): Gradients visible on loadproperty(string): Feature property to visualizecolormap(string): Colormap name (e.g., "viridis", "plasma")min(number): Minimum value for color scalemax(number): Maximum value for color scaleweight(number): Line width in pixels
Bearing Indicators:
markerAttachments.bearing(object):initialVisibility(boolean): Bearing arrows visible on loadangleProp(string): Property containing bearing angle in degreeslengthProp(string): Property for arrow lengthcolor(string): Arrow colorweight(number): Arrow line width
Uncertainty (Point-Specific):
- Same as layerAttachments.uncertainty but applies per-marker
Images (Point-Specific):
- Same as layerAttachments.images but applies per-marker
Models (Point-Specific):
- Same as layerAttachments.model but applies per-marker
Features can be organized into user-toggleable sublayers:
sublayers(array): List of sublayer definitionsname(string): Sublayer display nametype(string): Sublayer type -"labels","pairings","markers","uncertainty","images","models"initialVisibility(boolean): Sublayer visible on loadopacity(number, 0-1): Sublayer opacity
Users can toggle sublayers independently in the Layers Tool interface.
Link features to external CSV datasets:
properties.datasets(array): List of dataset referencesname(string): Dataset display nameurl(string): CSV file URLkey(string): Feature property to match against dataset key column
Link features to external websites or documents:
properties.links(array): List of external linksname(string): Link display nameurl(string): Target URLicon(string): Material Design icon name
Display feature information on startup:
properties.info(object): Startup info configurationshowOnStartup(boolean): Display info panel on loadpriority(number): Display order (lower = higher priority)
Display hierarchical raster imagery tilesets following web map tile standards (TMS, WMTS, WMS). Primary layer type for basemaps, aerial imagery, DEMs rendered as imagery, and time-series satellite data.
- URL Pattern:
/{z}/{x}/{y}.pngor/{z}/{x}/{y}.jpg - Coordinate System: Standard XYZ tiling scheme
- Y-Axis: Y=0 at bottom (South)
- URL Pattern: Same as TMS
- Y-Axis: Y=0 at top (North) - inverted from TMS
- Specification: OGC WMTS 1.0.0
- Protocol: OGC WMS 1.1.1 or 1.3.0
- Parameters:
LAYERS,STYLES,FORMAT,BBOX,SRS/CRS,WIDTH,HEIGHT - Use Case: Professional GIS servers, dynamic rendering
- Prefix:
COG:before tile URL - Format: HTTP range-request enabled GeoTIFF
- Rendering: Server-side tile generation via TiTiler integration
- PNG: Lossless, supports transparency, larger file size
- JPEG: Lossy compression, no transparency, smaller file size
- WebP: Modern format, better compression (browser support required)
- Structure: Hierarchical directories
/{z}/{x}/{y}.{ext} - Location: Mission directories (e.g.,
Missions/MyMission/Layers/Basemap/) - Access: Direct file serving by MMGIS or via tile server
- Option:
throughTileServer: true - Function: MMGIS acts as tile proxy, auto-converts to WMTS
- Benefit: Caching, coordinate transformation, format conversion
- MapServer: Professional OGC-compliant server
- GeoServer: Open-source WMS/WMTS server
- MapTiler: Cloud tile hosting
- Custom APIs: Any server returning valid tile imagery
- Backend: Files stored in
Missions/directory - Access: Through MMGIS backend tile serving APIs
- Configuration: Via mission configuration in database
name(string, required): Display name in UIurl(string, required): Tile URL with {z}, {x}, {y} placeholderstype(string, required): Must be"tile"opacity(number, 0-1): Layer opacity, default 1initialVisibility(boolean): Layer visible on load, default false
minZoom(number): Minimum zoom level, default 0maxZoom(number): Maximum zoom level for tile requests, default 18maxNativeZoom(number): Maximum zoom level with actual tiles (scales beyond this)
Example: If maxNativeZoom: 14 and maxZoom: 18, tiles at zoom 14 are scaled up for zooms 15-18.
bounds(array[4]):[west, south, east, north]in layer CRS- Purpose: Restrict tile requests to specific geographic region
- Benefit: Prevent unnecessary tile requests outside mission area
Time Types:
time.type(string):"global"- Uses application-wide TimeControl"individual"- Independent time slider per layer
Time Placeholders in URL:
{time}- Single time value{starttime}- Start of time range{endtime}- End of time range
Time Format:
time.format(string): strftime format string- Example:
"%Y-%m-%dT%H:%M:%SZ"for ISO 8601 - Example:
"%Y%m%d"for YYYYMMDD - Example:
"%j"for day of year
- Example:
Composited Time Tiles:
time.composited(boolean): Merge sparse time data into single tiles- Use Case: Daily observations with gaps, shown as composite imagery
Refresh Intervals:
time.refreshInterval(number): Auto-refresh interval in seconds for live data
For terrain rendering in Cesium Globe view:
DEM Tile URL:
demtileurl(string): URL to elevation tiles (separate from imagery)- Format: Typically 16-bit PNG or custom binary format
DEM Parser:
demParser(string): Parser type for elevation data"default"- Standard 16-bit PNG (default)"1bto4b"- Custom MMGIS binary DEM format"geotiff"- GeoTIFF elevation tiles
DEM Configuration:
demMaxZoom(number): Maximum zoom for DEM requestsdemZoomLevels(array): Available DEM zoom levelsdemMinResolution(number): Minimum resolution in meters/pixeldemMaxResolution(number): Maximum resolution in meters/pixel
For mission-specific URL parameter substitution:
urlReplacements(object): Key-value pairs for string replacement- Keys wrapped in
{}in URL are replaced with values - Example:
{mission_sol}→"0123"
- Keys wrapped in
throughTileServer(boolean): Proxy through MMGIS tile server, default falsetileFormat(string): Override tile format -"png","jpg","webp"
WebGL shader-based dynamic tile generation from Digital Elevation Model (DEM) data. Provides real-time colorization, hillshading, and data visualization of elevation and derived products with viewport-adaptive rendering.
- Format: Custom binary DEM format optimized for web delivery
- Generation: Via
auxiliary/1bto4b/rasterstotiles1bto4b.pyscript - Structure: Multi-band elevation data with metadata
- Storage: Hierarchical tileset in mission directories
- Location: Mission directories (e.g.,
Missions/MyMission/DEMs/HighRes/) - Structure:
/{z}/{x}/{y}.1bto4bbinary files - Access: Direct file serving, client-side WebGL processing
name(string, required): Display name in UItype(string, required): Must be"data"opacity(number, 0-1): Layer opacity, default 1initialVisibility(boolean): Layer visible on load, default false
data(array, required): Array of DEM tileset objectsname(string): Tileset display namedemtileurl(string): URL pattern for DEM tiles/{z}/{x}/{y}.1bto4bminZoom(number): Minimum zoom for this tilesetmaxZoom(number): Maximum zoom for this tilesetmaxNativeZoom(number): Maximum zoom with actual DEM tiles
Multi-Resolution Support: Define multiple tilesets at different resolutions, MMGIS automatically selects appropriate one per zoom level.
minZoom(number): Minimum zoom level for visibilitymaxZoom(number): Maximum zoom level for requestsmaxNativeZoom(number): Maximum zoom with native data
bounds(array[4]):[west, south, east, north]to restrict rendering area
time.type(string):"global"or"individual"time.format(string): Time format for URL placeholders- URL can include
{time},{starttime},{endtime}placeholders
Shader Type:
shader(string, required): Shader mode"colorize"- Dynamic color ramps with data-driven coloring"image"- Raw data display for testing
Colorize Shader Options:
Color Ramp:
colorRamp(array, required): Array of color stop objectsvalue(number): Data value for this colorcolor(string): CSS color or hextransparent(boolean): Optional, makes this stop transparent
Example Color Ramp:
{
"colorRamp": [
{"value": -100, "color": "#0000ff"},
{"value": 0, "color": "#00ff00"},
{"value": 100, "color": "#ff0000"},
{"value": 200, "color": "transparent", "transparent": true}
]
}Value Range:
range.type(string): Range calculation mode"viewport"- Adaptive range based on visible data (default)"fixed"- Fixed min/max values
range.min(number): Minimum value (fixed mode)range.max(number): Maximum value (fixed mode)
NoData Handling:
noDataValue(number): Value to treat as NoData, default -9999hideNoData(boolean): Hide NoData pixels (transparent), default true
Display Units:
units(string): Unit label for legend (e.g., "meters", "°C")sigfigs(number): Significant figures for value display, default 2
Display 3D models in Cesium Globe view. Used for spacecraft, landers, rovers, scientific instruments, and infrastructure visualization in planetary mission contexts.
- Format: Text-based 3D model format
- Materials: Optional
.mtlmaterial file for textures and colors - Textures: Referenced texture image files (PNG, JPEG)
- Support: Vertices, faces, normals, UV coordinates
- Format: GL Transmission Format (Khronos standard)
- GLB: Binary glTF with embedded textures
- Features: PBR materials, animations, skeletal rigs (animations not yet supported)
- Preferred: Modern format with better compression
- Format: XML-based interchange format
- Support: Basic geometry and materials
- Note: Limited support, OBJ/glTF preferred
- Location: Mission directories (e.g.,
Missions/MyMission/Models/rover.obj) - Textures: Must be in same directory or relative paths in model file
- Access: Direct file serving by MMGIS
name(string, required): Display name in UItype(string, required): Must be"model"url(string, required): Path to model file (.obj, .gltf, .glb, .dae)opacity(number, 0-1): Model opacity, default 1initialVisibility(boolean): Model visible on load, default false
position.longitude(number, required): Longitude in degreesposition.latitude(number, required): Latitude in degreesposition.elevation(number, required): Elevation above surface in meters
rotation.x(number): Rotation around X-axis in radians, default 0rotation.y(number): Rotation around Y-axis in radians, default 0rotation.z(number): Rotation around Z-axis in radians, default 0
Rotation Order: Applied as X → Y → Z Euler angles
scale(number): Uniform scale factor, default 1.0
Example: Scale of 2.0 doubles model size; 0.5 halves it.
mtl(string): Path to.mtlmaterial file if not auto-detected
time.type(string):"global"or"individual"urlcan include{time}placeholder for time-varying models
- Note: Model layers only render in 3D Globe view (Cesium), not in 2D Map (Leaflet)
Models can also be attached to Vector layer point features via markerAttachments.model for dynamic, data-driven model placement.
Display single-band GeoTIFF or Cloud Optimized GeoTIFF (COG) raster images with dynamic colormap application and value rescaling. Ideal for scientific data visualization (temperature, elevation, spectral bands, derived products).
- Bands: Single-band only
- Georeferencing: Must include geotransform or GCPs
- Data Types: 8-bit, 16-bit, 32-bit integer or float
- Compression: Any GeoTIFF-supported compression
- Format: GeoTIFF with internal tiling and overviews
- Access: Supports HTTP range requests for efficient streaming
- Benefit: Fast visualization without downloading entire file
- Validation: Should pass
rio cogeo validate
- Location: Mission directories or absolute paths
- Access: Direct file serving
- Protocol: HTTP/HTTPS
- Requirement: Must support range requests for COG
- CORS: Cross-origin requests must be enabled if external
name(string, required): Display name in UItype(string, required): Must be"image"url(string, required): Path to GeoTIFF/COG fileopacity(number, 0-1): Layer opacity, default 1initialVisibility(boolean): Layer visible on load, default false
minZoom(number): Minimum zoom level for visibilitymaxZoom(number): Maximum zoom levelmaxNativeZoom(number): Maximum zoom with native image data
bounds(array[4]):[west, south, east, north]- usually auto-detected from GeoTIFF
Enable Transformation:
transformCOG(boolean): Enable on-the-fly rescaling and recoloring, default false
Pixel Value Range:
cogMin(number): Minimum pixel data value to displaycogMax(number): Maximum pixel data value to display- Purpose: Rescale pixel values to this range before colormap application
Colormap Selection:
colormap(string): Colormap name from intersection of:- TiTiler colormaps:
viridis,plasma,inferno,magma,cividis,turbo, etc. - js-colormaps: Additional scientific colormaps
- TiTiler colormaps:
- See: TiTiler documentation for full list
Fill Behavior:
fillMin(boolean): Fill pixels belowcogMinwith first colormap color, default falsefillMax(boolean): Fill pixels abovecogMaxwith last colormap color, default false
NoData Handling:
hideNoData(boolean): Make NoData pixels transparent, default true- NoData Value: Auto-detected from GeoTIFF metadata
Display Units:
units(string): Unit label for legend (e.g., "Kelvin", "mGal")
- Requirement: TiTiler service must be running (configure via
WITH_TITILER=truein .env) - Endpoint: TiTiler handles COG parsing, rescaling, and colormap application
- Performance: Server-side processing reduces client load
Display Mapbox Vector Tiles (MVT) in Protocol Buffer (PBF) format. Provides efficient rendering of large vector datasets with client-side styling. Ideal for massive point clouds, global administrative boundaries, road networks, and dense feature collections.
- Specification: Mapbox Vector Tile Specification v2.1
- Format: Binary protocol buffer encoding
- Structure: Tiled vector data with layers, features, and properties
- Efficiency: Highly compressed, fast parsing, client-side rendering
- Structure:
/{z}/{x}/{y}.pbfor/{z}/{x}/{y}.mvt - Location: Mission directories
- Generation: Via tools like
tippecanoe,ogr2ogr, or custom scripts
- Format:
geodatasets:{dataset_name} - Backend: MMGIS generates MVT tiles dynamically from PostGIS
- Function:
ST_AsMVT()for on-the-fly tile generation
- MapTiler: Cloud-hosted vector tiles
- MapLibre: Self-hosted vector tile server
- Custom APIs: Any server returning MVT/PBF tiles
name(string, required): Display name in UItype(string, required): Must be"vectortile"url(string, required): Tile URL with {z}/{x}/{y} placeholdersopacity(number, 0-1): Layer opacity, default 1initialVisibility(boolean): Layer visible on load, default false
minZoom(number): Minimum zoom level, default 0maxZoom(number): Maximum zoom level for tile requests, default 18maxNativeZoom(number): Maximum zoom level with actual vector tiles
- Styling Options: Similar to vector layer styling
strokeColor,strokeOpacity,strokeWeightfillColor,fillOpacityradius(for point features)
Note: Vector tile styling is applied to all features in tile. Per-feature styling not supported.
- Client-Side Rendering: Features rendered as canvas/WebGL, not DOM elements
- Reduced Data Transfer: Binary PBF format is highly compressed
- No Feature Limit: Can efficiently display millions of features
- Smooth Zoom: Features re-rendered at each zoom level from vector data
Visualize velocity, flow, wind, or current data with animated effects. Supports multiple visualization types: streamlines, particles, arrows, and wind barbs. Used for atmospheric data, ocean currents, rover traverse planning, and dynamic environmental visualization.
- Format: Standard GeoJSON with velocity vector properties
- Properties Required:
uoreastward- Eastward velocity componentvornorthward- Northward velocity componentmagnitude(optional) - Velocity magnitudedirection(optional) - Direction in degrees
- Format: JSON representation of GRIB meteorological data
- Source: Converted from GRIB2 files via custom tools
- Use Case: Professional atmospheric modeling data
- Format: Multi-band GeoTIFF with U and V components
- Band 1: Eastward velocity (U)
- Band 2: Northward velocity (V)
- Protocol: Custom velocity data server API
- Endpoint: Returns velocity data in JSON format
- Query Parameters: Bounding box, time range, resolution
- Location: Mission directories for GeoJSON/GeoTIFF
- Access: Direct file serving
- Remote Server: Dedicated velocity data server
- API: RESTful interface with spatial/temporal queries
- Any URL: Returning GeoJSON, GribJSON, or GeoTIFF velocity data
name(string, required): Display name in UItype(string, required): Must be"velocity"url(string, required): Data source URLopacity(number, 0-1): Layer opacity, default 1initialVisibility(boolean): Layer visible on load, default false
kind(string, required): Visualization type"streamlines"- Animated flow lines (uses leaflet-velocity)"particles"- Single-direction particle effects (uses Leaflet.Rain)"arrows"- Directional arrow vectors (placeholder - not fully implemented)"windbarbs"- Wind barb symbols (placeholder - not fully implemented)
velocityMin(number): Minimum velocity value for color scalevelocityMax(number): Maximum velocity value for color scale
Particle Behavior:
particleAge(number): Maximum age of particles in frames, default 100particleMultiplier(number): Number of particles, default 1/300 of canvas areaframeRate(number): Animation frame rate, default 15 fpslineWidth(number): Streamline width in pixels, default 2
Color Scale:
colorScale(array): Array of color stops for velocity values- Each element:
[value, "color"] - Example:
[[0, "#0000ff"], [10, "#00ff00"], [20, "#ff0000"]]
- Each element:
Behavior:
particleCount(number): Number of concurrent particles, default 100particleSpeed(number): Particle movement speed multiplier, default 1particleSize(number): Particle size in pixels, default 2particleColor(string): Particle color, default "#ffffff"
displayValues(boolean): Show velocity values on hover, default falsedisplayPosition(string): Value label position -"topleft","topright","bottomleft","bottomright"
controlled(boolean): Enable programmatic velocity updates, default false- Use Case: Real-time telemetry feeds, live weather data
minZoom(number): Minimum zoom level for visibilitymaxZoom(number): Maximum zoom level
Display video overlays georeferenced on the map surface. Used for time-lapse visualizations, animated simulations, documentary footage of field sites, and dynamic contextual media.
- Codec: VP8 or VP9 video, Vorbis or Opus audio
- Benefit: Open format, efficient compression, wide browser support
- Preferred: Best balance of quality and compatibility
- Codec: H.264 video, AAC audio
- Compatibility: Universal browser support
- License: May have patent restrictions in some contexts
- Format: Sequence of GIF frames
- Use Case: Simple animations, legacy compatibility
- Limitation: Large file size, limited color palette (256 colors)
- Location: Mission directories (e.g.,
Missions/MyMission/Media/timelapse.webm) - Access: Direct file serving by MMGIS
name(string, required): Display name in UItype(string, required): Must be"video"url(string, required): Path to video fileopacity(number, 0-1): Video opacity, default 1initialVisibility(boolean): Video visible on load, default false
bounds(array[4], required):[west, south, east, north]in layer CRS- Purpose: Define geographic extent of video overlay
Example: Video of field site at lat/lon bounds [137.5, -4.5, 138.0, -4.0]
Autoplay:
autoplay(boolean): Start playback on layer activation, default false
Loop:
loop(boolean): Continuously loop video, default true
Muted:
muted(boolean): Mute audio track, default true
Plays Inline:
playsInline(boolean): Play inline on mobile (no fullscreen), default true
controls(boolean): Show play/pause, progress bar, volume controls, default true
Control Panel:
- Play/Pause button
- Restart button
- Mute/Unmute toggle
- Progress scrubber
minZoom(number): Minimum zoom level for visibilitymaxZoom(number): Maximum zoom level
Organizational grouping layer that contains sublayers of any type. Creates collapsible hierarchies in the Layers Tool UI. Does not render any data itself. Used for mission phase grouping, data category organization, and workspace management.
- Contains: Any number of child layers of any type
- Display: Collapsible folder in Layers Tool
- Toggle: Turning header on/off affects all child layer visibility
- Mission Phases: "Sol 1", "Sol 2", "Sol 3" headers
- Data Categories: "Basemaps", "Science Targets", "Engineering Data"
- Team Workspaces: "Team A Annotations", "Team B Analysis"
name(string, required): Display name for header grouptype(string, required): Must be"header"initialVisibility(boolean): Header expanded on load, default false
Note: Header layers are always initially "on" (checked) - toggling affects child visibility
sublayers(array, required): Array of child layer configurations- Structure: Each element is a full layer configuration object
- Nesting: Headers can contain other headers for multi-level hierarchies
{
"name": "Sol 015",
"type": "header",
"sublayers": [
{
"name": "Basemap Sol 015",
"type": "tile",
"url": "Missions/MyMission/Basemaps/Sol015/{z}/{x}/{y}.png"
},
{
"name": "Science Targets Sol 015",
"type": "vector",
"url": "Missions/MyMission/Annotations/sol015_targets.geojson"
}
]
}Special internal vector layer type for displaying spatial query results. Automatically managed by MMGIS query tools (Query Tool, spatial selection, buffer operations). Not manually configured by users.
- Created: When user performs spatial query
- Populated: With query result features
- Cleared: When new query is executed or tool is closed
- Type: Rendered as vector layer
- Styling: Uses query tool's default styling
- Interaction: Features are selectable and display properties
Query layers are created programmatically and do not appear in mission configuration files. Styling is controlled via query tool configuration.
Location: Missions/{mission_name}/ directory structure
Advantages:
- Simple deployment, no database required
- Version control friendly (Git-trackable)
- Fast read access for small to medium datasets
- Easy manual editing and inspection
Structure:
Missions/
MyMission/
Layers/
Basemap/
{z}/
{x}/
{y}.png
Annotations/
science_targets.geojson
DEMs/
HighRes/
{z}/
{x}/
{y}.1bto4b
Models/
rover.obj
rover.mtl
textures/
rover_diffuse.png
Media/
timelapse.webm
Access: Direct file serving by MMGIS Express server or through tile server proxy
Database: PostgreSQL with PostGIS spatial extension
Tables: Dynamic g{n}_geodatasets tables where {n} is geodataset index
Schema:
CREATE TABLE g1_geodatasets (
id SERIAL PRIMARY KEY,
file_id INTEGER NOT NULL,
feature_id INTEGER,
group_id INTEGER,
properties JSONB,
geometry GEOMETRY(Geometry, 4326),
start_time TIMESTAMPTZ,
end_time TIMESTAMPTZ,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_geometry ON g1_geodatasets USING GIST (geometry);
CREATE INDEX idx_start_time ON g1_geodatasets (start_time);
CREATE INDEX idx_end_time ON g1_geodatasets (end_time);
CREATE INDEX idx_file_id ON g1_geodatasets (file_id);
CREATE INDEX idx_feature_id ON g1_geodatasets (feature_id);
CREATE INDEX idx_group_id ON g1_geodatasets (group_id);Advantages:
- Efficient spatial queries (ST_Intersects, ST_Contains, etc.)
- Temporal indexing for time-series data
- ACID compliance for concurrent edits
- Scalable to millions of features
- Dynamic tile generation (MVT)
Access: Via geodatasets:{name} URL format in layer configuration
Management: Through "Manage Geodatasets" UI in Configure page
Supported Layer Types: Vector, VectorTile
Type: Local file storage in Missions/ directory
Configuration: Automatic based on mission name
Directory Structure:
Missions/
{mission_name}/
Data/ # Geodata files (GeoTIFF, GeoJSON, etc.)
Layers/ # Layer configuration
public/ # Public web-accessible files
Use Cases:
- User file uploads (Draw Tool attachments, mission assets)
- Large raster datasets
- Vector data files (GeoJSON, shapefiles)
- Mission-specific configuration files
Access: Through MMGIS backend APIs (/api/files/upload, /api/files/download)
Advantages:
- Scalable object storage
- S3-compatible (easy migration to AWS/GCP)
- Built-in redundancy and versioning
- Reduces local filesystem load
Supported Protocols:
- HTTP/HTTPS: Direct file access with CORS support
- WMS: OGC Web Map Service
- WMTS: OGC Web Map Tile Service
- TMS: Tile Map Service
- STAC: SpatioTemporal Asset Catalog API
- Custom APIs: RESTful geospatial data endpoints
Authentication:
- Public: No authentication required
- API Keys: Passed via URL parameters or custom headers
- OAuth: Token-based authentication (configured per endpoint)
Advantages:
- Leverage external data sources (NASA PDS, USGS, mission archives)
- No local storage required
- Always up-to-date data
- Centralized data management
Considerations:
- Network latency affects performance
- Requires internet connectivity or VPN
- CORS must be enabled on remote servers for browser access
MMGIS provides sophisticated time support across multiple layer types with four distinct time modes.
- Behavior: Layer uses application-wide TimeControl
- UI: Single time slider controls all global time layers
- Synchronization: All global layers update together
- Use Case: Mission-wide temporal coordination (e.g., all Sol 15 data)
- Behavior: Layer has independent time controls
- UI: Per-layer time slider in Layers Tool
- Independence: Does not affect other layers' time
- Use Case: Comparing data from different time periods
- Behavior: Fetches new data when time changes
- Mechanism: URL placeholders replaced with time values
- Server-Side: Server filters/generates data for requested time
- Use Case: Large datasets, dynamic tile generation, APIs
- Behavior: Filters existing data client-side
- Mechanism: Feature properties evaluated against time range
- Performance: Instant filtering, no network requests
- Use Case: Pre-loaded datasets with temporal properties
Used in layer URLs for requery mode:
Single Time:
{time}: Current time value formatted pertime.format
Time Range:
{starttime}: Start of time range{endtime}: End of time range
Property Names (for dynamic extent):
{startprop}: Name of feature start time property{endprop}: Name of feature end time property
Strftime Format (Python/POSIX):
%Y: 4-digit year (e.g., 2024)%m: 2-digit month (01-12)%d: 2-digit day (01-31)%H: 2-digit hour (00-23)%M: 2-digit minute (00-59)%S: 2-digit second (00-59)%j: Day of year (001-366)%Y-%m-%dT%H:%M:%SZ: ISO 8601 format
Special Formats:
"unix": Unix timestamp in milliseconds"ISO": ISO 8601 with 'Z' suffix (UTC)
Example URL:
https://tiles.example.com/{z}/{x}/{y}/{time}.png
With time.format: "%Y%m%d" becomes:
https://tiles.example.com/10/512/384/20240315.png
Property Paths:
time.startProp: Path to feature start time propertytime.endProp: Path to feature end time property (optional)
Dot Notation for nested properties:
"time.startProp": "properties.observation.timestamp"
Property Value Formats:
- Unix Timestamps: Milliseconds since epoch (as number)
- ISO Strings: UTC with 'Z' suffix (e.g., "2024-03-15T14:30:00Z")
Range Filtering:
- If only
startPropspecified: Feature visible ifstartProp <= currentTime - If both specified: Feature visible if
startProp <= currentTime <= endProp
Purpose: Auto-reload layer data at regular intervals for live-updating sources
Configuration:
time.refreshInterval: Interval in seconds, default 60
Use Cases:
- Live telemetry feeds
- Weather data updates
- Mission operations dashboards
- Real-time rover tracking
Behavior:
- Timer starts when layer is enabled
- Pauses when layer is disabled
- Resets on manual time change
For optimal performance across zoom levels, configure multiple DEM/tile sources:
{
"name": "Global Elevation",
"type": "data",
"data": [
{
"name": "Low Resolution (Global)",
"demtileurl": "Missions/Mars/DEMs/Global/{z}/{x}/{y}.1bto4b",
"minZoom": 0,
"maxZoom": 8,
"maxNativeZoom": 8
},
{
"name": "Medium Resolution (Regions)",
"demtileurl": "Missions/Mars/DEMs/Regional/{z}/{x}/{y}.1bto4b",
"minZoom": 9,
"maxZoom": 14,
"maxNativeZoom": 14
},
{
"name": "High Resolution (Sites)",
"demtileurl": "Missions/Mars/DEMs/HighRes/{z}/{x}/{y}.1bto4b",
"minZoom": 15,
"maxZoom": 20,
"maxNativeZoom": 18
}
]
}MMGIS automatically selects appropriate tileset based on current zoom level.
Combine time and spatial filtering for efficient large dataset queries:
{
"name": "Rover Telemetry",
"type": "vector",
"controlled": true,
"controlledUrl": "https://api.example.com/telemetry?bbox={minx},{miny},{maxx},{maxy}&start={starttime}&end={endtime}",
"time": {
"type": "global",
"format": "%Y-%m-%dT%H:%M:%SZ"
}
}Server receives both spatial and temporal parameters for optimized queries.
Use nested headers for complex mission structures:
{
"name": "Mission Operations",
"type": "header",
"sublayers": [
{
"name": "Sol 015",
"type": "header",
"sublayers": [
{
"name": "Basemap Sol 015",
"type": "tile",
"url": "..."
},
{
"name": "Rover Path Sol 015",
"type": "vector",
"url": "..."
}
]
},
{
"name": "Sol 016",
"type": "header",
"sublayers": [...]
}
]
}Combine multiple attachment types for comprehensive visualization:
{
"name": "Rover Waypoints",
"type": "vector",
"url": "Missions/Mars/Waypoints/waypoints.geojson",
"layerAttachments": {
"labels": {
"initialVisibility": true,
"property": "name",
"color": "#ffffff",
"backgroundColor": "#000000aa"
},
"uncertainty": {
"initialVisibility": true,
"ellipseMode": "2d",
"ellipseProperties": ["cov_x", "cov_y", "cov_z", "cov_xx", "cov_yy", "cov_zz"],
"color": "#ffff00",
"opacity": 0.3
}
},
"markerAttachments": {
"bearing": {
"initialVisibility": true,
"angleProp": "heading",
"lengthProp": "speed",
"color": "#00ff00"
},
"model": {
"initialVisibility": false,
"path": "model_url",
"scale": "model_scale",
"rotation": ["rot_x", "rot_y", "rot_z"]
}
}
}Scientific raster visualization with on-the-fly processing:
{
"name": "Surface Temperature",
"type": "image",
"url": "Missions/Mars/Thermal/surface_temp.tif",
"transformCOG": true,
"cogMin": 180,
"cogMax": 320,
"colormap": "turbo",
"fillMin": true,
"fillMax": true,
"hideNoData": true,
"units": "Kelvin"
}TiTiler service rescales 180-320K range and applies "turbo" colormap.
Flat Files:
Missions/MyMission/Annotations/targets.geojson
/absolute/path/to/data.json
Geodatasets:
geodatasets:science_targets
geodatasets:rover_paths
API Endpoints:
api:publishedall
api:published:roi
api:drawn:42
api:tacticaltargets
STAC:
stac:https://stac.example.com/collections/mars_imagery
stac-item:https://stac.example.com/items/image_001
stac-catalog:https://stac.example.com/catalog.json
Remote:
https://data.example.com/mission/features.geojson
TMS/WMTS:
Missions/MyMission/Basemap/{z}/{x}/{y}.png
https://tiles.example.com/mission/{z}/{x}/{y}.jpg
WMS:
https://wms.example.com/service?SERVICE=WMS&REQUEST=GetMap&LAYERS=basemap&...
COG Tiles:
COG:Missions/MyMission/Imagery/scene.tif
COG:https://data.example.com/cog/scene.tif
Time-Enabled:
Missions/MyMission/Basemap/{z}/{x}/{y}_{time}.png
https://tiles.example.com/{time}/tiles/{z}/{x}/{y}.png
1bto4b DEMs:
Missions/MyMission/DEMs/HighRes/{z}/{x}/{y}.1bto4b
Model Files:
Missions/MyMission/Models/rover.obj
Missions/MyMission/Models/lander.gltf
https://models.example.com/assets/instrument.glb
GeoTIFF/COG:
Missions/MyMission/Rasters/temperature.tif
https://data.example.com/cogs/elevation.tif
PBF Tiles:
Missions/MyMission/VectorTiles/{z}/{x}/{y}.pbf
geodatasets:road_network
https://tiles.example.com/vectors/{z}/{x}/{y}.mvt
GeoJSON:
Missions/MyMission/Velocity/wind.geojson
Veloserver:
https://veloserver.example.com/api/velocity?bbox={bbox}&time={time}
Video Files:
Missions/MyMission/Media/timelapse.webm
https://media.example.com/videos/field_site.mp4
Location: /configure (requires authentication)
Layer Management:
- Add Layer: Click "Add Layer" in Layers tab, select type, fill form
- Edit Layer: Click layer in list, modify properties, save
- Delete Layer: Click delete icon, confirm
- Reorder Layers: Drag layers to change z-index order
- Duplicate Layer: Clone existing layer configuration
JSON Editing:
- Raw Variables: Advanced JSON configuration per layer
- Export: Download entire mission configuration as JSON
- Import: Upload configuration JSON to restore/migrate missions
Location: Managed internally by MMGIS backend
Structure:
{
"msv": 4,
"configuration": {
"projection": {...},
"layers": [
{
"name": "Layer 1",
"type": "vector",
...
},
...
],
"tools": {...},
"time": {...}
}
}Access: Via Configure REST API (/api/configure)
Recommendation: Export mission configurations and store in Git
Benefits:
- Track configuration changes over time
- Collaborative configuration editing
- Rollback to previous configurations
- Branch configurations for testing
Vector Layers:
- Performance: Degrades with >10,000 features on screen
- Optimization: Use VectorTile for large datasets, enable visibility cutoffs
- Best For: <5,000 features per viewport
Tile Layers:
- Performance: Excellent, optimized for web delivery
- Considerations: Tile generation time, storage size
- Best For: Raster basemaps, imagery
Data Layers:
- Performance: GPU-accelerated, real-time shading
- Considerations: WebGL overhead, browser support
- Best For: Dynamic DEM visualization
VectorTile Layers:
- Performance: Excellent, handles millions of features
- Considerations: Tile generation complexity
- Best For: Dense point clouds, large vector datasets
Model Layers:
- Performance: Depends on model complexity (polygon count)
- Optimization: Use LOD (Level of Detail) models
- Best For: <100,000 polygons per model
Image Layers:
- Performance: Good with COG, slower with full GeoTIFF download
- Optimization: Use COG format, TiTiler server-side processing
- Best For: Single-image rasters with colormap needs
Velocity Layers:
- Performance: Animation overhead, GPU-dependent
- Optimization: Limit particle count, reduce frame rate
- Best For: Visual effects, not data-dense visualization
Video Layers:
- Performance: Depends on video codec and size
- Optimization: Use WebM with VP9, reduce resolution
- Best For: <1920x1080 resolution, <60 second loops
- Limit Active Layers: Too many active layers reduce performance
- Use Zoom Cutoffs: Set minZoom/maxZoom to reduce unnecessary rendering
- Geodatasets for Large Vectors: PostGIS spatial indexing improves query speed
- Tile Caching: Enable tile server caching for repeated access
- COG for Rasters: Avoid full GeoTIFF downloads with Cloud Optimized format
- Dynamic Extent: Reduce data transfer for large, sparse datasets
- Simplify Geometries: Pre-process vectors to reduce coordinate counts
- Compress Tiles: Use WebP or optimized PNG/JPEG compression
Layer Access Control:
- Mission-level permissions (read/write)
- User roles (admin, lead, member, viewer)
- Private vs public layer visibility
File Access:
- Mission files served based on user permissions
- API endpoints require valid session cookies
- Geodatasets respect user access levels
GeoJSON Validation:
- Schema validation on geodataset ingestion
- Geometry validation (valid GeoJSON spec)
- Property sanitization (XSS prevention)
URL Validation:
- Layer URLs validated against allowed patterns
- Remote URLs require CORS headers
- API endpoints authenticated
Requirement: Remote tile/data servers must enable CORS for browser access
Headers Required:
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, OPTIONS
Security: Use specific origins instead of * for production
Symptoms: Layer enabled but no features visible
Causes & Solutions:
- Incorrect URL: Verify file path or API endpoint
- Check browser Network tab for 404 errors
- Verify file exists in Missions directory
- Invalid GeoJSON: Use GeoJSON validator
- Check for missing
type,features,geometry - Verify coordinates are [lon, lat] not [lat, lon]
- Check for missing
- Wrong CRS: MMGIS expects EPSG:4326 (WGS84)
- Reproject data to WGS84 before loading
- Features Outside Viewport: Pan/zoom to layer bounds
- Check feature coordinates are in expected range
- Visibility Cutoff: Check minZoom/maxZoom settings
- Adjust zoom cutoffs or zoom to appropriate level
Symptoms: Checkerboard pattern or missing tile squares
Causes & Solutions:
- Incorrect URL Pattern: Verify {z}/{x}/{y} placeholders
- Check tile coordinates match TMS/WMTS convention
- Wrong Max Zoom: Tiles requested beyond available data
- Set
maxNativeZoomto highest available tile zoom
- Set
- CORS Issues: Remote server blocking browser requests
- Add CORS headers on tile server
- Use
throughTileServer: trueto proxy requests
- File Permissions: Tile files not readable by server
- Check file system permissions on Missions directory
Symptoms: Blank tiles where DEM layer should appear
Causes & Solutions:
- Invalid 1bto4b Format: DEM tiles corrupted or wrong format
- Regenerate tiles with correct
rasterstotiles1bto4b.pyscript
- Regenerate tiles with correct
- WebGL Disabled: Browser does not support WebGL
- Check browser console for WebGL errors
- Enable hardware acceleration in browser settings
- Shader Errors: ColorRamp misconfigured
- Verify colorRamp array has valid color stops
- Check value ranges match data values
Symptoms: Time slider changes but layer doesn't update
Causes & Solutions:
- Wrong Time Type: Using "local" but no features match time range
- Verify feature properties contain time values
- Check time property paths are correct
- Time Format Mismatch: URL placeholder not being replaced
- Verify
time.formatmatches expected server format - Check browser Network tab for URL with {time} unreplaced
- Verify
- No Refresh Interval: Data not automatically reloading
- Set
time.refreshIntervalfor live data sources
- Set
Symptoms: Model layer enabled but model not shown in Globe
Causes & Solutions:
- 2D Map Active: Models only render in 3D Globe view
- Switch to Globe panel
- Model Outside Viewport: Model position incorrect
- Verify longitude/latitude are in expected location
- Check elevation value (may be underground or in space)
- Model File Error: OBJ/GLTF file corrupted or invalid
- Check browser console for model loading errors
- Verify .mtl and texture files are accessible (OBJ)
- Scale Too Small/Large: Model rendered but not visible
- Adjust scale factor (try 10, 100, 1000)
Human-Vetted Documentation (in docs/pages/):
Configure/Layers/- Individual layer type documentation pagesConfigure/Formats/- Format specifications (Enhanced GeoJSON, Time Tiles, etc.)Configure/Kinds/- Layer interaction behaviors (click handlers)Configure/SPICE/- SPICE integration for planetary coordinatesConfigure/Projections/- Custom projection configuration (Planetcantile)APIs/GeoDatasets/- Geodataset API referenceAPIs/Backend/- Backend API documentationDataProcessing/- Scripts for tile generation and data preparation
Related Specs:
specs/002-geodata-management-and-tile-serving- Backend architecture for tile serving and geodataset managementspecs/006-dual-map-rendering-engines- How layers are rendered in Leaflet (2D) and Cesium (3D)specs/007-interactive-mapping-tools- Tools that interact with layers (Layers Tool, Identifier Tool, Query Tool)specs/009-layer-and-map-configuration- Layer styling, visibility controls, and legend configuration
{
"name": "Rover Science Targets",
"type": "vector",
"url": "geodatasets:science_targets",
"opacity": 0.9,
"initialVisibility": true,
"minZoom": 8,
"maxZoom": 20,
"visibilityCutoff": 22,
"strokeColor": "#ff0000",
"strokeOpacity": 1,
"strokeWeight": 2,
"fillColor": "#ff0000",
"fillOpacity": 0.4,
"radius": 10,
"time": {
"type": "global",
"startProp": "properties.observation_time",
"format": "unix"
},
"layerAttachments": {
"labels": {
"initialVisibility": true,
"property": "target_name",
"color": "#ffffff",
"size": 14,
"weight": "bold",
"backgroundColor": "#000000cc",
"offset": [0, -15]
},
"uncertainty": {
"initialVisibility": true,
"ellipseMode": "2d",
"ellipseProperties": ["cov_x", "cov_y", "cov_z", "cov_xx", "cov_yy", "cov_zz"],
"color": "#ffff00",
"opacity": 0.3
}
},
"markerAttachments": {
"bearing": {
"initialVisibility": true,
"angleProp": "rover_heading",
"lengthProp": "distance_from_rover",
"color": "#00ff00",
"weight": 2
}
}
}{
"name": "Daily Basemap",
"type": "tile",
"url": "https://tiles.example.com/mission/sol{time}/{z}/{x}/{y}.png",
"opacity": 1,
"initialVisibility": true,
"minZoom": 0,
"maxZoom": 18,
"maxNativeZoom": 16,
"bounds": [137.0, -5.0, 138.0, -4.0],
"demtileurl": "https://tiles.example.com/mission/dem/{z}/{x}/{y}.png",
"demParser": "default",
"time": {
"type": "individual",
"format": "%03d"
},
"throughTileServer": false
}{
"name": "High Resolution Elevation",
"type": "data",
"opacity": 0.8,
"initialVisibility": false,
"minZoom": 10,
"maxZoom": 20,
"shader": "colorize",
"data": [
{
"name": "High Res DEM",
"demtileurl": "Missions/Mars/DEMs/HighRes/{z}/{x}/{y}.1bto4b",
"minZoom": 10,
"maxZoom": 20,
"maxNativeZoom": 18
}
],
"colorRamp": [
{"value": -100, "color": "#2166ac"},
{"value": -50, "color": "#67a9cf"},
{"value": 0, "color": "#f7f7f7"},
{"value": 50, "color": "#ef8a62"},
{"value": 100, "color": "#b2182b"}
],
"range": {
"type": "viewport"
},
"noDataValue": -9999,
"hideNoData": true,
"units": "meters"
}{
"name": "Wind Field",
"type": "velocity",
"url": "https://veloserver.example.com/api/wind",
"opacity": 0.7,
"initialVisibility": false,
"kind": "streamlines",
"velocityMin": 0,
"velocityMax": 30,
"particleAge": 90,
"particleMultiplier": 0.003,
"frameRate": 20,
"lineWidth": 2,
"colorScale": [
[0, "#3288bd"],
[10, "#66c2a5"],
[20, "#fee08b"],
[30, "#d53e4f"]
],
"displayValues": true,
"displayPosition": "topright"
}{
"name": "Mission Data",
"type": "header",
"sublayers": [
{
"name": "Basemaps",
"type": "header",
"sublayers": [
{
"name": "Global Basemap",
"type": "tile",
"url": "Missions/Mars/Basemaps/Global/{z}/{x}/{y}.png",
"maxNativeZoom": 10
},
{
"name": "High Resolution Site",
"type": "tile",
"url": "Missions/Mars/Basemaps/HighRes/{z}/{x}/{y}.png",
"minZoom": 11,
"maxNativeZoom": 18
}
]
},
{
"name": "Science Data",
"type": "header",
"sublayers": [
{
"name": "Observations",
"type": "vector",
"url": "geodatasets:observations"
},
{
"name": "Samples",
"type": "vector",
"url": "geodatasets:samples"
}
]
}
]
}Version: 1.0 Date: 2025-12-22 Status: Active
Changes:
- Initial comprehensive reference specification
- Documented all 10 layer types
- Comprehensive configuration options for all layer types
- Storage architecture reference
- Time-enabled layers deep dive
- Performance and security considerations
- Troubleshooting guide
- Complete configuration examples