Skip to content
Snippets Groups Projects
metadata.py 4.65 KiB
#!/home/oper/py39env/bin/python
import cgi
import json
import os
import sys

# Print headers
print("Content-Type: application/json")
print()  # Empty line after headers

# Get script directory
script_dir = os.path.dirname(os.path.abspath(__file__))

# Satellite ID mappings
SATELLITE_ID_MAPPINGS = {
    'G16': 'G16', 'g16': 'G16',
    'G18': 'G18', 'g18': 'G18',
    'G19': 'G19', 'g19': 'G19',
    'DMSP-17': 'DMSP-17', 'dmsp17': 'DMSP-17',
    'DMSP-18': 'DMSP-18', 'dmsp18': 'DMSP-18',
    'DMSP-16': 'DMSP-16', 'dmsp16': 'DMSP-16',
    'NOAA-19': 'NOAA-19', 'n19': 'NOAA-19',
    'NOAA-20': 'NOAA-20', 'n20': 'NOAA-20',
    'NOAA-21': 'NOAA-21', 'n21': 'NOAA-21'
}

try:
    # Define the path to the relationships file
    relationships_file = os.path.join(script_dir, "satellite_relationships.json")
    
    # Check if file exists
    if not os.path.exists(relationships_file):
        print(json.dumps({
            "error": f"Relationships file not found: {relationships_file}",
            "satellites": [],
            "coverages": [],
            "instruments": [],
            "relationships": {}
        }))
        sys.exit(0)
    
    # Load the relationships data
    with open(relationships_file, 'r') as f:
        raw_relationships = json.load(f)
    
    # Create normalized data structure
    normalized_data = {
        "satellites": [],
        "coverages": raw_relationships.get("coverages", []),
        "instruments": raw_relationships.get("instruments", []),
        "relationships": {},
        "satellite_variants": {}
    }
    
    # Group satellites by canonical ID
    satellite_groups = {}
    for sat_id in raw_relationships.get("satellites", []):
        canonical_id = SATELLITE_ID_MAPPINGS.get(sat_id, sat_id)
        
        if canonical_id not in satellite_groups:
            satellite_groups[canonical_id] = []
        
        satellite_groups[canonical_id].append(sat_id)
    
    # Use canonical IDs as the satellite list
    normalized_data["satellites"] = sorted(satellite_groups.keys())
    
    # Store variant mapping
    normalized_data["satellite_variants"] = satellite_groups
    
    # Merge relationships for each canonical ID
    for canonical_id, variants in satellite_groups.items():
        normalized_data["relationships"][canonical_id] = {
            "coverages": [],
            "instruments": [],
            "coverage_instruments": {}
        }
        
        # Merge relationship data from all variants
        for variant_id in variants:
            if variant_id not in raw_relationships.get("relationships", {}):
                continue
                
            original_relationship = raw_relationships["relationships"][variant_id]
            
            # Merge coverages
            for coverage in original_relationship.get("coverages", []):
                if coverage not in normalized_data["relationships"][canonical_id]["coverages"]:
                    normalized_data["relationships"][canonical_id]["coverages"].append(coverage)
            
            # Merge instruments
            for instrument in original_relationship.get("instruments", []):
                if instrument not in normalized_data["relationships"][canonical_id]["instruments"]:
                    normalized_data["relationships"][canonical_id]["instruments"].append(instrument)
            
            # Merge coverage_instruments
            for coverage, instruments in original_relationship.get("coverage_instruments", {}).items():
                if coverage not in normalized_data["relationships"][canonical_id]["coverage_instruments"]:
                    normalized_data["relationships"][canonical_id]["coverage_instruments"][coverage] = []
                
                for instrument in instruments:
                    if instrument not in normalized_data["relationships"][canonical_id]["coverage_instruments"][coverage]:
                        normalized_data["relationships"][canonical_id]["coverage_instruments"][coverage].append(instrument)
        
        # Sort arrays for consistent output
        normalized_data["relationships"][canonical_id]["coverages"].sort()
        normalized_data["relationships"][canonical_id]["instruments"].sort()
        
        for coverage in normalized_data["relationships"][canonical_id]["coverage_instruments"]:
            normalized_data["relationships"][canonical_id]["coverage_instruments"][coverage].sort()
    
    # Return the normalized data
    print(json.dumps(normalized_data))

except Exception as e:
    import traceback
    print(json.dumps({
        "error": str(e),
        "traceback": traceback.format_exc(),
        "satellites": [],
        "coverages": [],
        "instruments": [],
        "relationships": {}
    }))