Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
d3ccb31
Add layer generation API improvements without installation changes.
May 22, 2026
24e7ba9
Update STAC generation flow to respect layer sync mode and return gen…
Jun 2, 2026
564165d
Update layer generation mode handling across APIs and return complete…
Jun 2, 2026
9091326
Enrich sync layer-generation API responses with generated STAC hierar…
Jun 2, 2026
00ad0b6
Add stac_status to sync layer-generation response enrichment for clea…
Jun 2, 2026
5a71219
Run STAC auto-trigger synchronously during sync-mode layer generation…
Jun 2, 2026
85e9bb8
Add LayerMapping fallback resolution for STAC auto-trigger when datas…
Jun 2, 2026
b7e07f4
Unify STAC trigger flow and add env-controlled S3 upload behavior.
Jun 2, 2026
b549487
Return existing STAC specs in sync layer-generation responses even wh…
Jun 2, 2026
24a3c2c
Read STAC specs from STACConfig path so sync API responses match gene…
Jun 2, 2026
230f64f
Fix terrain clusters sync mode failing when GEE asset already exists.
Jun 5, 2026
d330c00
Fix sync-mode layer re-runs and STAC auto-trigger across layer tasks.
Jun 5, 2026
7121816
Return terrain descriptor STAC items inline during sync layer generat…
Jun 5, 2026
23344a8
Fix terrain STAC generation using correct terrain_vector layer mapping.
Jun 5, 2026
3b1a0a4
Return admin boundary STAC items inline during sync layer generation.
Jun 5, 2026
43c1f55
Return flat STAC Feature in stac field for single-item layers.
Jun 5, 2026
5ea1b8c
Fix sync-mode STAC to return only the generated layer and use local G…
Jun 8, 2026
b20c6a7
Fix NameError in sync STAC collection by using collect_generated_stac…
Jun 10, 2026
e80f091
Improve LCW sync generation with prerequisite checks and explicit err…
Jun 10, 2026
568f4db
Handle empty LCW conflict blocks and fix GEE export task polling.
Jun 10, 2026
df47868
Return empty stac object in sync responses when no STAC is available.
Jun 10, 2026
9743382
Omit asset_id from sync response when no layer was generated.
Jun 10, 2026
6100279
Align pan-India clip layers with reliable sync GEE export handling.
Jun 10, 2026
7ebd307
Fix LULC v3 sync STAC for multi-year generation.
Jun 10, 2026
30156a4
Fix LULC STAC mapping to use 2-digit GeoServer years and level_3 only.
Jun 10, 2026
b6594dc
Fix generate_swb asset_id to return a flat list like LULC.
Jun 15, 2026
3ba8b21
Add SWB local compute via SYNC_LAYER and fix hydrology period parsing.
Jun 16, 2026
2d4bb4a
Wire change detection APIs to local compute when SYNC_LAYER or comput…
Jun 16, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ DB_PASSWORD=xxxxxxx
# Django settings
DEBUG=xxxxxxx
SECRET_KEY=xxxxxxx
LAYER_GENERATION_SYNC_MODE=False
SYNC_LAYER=False
STAC_UPLOAD_TO_S3=False

USERNAME_GESDISC=xxxxxxx
PASSWORD_GESDISC=xxxxxxx
Expand Down
2 changes: 1 addition & 1 deletion computing/STAC_specs/generate_STAC_for_existing_layers.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ def generate_stac_spec():
},
"terrain_vector": {
"dataset_name": "Terrain Vector",
"layer_name": "dist_block_cluster",
"layer_name": "terrain_vector",
},
"change_in_well_depth_vector": {
"dataset_name": "Hydrology",
Expand Down
33 changes: 27 additions & 6 deletions computing/STAC_specs/stac_collection.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from nrm_app.settings import (
BASE_DIR,
GEOSERVER_PASSWORD,
GEOSERVER_URL,
GEOSERVER_USERNAME,
S3_ACCESS_KEY,
S3_SECRET_KEY,
Expand Down Expand Up @@ -335,32 +336,44 @@ def get_layer_description(self, layer_name, overwrite_metadata=False):
def get_layer_mapping(
self, layer_name, district, block, start_year="", overwrite_metadata=False
):
from utilities.gee_utils import valid_gee_text

path = self.config.layer_map_csv
if os.path.exists(path) and not overwrite_metadata:
df = pd.read_csv(path)
else:
os.makedirs(os.path.dirname(path), exist_ok=True)
df = pd.read_csv(constants.LAYER_MAP_GITHUB_URL)
df.to_csv(path, index=False)
row = df[df["layer_name"] == layer_name].iloc[0]
matches = df[df["layer_name"] == layer_name]
if matches.empty:
log.error(
"No layer_mapping.csv row for layer_name=%s (available: %s)",
layer_name,
sorted(df["layer_name"].dropna().unique().tolist()),
)
return None
row = matches.iloc[0]
gs_layer = row["geoserver_layer_name"]
district_key = valid_gee_text(str(district).lower())
block_key = valid_gee_text(str(block).lower())

if layer_name == "land_use_land_cover_raster":
gs_layer = gs_layer.format(
start_year=str(int(start_year) % 100),
end_year=str((int(start_year) + 1) % 100),
district=district,
block=block,
district=district_key,
block=block_key,
)
elif layer_name in (
"tree_canopy_cover_density_raster",
"tree_canopy_height_raster",
):
gs_layer = gs_layer.format(
start_year=start_year, district=district, block=block
start_year=start_year, district=district_key, block=block_key
)
else:
gs_layer = gs_layer.format(district=district, block=block)
gs_layer = gs_layer.format(district=district_key, block=block_key)

return {
"workspace": _clean_csv_value(row["geoserver_workspace_name"], ""),
Expand Down Expand Up @@ -852,6 +865,11 @@ def build(
overwrite_metadata=overwrite_metadata,
)
log.debug("Resolved layer_map: %s", layer_map)
if layer_map is None:
log.error(
"STAC build aborted: no layer mapping for layer=%s", layer_name
)
return None
item = self._create_item(
state, district, block, layer_name, description, layer_map, **kwargs
)
Expand Down Expand Up @@ -1136,8 +1154,11 @@ def _add_extensions(self, item, layer_map, **kw):
class STACCollectionGenerator:
def __init__(self, config=None):
self.config = config or STACConfig()
geoserver_base_url = (GEOSERVER_URL or "").strip().rstrip("/")
if not geoserver_base_url:
geoserver_base_url = self.config.geoserver_base_url
self.geoserver = GeoServerClient(
self.config.geoserver_base_url,
geoserver_base_url,
username=GEOSERVER_USERNAME,
password=GEOSERVER_PASSWORD,
)
Expand Down
Loading