#  Copyright 2023-2024 Amazon.com, Inc. or its affiliates.

"""This file was generated by xsdata, v23.8, on 2023-10-05 09:59:45

Generator: DataclassGenerator
See: https://xsdata.readthedocs.io/
"""
from dataclasses import dataclass, field
from typing import List, Optional

__NAMESPACE__ = "urn:SFA:1.2.0"


@dataclass
class GeometryType:
    pass


@dataclass
class ParameterType:
    parameter_name: Optional[str] = field(
        default=None,
        metadata={
            "name": "ParameterName",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )
    value: Optional[float] = field(
        default=None,
        metadata={
            "name": "Value",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )


@dataclass
class PrimeMeridianType:
    name: Optional[str] = field(
        default=None,
        metadata={
            "name": "Name",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )
    longitude: Optional[float] = field(
        default=None,
        metadata={
            "name": "Longitude",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )


@dataclass
class ProjectionType:
    projection_name: Optional[str] = field(
        default=None,
        metadata={
            "name": "ProjectionName",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )


@dataclass
class SpheriodType:
    spheriod_name: Optional[str] = field(
        default=None,
        metadata={
            "name": "SpheriodName",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )
    semi_major_axis: Optional[float] = field(
        default=None,
        metadata={
            "name": "SemiMajorAxis",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )
    inverse_flattening: Optional[float] = field(
        default=None,
        metadata={
            "name": "InverseFlattening",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )


@dataclass
class UNITType:
    unit_name: Optional[str] = field(
        default=None,
        metadata={
            "name": "UnitName",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )
    conversion_factor: Optional[float] = field(
        default=None,
        metadata={
            "name": "ConversionFactor",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )


@dataclass
class CurveType(GeometryType):
    pass


@dataclass
class DatumType:
    spheroid: Optional[SpheriodType] = field(
        default=None,
        metadata={
            "name": "Spheroid",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )


@dataclass
class GeometryCollectionType(GeometryType):
    pass


@dataclass
class PointType(GeometryType):
    x: Optional[float] = field(
        default=None,
        metadata={
            "name": "X",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )
    y: Optional[float] = field(
        default=None,
        metadata={
            "name": "Y",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )
    z: Optional[float] = field(
        default=None,
        metadata={
            "name": "Z",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
        },
    )
    m: Optional[float] = field(
        default=None,
        metadata={
            "name": "M",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
        },
    )


@dataclass
class SurfaceType(GeometryType):
    pass


@dataclass
class GeocentricCoordinateSystemType:
    csname: Optional[str] = field(
        default=None,
        metadata={
            "name": "Csname",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )
    datum: Optional[DatumType] = field(
        default=None,
        metadata={
            "name": "Datum",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )
    prime_meridian: Optional[PrimeMeridianType] = field(
        default=None,
        metadata={
            "name": "PrimeMeridian",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )
    linear_unit: Optional[str] = field(
        default=None,
        metadata={
            "name": "LinearUnit",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )


@dataclass
class GeographicCoordinateSystemType:
    csname: Optional[str] = field(
        default=None,
        metadata={
            "name": "Csname",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )
    datum: Optional[DatumType] = field(
        default=None,
        metadata={
            "name": "Datum",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )
    prime_meridian: Optional[PrimeMeridianType] = field(
        default=None,
        metadata={
            "name": "PrimeMeridian",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )
    angular_unit: Optional[str] = field(
        default=None,
        metadata={
            "name": "AngularUnit",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )
    linear_unit: Optional[str] = field(
        default=None,
        metadata={
            "name": "LinearUnit",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
        },
    )


@dataclass
class LineStringType(CurveType):
    vertex: List[PointType] = field(
        default_factory=list,
        metadata={
            "name": "Vertex",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "min_occurs": 2,
        },
    )


@dataclass
class MultiCurveType(GeometryCollectionType):
    pass


@dataclass
class MultiPointType(GeometryCollectionType):
    vertex: List[PointType] = field(
        default_factory=list,
        metadata={
            "name": "Vertex",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "min_occurs": 2,
        },
    )


@dataclass
class MultiSurfaceType(GeometryCollectionType):
    pass


@dataclass
class LineType(LineStringType):
    pass


@dataclass
class LinearRingType(LineStringType):
    pass


@dataclass
class ProjectedCoordinateSystemType:
    csname: Optional[str] = field(
        default=None,
        metadata={
            "name": "Csname",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )
    geographic_coordinate_system: Optional[GeographicCoordinateSystemType] = field(
        default=None,
        metadata={
            "name": "GeographicCoordinateSystem",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )
    projection: Optional[ProjectionType] = field(
        default=None,
        metadata={
            "name": "Projection",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )
    parameter: Optional[ParameterType] = field(
        default=None,
        metadata={
            "name": "Parameter",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
        },
    )
    linear_unit: Optional[str] = field(
        default=None,
        metadata={
            "name": "LinearUnit",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "required": True,
        },
    )


@dataclass
class AbstractReferenceSystemType:
    projected_coordinate_system: Optional[ProjectedCoordinateSystemType] = field(
        default=None,
        metadata={
            "name": "ProjectedCoordinateSystem",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
        },
    )
    geographic_coordinate_system: Optional[GeographicCoordinateSystemType] = field(
        default=None,
        metadata={
            "name": "GeographicCoordinateSystem",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
        },
    )
    geocentric_coordinate_system: Optional[GeocentricCoordinateSystemType] = field(
        default=None,
        metadata={
            "name": "GeocentricCoordinateSystem",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
        },
    )


@dataclass
class MultiLineStringType(MultiCurveType):
    element: List[LineType] = field(
        default_factory=list,
        metadata={
            "name": "Element",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
        },
    )


@dataclass
class PolygonType(SurfaceType):
    ring: List[LinearRingType] = field(
        default_factory=list,
        metadata={
            "name": "Ring",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "min_occurs": 1,
        },
    )


@dataclass
class MultiPolygonType(MultiSurfaceType):
    element: List[PolygonType] = field(
        default_factory=list,
        metadata={
            "name": "Element",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
        },
    )


@dataclass
class PolyhedralSurfaceType(SurfaceType):
    patch: List[PolygonType] = field(
        default_factory=list,
        metadata={
            "name": "Patch",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "min_occurs": 1,
        },
    )


@dataclass
class ReferenceSystemType(AbstractReferenceSystemType):
    axis_name: List[str] = field(
        default_factory=list,
        metadata={
            "name": "AxisName",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "min_occurs": 1,
        },
    )


@dataclass
class TriangleType(PolygonType):
    pass


@dataclass
class TriangulatedIrregularNetworkType(PolyhedralSurfaceType):
    triangular_patch: List[TriangleType] = field(
        default_factory=list,
        metadata={
            "name": "TriangularPatch",
            "type": "Element",
            "namespace": "urn:SFA:1.2.0",
            "min_occurs": 1,
        },
    )
