@startuml
skinparam class {
    BackgroundColor<<master-data>> LightSalmon
    BackgroundColor<<work-product-component>> Gold
    BackgroundColor<<abstract>> LightSteelBlue
    BackgroundColor<<reference-data>> Turquoise
    BackgroundColor<<Abstraction>> LightSkyBlue
    BackgroundColor<<error>> Red
    BackgroundColor<<Activity>> LightSkyBlue
    BackgroundColor<<ReferenceType>> LightSkyBlue
    BackgroundColor<<WorkProductComponent>> LightSkyBlue
    BackgroundColor<<Project>> LightSkyBlue
    BackgroundColor<<Survey>> LightSkyBlue
    BackgroundColor<<Dataset>> LightSkyBlue
    BackgroundColor<<File>> LightSkyBlue
    BackgroundColor<<FileCollection>> LightSkyBlue
    packageStyle rectangle
}
package "SaturationMethodType.1.0.0 Entity" <<rectangle>>
{
abstract class "Abstraction of ReferenceType" <<ReferenceType>>
"Abstraction of ReferenceType" <|-- "SaturationMethodType"
class "SaturationMethodType" <<reference-data>>
   note top of "SaturationMethodType" : Class evaluated\nin this E-R diagram
   abstract class "AbstractReferenceType" <<abstract>>
   abstract class "AbstractAliasNames" <<abstract>>
   class "StandardsOrganisation" <<reference-data>>
   "AbstractAliasNames" --> "1" "StandardsOrganisation" : "DefinitionOrganisationID"
   "StandardsOrganisation" *-- "1" "AbstractReferenceType" : "allOf"
   "AbstractReferenceType" *-- "*" "AbstractAliasNames" : "NameAlias[]"
   class "Organisation" <<master-data>>
   "AbstractAliasNames" --> "1" "Organisation" : "DefinitionOrganisationID"
   abstract class "AbstractMaster" <<abstract>>
   "Organisation" *-- "1" "AbstractMaster" : "allOf"
   "AbstractMaster" *-- "*" "AbstractAliasNames" : "NameAliases[]"
   abstract class "AbstractGeoContext" <<abstract>>
   "AbstractMaster" *-- "*" "AbstractGeoContext" : "GeoContexts[]"
   abstract class "AbstractGeoPoliticalContext" <<abstract>>
   "AbstractGeoContext" *-- "1" "AbstractGeoPoliticalContext" : "oneOf"
   class "GeoPoliticalEntity" <<master-data>>
   "AbstractGeoPoliticalContext" --> "1" "GeoPoliticalEntity" : "GeoPoliticalEntityID"
   "GeoPoliticalEntity" *-- "1" "AbstractMaster" : "allOf"
   abstract class "AbstractSpatialLocation" <<abstract>>
   "AbstractMaster" *-- "1" "AbstractSpatialLocation" : "SpatialLocation"
   class "QuantitativeAccuracyBand" <<reference-data>>
   "AbstractSpatialLocation" --> "1" "QuantitativeAccuracyBand" : "QuantitativeAccuracyBandID"
   "QuantitativeAccuracyBand" *-- "1" "AbstractReferenceType" : "allOf"
   abstract class "AbstractAnyCrsFeatureCollection" <<abstract>>
   "AbstractSpatialLocation" *-- "1" "AbstractAnyCrsFeatureCollection" : "AsIngestedCoordinates"
   class "CoordinateReferenceSystem" <<reference-data>>
   "AbstractAnyCrsFeatureCollection" --> "1" "CoordinateReferenceSystem" : "CoordinateReferenceSystemID"
   "CoordinateReferenceSystem" *-- "1" "AbstractReferenceType" : "allOf"
   "CoordinateReferenceSystem" --> "1" "CoordinateReferenceSystem" : "HorizontalCRSID"
   "CoordinateReferenceSystem" --> "1" "CoordinateReferenceSystem" : "VerticalCRSID"
   class "CoordinateTransformation" <<reference-data>>
   "CoordinateReferenceSystem" --> "1" "CoordinateTransformation" : "TransformationID"
   "CoordinateTransformation" *-- "1" "AbstractReferenceType" : "allOf"
   "CoordinateTransformation" --> "*" "CoordinateTransformation" : "ConcatenatedTransformations[].TransformationID"
   "CoordinateTransformation" --> "1" "CoordinateReferenceSystem" : "SourceCRSID"
   "CoordinateReferenceSystem" --> "1" "CoordinateReferenceSystem" : "BaseCRSID"
   "CoordinateReferenceSystem" --> "1" "CoordinateReferenceSystem" : "SourceCRSID"
   "CoordinateReferenceSystem" --> "1" "CoordinateReferenceSystem" : "TargetCRSID"
   class "UnitOfMeasure" <<reference-data>>
   "CoordinateReferenceSystem" --> "1" "UnitOfMeasure" : "HorizontalAxisUnitID"
   "UnitOfMeasure" *-- "1" "AbstractReferenceType" : "allOf"
   class "UnitQuantity" <<reference-data>>
   "UnitOfMeasure" --> "1" "UnitQuantity" : "UnitQuantityID"
   "UnitQuantity" *-- "1" "AbstractReferenceType" : "allOf"
   "CoordinateReferenceSystem" --> "1" "UnitOfMeasure" : "VerticalAxisUnitID"
   abstract class "AbstractFeatureCollection" <<abstract>>
   "CoordinateReferenceSystem" *-- "1" "AbstractFeatureCollection" : "Wgs84Coordinates"
   "CoordinateTransformation" --> "1" "CoordinateReferenceSystem" : "TargetCRSID"
   "CoordinateTransformation" *-- "1" "AbstractFeatureCollection" : "Wgs84Coordinates"
   "AbstractAnyCrsFeatureCollection" --> "1" "CoordinateReferenceSystem" : "VerticalCoordinateReferenceSystemID"
   "AbstractSpatialLocation" *-- "1" "AbstractFeatureCollection" : "Wgs84Coordinates"
   "GeoPoliticalEntity" *-- "*" "AbstractAliasNames" : "GeoPoliticalEntityNameAliases[]"
   "GeoPoliticalEntity" --> "1" "GeoPoliticalEntity" : "ParentGeoPoliticalEntityID"
   abstract class "AbstractGeoBasinContext" <<abstract>>
   "AbstractGeoContext" *-- "1" "AbstractGeoBasinContext" : "oneOf"
   class "Basin" <<master-data>>
   "AbstractGeoBasinContext" --> "1" "Basin" : "BasinID"
   "Basin" *-- "1" "AbstractMaster" : "allOf"
   "Basin" *-- "*" "AbstractAliasNames" : "BasinNameAliases[]"
   "Basin" --> "1" "Basin" : "ParentBasinID"
   abstract class "AbstractGeoFieldContext" <<abstract>>
   "AbstractGeoContext" *-- "1" "AbstractGeoFieldContext" : "oneOf"
   class "Field" <<master-data>>
   "AbstractGeoFieldContext" --> "1" "Field" : "FieldID"
   "Field" *-- "1" "AbstractMaster" : "allOf"
   "Field" *-- "*" "AbstractAliasNames" : "FieldNameAliases[]"
   abstract class "AbstractGeoPlayContext" <<abstract>>
   "AbstractGeoContext" *-- "1" "AbstractGeoPlayContext" : "oneOf"
   class "Play" <<master-data>>
   "AbstractGeoPlayContext" --> "1" "Play" : "PlayID"
   "Play" *-- "1" "AbstractMaster" : "allOf"
   "Play" *-- "*" "AbstractAliasNames" : "PlayNameAliases[]"
   abstract class "AbstractGeoProspectContext" <<abstract>>
   "AbstractGeoContext" *-- "1" "AbstractGeoProspectContext" : "oneOf"
   class "Prospect" <<master-data>>
   "AbstractGeoProspectContext" --> "1" "Prospect" : "ProspectID"
   "Prospect" *-- "1" "AbstractMaster" : "allOf"
   "Prospect" *-- "*" "AbstractAliasNames" : "ProspectNameAliases[]"
   "Organisation" *-- "*" "AbstractAliasNames" : "OrganisationNameAliases[]"
   "Organisation" --> "1" "Organisation" : "ParentOrganisationID"
   "SaturationMethodType" *-- "1" "AbstractReferenceType" : "allOf"
}
package "Legend"  <<rectangle>> #EEEEEE {
   abstract class "Super Type" <<Abstraction>>
   class MasterDataEntity <<master-data>>
   class WorkProductComponent <<work-product-component>>
   abstract class AbstractEntity <<abstract>>
   "Super Type" <|-- MasterDataEntity
   MasterDataEntity *- "1" AbstractEntity : MasterDataEntity\nis composed of one\nAbstractEntity
   WorkProductComponent *- "*" AbstractEntity : WorkProductComponent\nis composed of many\nAbstractEntities
   MasterDataEntity "1" <-- WorkProductComponent : Relationship\nto one
   class UnspecifiedEntity <<any-group-type>>
   WorkProductComponent --> "*" UnspecifiedEntity: Named relationship\nto many
   class ReferenceEntity << reference-data >>
   WorkProductComponent --> "1" ReferenceEntity: Named relationship\nto one
}
@enduml