__all__ = ['Site']
import numpy as np
from .PaleoData import PaleoData
[docs]
class Site:
"""
Represents a site within a study.
"""
def __init__(self, site_data, study_id):
"""
Initialize a Site instance.
"""
self.site_id = site_data.get('NOAASiteId', np.nan)
self.site_name = site_data.get('siteName', np.nan)
self.location_name = site_data.get('locationName', np.nan)
# ✅ Safely extract geo information
geo = site_data.get('geo', {})
if isinstance(geo, dict):
geometry = geo.get('geometry', {})
coordinates = geometry.get('coordinates', [np.nan, np.nan])
self.lat = coordinates[0] if len(coordinates) > 0 else np.nan
self.lon = coordinates[1] if len(coordinates) > 1 else np.nan
self.geo_type = geo.get('geoType', np.nan)
self.geometry_type = geometry.get('type', np.nan)
properties = (geo or {}).get('properties', {})
self.min_elevation = properties.get('minElevationMeters', np.nan)
self.max_elevation = properties.get('maxElevationMeters', np.nan)
else:
self.lat = np.nan
self.lon = np.nan
self.min_elevation = np.nan
self.max_elevation = np.nan
self.geo_type = np.nan
self.geometry_type = np.nan
properties = (geo or {}).get('properties', {})
self.south_lat = self._safe_float(properties.get('southernmostLatitude', np.nan))
self.north_lat = self._safe_float(properties.get('northernmostLatitude', np.nan))
self.west_lon = self._safe_float(properties.get('westernmostLongitude', np.nan))
self.east_lon = self._safe_float(properties.get('easternmostLongitude', np.nan))
# ✅ Validate paleoData entries
paleo_data_list = site_data.get('paleoData', [])
self.paleo_data = [
PaleoData(paleo, study_id, self.site_id)
for paleo in paleo_data_list
if isinstance(paleo, dict)
]
def _safe_float(self, val):
try:
return float(val)
except (TypeError, ValueError):
return np.nan
[docs]
def to_dict(self):
"""
Convert the site into a list of dictionaries, one per PaleoData file.
"""
site_info = {
"SiteID": self.site_id,
"SiteName": self.site_name,
"LocationName": self.location_name,
"GeoType":self.geo_type,
"GeometryType":self.geometry_type,
"MinLatitude": self.south_lat,
"MaxLatitude": self.north_lat,
"MinLongitude": self.west_lon,
"MaxLongitude": self.east_lon,
"MinElevation": self.min_elevation,
"MaxElevation": self.max_elevation,
}
paleo_data_records = []
for paleo in self.paleo_data:
for file_obj in paleo.files:
paleo_entry = paleo.to_dict(file_obj)
# Merge site info into each paleo record
paleo_entry.update(site_info)
paleo_data_records.append(paleo_entry)
return paleo_data_records