Source code for pyleotups.utils.Site

__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