Skip to content
Snippets Groups Projects
Observatory.py 9.69 KiB
Newer Older
from pydantic import BaseModel, validator
from typing import Dict


class Observatory(BaseModel):
    id: str
    elevation: int
    latitude: float
    longitude: float
    name: str
    agency: str
    agency_name: str = None
    declination_base: int
    sensor_orientation: str = None
    @validator("agency_name", always=True)
    def validate_agency_name(cls, agency_name: str, values: Dict) -> str:
        agency = values.get("agency")
        if not agency_name:
            if agency == "USGS":
                agency_name = "United States Geological Survey (USGS)"
            if agency == "GSC":
                agency_name = "Geological Survey of Canada (GSC)"
            if agency == "BGS":
                agency_name = "British Geological Survey (BGS)"
            if agency == "SANSA":
                agency_name = "South African National Space Agency (SANSA)"
            if agency == "JMA":
                agency_name = "Japan Meteorological Agency (JMA)"
        return agency_name

    @validator("latitude")
    def validate_latitude(cls, latitude: float) -> float:
        if latitude > 90 or latitude < -90:
            raise ValueError(f"latitude ({latitude}) out of range [-90, 90]")
        return latitude

    @validator("longitude")
    def validate_longitude(cls, longitude: float) -> float:
        if longitude > 360 or longitude < -360:
            raise ValueError(f"longitude ({longitude}) out of range [-360, 360]")
        return longitude

    @validator("sensor_orientation", always=True)
    def validate_sensor_orientation(cls, sensor_orientation: str, values: Dict) -> str:
        agency = values.get("agency")
        if not sensor_orientation:
            if agency == "GSC":
                sensor_orientation = "XYZF"
            else:
                sensor_orientation = "HDZF"
        return sensor_orientation
    def to_json(self) -> str:
        return {
            "type": "Feature",
            "id": self.id,
            "properties": {
                "name": self.name,
                "agency": self.agency,
                "agency_name": self.agency_name,
                "sensor_orientation": self.sensor_orientation,
                "sensor_sampling_rate": 0.01,
                "declination_base": self.declination_base,
            },
            "geometry": {
                "type": "Point",
                "coordinates": [self.longitude, self.latitude, self.elevation],
            },
        }


OBSERVATORIES = [
    Observatory(
        id="BDT",
        elevation=1682,
        latitude=40.137,
        longitude=254.763,
        name="Boulder Test",
        agency="USGS",
        declination_base=5527,
    ),
    Observatory(
        id="BOU",
        elevation=1682,
        latitude=40.137,
        longitude=254.763,
        name="Boulder",
        agency="USGS",
        declination_base=5527,
    ),
    Observatory(
        id="TST",
        elevation=1682,
        latitude=40.137,
        longitude=254.763,
        name="Boulder Test (ObsRIO)",
        agency="USGS",
        declination_base=5527,
    ),
    Observatory(
        id="BRW",
        elevation=10,
        name="Barrow",
        agency="USGS",
        declination_base=10589,
    ),
    Observatory(
        id="BRT",
        elevation=10,
        name="Barrow Test (ObsRIO)",
        agency="USGS",
        declination_base=10589,
    ),
    Observatory(
        id="BSL",
        elevation=8,
        latitude=30.35,
        longitude=270.365,
        name="Stennis Space Center",
        agency="USGS",
        declination_base=215772,
    ),
    Observatory(
        id="CMO",
        elevation=197,
        latitude=64.874,
        longitude=212.14,
        name="College",
        agency="USGS",
        declination_base=12151,
    ),
    Observatory(
        id="CMT",
        elevation=197,
        latitude=64.874,
        longitude=212.14,
        name="College (ObsRIO)",
        agency="USGS",
        declination_base=12151,
    ),
    Observatory(
        id="DED",
        elevation=10,
        latitude=70.355,
        longitude=211.207,
        name="Deadhorse",
        agency="USGS",
        declination_base=10755,
    ),
    Observatory(
        id="DHT",
        elevation=10,
        latitude=70.355,
        longitude=211.207,
        name="Deadhorse Test (ObsRIO)",
        agency="USGS",
        declination_base=10755,
    ),
    Observatory(
        id="FRD",
        elevation=69,
        latitude=38.205,
        longitude=282.627,
        name="Fredericksburg",
        agency="USGS",
        declination_base=209690,
    ),
    Observatory(
        id="FRT",
        elevation=69,
        latitude=38.205,
        longitude=282.627,
        name="Fredericksburg Test",
        agency="USGS",
        declination_base=209690,
    ),
    Observatory(
        id="FRN",
        elevation=331,
        latitude=37.091,
        longitude=240.282,
        name="Fresno",
        agency="USGS",
        declination_base=8097,
    ),
    Observatory(
        id="GUA",
        elevation=140,
        latitude=13.588,
        longitude=144.867,
        name="Guam",
        agency="USGS",
        declination_base=764,
    ),
    Observatory(
        id="HON",
        elevation=4,
        latitude=21.316,
        longitude=202.0,
        name="Honolulu",
        agency="USGS",
        declination_base=5982,
    ),
    Observatory(
        id="NEW",
        elevation=770,
        latitude=48.265,
        longitude=242.878,
        name="Newport",
        agency="USGS",
        declination_base=9547,
    ),
    Observatory(
        id="SHU",
        elevation=80,
        latitude=55.348,
        longitude=199.538,
        name="Shumagin",
        agency="USGS",
        declination_base=7386,
    ),
    Observatory(
        id="SIT",
        elevation=24,
        latitude=57.058,
        longitude=224.675,
        name="Sitka",
        agency="USGS",
        declination_base=12349,
    ),
    Observatory(
        id="SJG",
        elevation=424,
        latitude=18.113,
        longitude=293.849,
        name="San Juan",
        agency="USGS",
        declination_base=208439,
    ),
    Observatory(
        id="SJT",
        elevation=424,
        latitude=18.113,
        longitude=293.849,
        name="San Juan Test",
        agency="USGS",
        declination_base=208439,
    ),
    Observatory(
        id="TUC",
        elevation=946,
        latitude=32.174,
        longitude=249.267,
        name="Tucson",
        agency="USGS",
        declination_base=5863,
    ),
    Observatory(
        id="USGS",
        elevation=1682,
        latitude=40.137,
        longitude=254.764,
        name="USGS",
        agency="USGS",
        declination_base=0,
    ),
    Observatory(
        id="BLC",
        elevation=0,
        latitude=64.3,
        longitude=264.0,
        name="Baker Lake",
        agency="GSC",
        declination_base=0,
    ),
    Observatory(
        id="BRD",
        elevation=0,
        latitude=49.6,
        longitude=262.9,
        name="Brandon",
        agency="GSC",
        declination_base=0,
    ),
    Observatory(
        id="CBB",
        elevation=0,
        latitude=69.2,
        longitude=255.0,
        name="Cambridge Bay",
        agency="GSC",
        declination_base=0,
    ),
    Observatory(
        id="EUA",
        elevation=0,
        latitude=55.3,
        longitude=282.3,
        name="Eureka",
        agency="GSC",
        declination_base=0,
    ),
    Observatory(
        id="FCC",
        elevation=0,
        latitude=58.8,
        longitude=265.9,
        name="Fort Churchill",
        agency="GSC",
        declination_base=0,
    ),
    Observatory(
        id="IQA",
        elevation=0,
        latitude=63.8,
        longitude=291.5,
        name="Iqaluit",
        agency="GSC",
        declination_base=0,
    ),
    Observatory(
        id="MEA",
        elevation=0,
        latitude=54.6,
        longitude=246.7,
        name="Meanook",
        agency="GSC",
        declination_base=0,
    ),
    Observatory(
        id="OTT",
        elevation=0,
        latitude=45.4,
        longitude=284.5,
        name="Ottawa",
        agency="GSC",
        declination_base=0,
    ),
    Observatory(
        id="RES",
        elevation=0,
        latitude=74.7,
        longitude=265.1,
        name="Resolute Bay",
        agency="GSC",
        declination_base=0,
    ),
    Observatory(
        id="SNK",
        elevation=0,
        latitude=62.4,
        longitude=245.5,
        name="Sanikiluaq",
        agency="GSC",
        declination_base=0,
    ),
    Observatory(
        id="STJ",
        elevation=0,
        latitude=47.6,
        longitude=307.3,
        name="St Johns",
        agency="GSC",
        declination_base=0,
    ),
    Observatory(
        id="VIC",
        elevation=0,
        latitude=48.6,
        longitude=236.6,
        name="Victoria",
        agency="GSC",
        declination_base=0,
    ),
    Observatory(
        id="YKC",
        elevation=0,
        latitude=62.4,
        longitude=245.5,
        name="Yellowknife",
        agency="GSC",
        declination_base=0,
    ),
    Observatory(
        id="HAD",
        elevation=0,
        latitude=51.0,
        longitude=355.5,
        name="Hartland",
        agency="BGS",
        declination_base=0,
    ),
    Observatory(
        id="HER",
        elevation=0,
        latitude=-34.4,
        longitude=19.2,
        name="Hermanus",
        agency="SANSA",
        declination_base=0,
    ),
    Observatory(
        id="KAK",
        elevation=36,
        latitude=53.77,
        longitude=140.18,
        name="Kakioka",
        agency="JMA",
        declination_base=0,
    ),
]

OBSERVATORY_INDEX = {o.id: o for o in OBSERVATORIES}