## @class Geo::OSR
# @brief Base class for projection related classes.
# @details

## @sub @Projections()
# @return list of known projections.

## @sub @Parameters()
# @return list of known projection parameters.

## @sub @LinearUnits()
# @return list of known linear units.

## @sub @AngularUnits()
# @return list of known angular units.

## @sub @Datums()
# @return list of known datums.

## @sub $GetWellKnownGeogCSAsWKT($name)
# @brief Get well known geographic coordinate system as WKT
# @param name a well known name
# @return a WKT string.

## @sub $GetUserInputAsWKT($name)
# @param name the user input
# @return a WKT string.

## @class Geo::OSR::SpatialReference
# @brief A spatial reference system.
# @details <a href="http://www.gdal.org/classOGRSpatialReference.html">Documentation
# of the underlying C++ class at www.gdal.org</a>

## @ignore ImportFromEPSGA
## @ignore ImportFromERM
## @ignore ImportFromMICoordSys
## @ignore ImportFromWkt
## @ignore ImportFromProj4
## @ignore ImportFromESRI
## @ignore ImportFromEPSG
## @ignore ImportFromPCI
## @ignore ImportFromUSGS
## @ignore ImportFromXML
## @ignore ImportFromUrl

## @cmethod Geo::OSR::SpatialReference new(%params)
# Create a new spatial reference object using a named parameter. This
# constructor recognizes the following key words (alternative in
# parenthesis): WKT (Text), Proj4, ESRI, EPSG, EPSGA, PCI, USGS, GML
# (XML), URL, ERMapper (ERM), MapInfoCS (MICoordSys). The value
# depends on the key.
# - WKT: Well Known Text string
# - Proj4: PROJ.4 string
# - ESRI: reference to a list of strings (contents of ESRI .prj file)
# - EPSG: EPSG code number
# - EPSGA: EPSG code number (the resulting CS will have EPSG preferred axis ordering)
# - PCI: listref: [PCI_projection_string, Grid_units_code, [17 cs parameters]]
# - USGS: listref: [Projection_system_code, Zone, [15 cs parameters], Datum_code, Format_flag]
# - GML: GML string
# - URL: URL for downloading the spatial reference from
# - ERMapper: listref: [Projection, Datum, Units]
# - MapInfoCS: MapInfo style coordinate system definition
#
# For more information, consult the import methods in <a href="http://www.gdal.org/classOGRSpatialReference.html">OGR documentation</a>.
#
# @note ImportFrom* methods also exist but are not documented here.
#
# Usage:
# \code
# $sr = Geo::OSR::SpatialReference->new( key => value );
# \endcode
# @return a new Geo::OSR::SpatialReference object

## @method Geo::OSR::SpatialReference Clone()
# Make a duplicate of this SpatialReference object.
# @return a new Geo::OSR::SpatialReference object

## @method Geo::OSR::SpatialReference CloneGeogCS()
# Make a duplicate of the GEOGCS node of this SpatialReference object.
# @return a new Geo::OSR::SpatialReference object

## @ignore AsText
## @ignore ExportToPrettyWkt
## @ignore ExportToProj4
## @ignore ExportToPCI
## @ignore ExportToUSGS
## @ignore ExportToXML
## @ignore ExportToMICoordSys
## @ignore ExportToWkt

## @method Export($format)
# Export the spatial reference to a selected format.
# @note a.k.a. As
#
# @param format One of the following. The return value is explained
# after the format. Other arguments are explained in parenthesis.
# - WKT (Text): Well Known Text string
# - PrettyWKT: Well Known Text string nicely formatted (simplify)
# - Proj4: PROJ.4 string
# - PCI: a list: ($proj_string, $units, [$parms1, ...])
# - USGS: a list: ($code, $zone, [$parms1, ...], $datum)
# - GML (XML): GML based string (dialect)
# - MapInfoCS (MICoordSys): MapInfo style coordinate system definition
#
# @note The named parameter syntax also works and is needed is those
# cases when other arguments need or may be given. The format should
# be given using key as, 'to' or 'format'.
#
# @note ExportTo* and AsText methods also exist but are not documented here.
#
# @return a scalar or a list depending on the export format

## @ignore SetACEA
## @ignore SetAE
## @ignore SetAngularUnits
## @ignore SetAttrValue
## @ignore SetBonne
## @ignore SetCS
## @ignore SetCompoundCS
## @ignore SetEC
## @ignore SetEckertIV
## @ignore SetEckertVI
## @ignore SetEquirectangular
## @ignore SetEquirectangular2
## @ignore SetFromUserInput
## @ignore SetGS
## @ignore SetGaussSchreiberTMercator
## @ignore SetGeocCS
## @ignore SetIGH
## @ignore SetLinearUnits
## @ignore SetLinearUnitsAndUpdateParameters
## @ignore SetNormProjParm
## @ignore SetProjParm
## @ignore SetProjection
## @ignore SetStatePlane
## @ignore SetTargetLinearUnits
## @ignore SetUTM
## @ignore SetVertCS
## @ignore SetWellKnownGeogCS
## @ignore SetAuthority
## @ignore SetCEA
## @ignore SetGEOS
## @ignore SetGH
## @ignore SetGnomonic
## @ignore SetHOM
## @ignore SetHOM2PNO
## @ignore SetKrovak
## @ignore SetLAEA
## @ignore SetLCC
## @ignore SetLCC1SP
## @ignore SetLCCB
## @ignore SetLocalCS
## @ignore SetMC
## @ignore SetMercator
## @ignore SetMollweide
## @ignore SetNZMG
## @ignore SetOS
## @ignore SetOrthographic
## @ignore SetPS
## @ignore SetPolyconic
## @ignore SetRobinson
## @ignore SetSOC
## @ignore SetSinusoidal
## @ignore SetStereographic
## @ignore SetTM
## @ignore SetTMG
## @ignore SetTMSO
## @ignore SetTMVariant
## @ignore SetVDG
## @ignore SetTOWGS84
## @ignore SetGeogCS
## @ignore SetProjCS

## @method Set(%params)
# Set a parameter or parameters in the spatial reference object.
# @param params Named parameters. Recognized keys and respective
# values are the following.
# - Authority: authority name (give also TargetKey, Node and Code)
# - TargetKey:
# - Node: partial or complete path to the target node (Node and Value together sets an attribute value)
# - Code: code for value with an authority
# - Value: value to be assigned to a node, a projection parameter or an object
# - AngularUnits: angular units for the geographic coordinate system (give also Value) (one of Geo::OSR::LinearUnits)
# - LinearUnits: linear units for the target node or the object (give also Value and optionally Node) (one of Geo::OSR::LinearUnits)
# - Parameter: projection parameter to set (give also Value and Normalized) (one of Geo::OSR::Parameters)
# - Normalized: set to true to indicate that the Value argument is in "normalized" form
# - Name: a well known name of a geographic coordinate system (e.g. WGS84)
# - GuessFrom: arbitrary text that specifies a projection ("user input")
# - LOCAL_CS: name of a local coordinate system
# - GeocentricCS: name of a geocentric coordinate system
# - VerticalCS: name of a vertical coordinate system (give also Datum and optionally VertDatumType [default is 2005])
# - Datum: a known (OGC or EPSG) name (or(?) one of Geo::OSR::Datums)
# - CoordinateSystem: 'WGS', 'UTM', 'State Plane', or a user visible name (give optionally also Parameters, Zone, North, NAD83, UnitName, UnitConversionFactor, Datum, Spheroid, HorizontalCS, and/or VerticalCS
# - Parameters: a reference to a list containing the coordinate system or projection parameters
# - Zone: zone for setting up UTM or State Plane coordinate systems (State Plane zone in USGS numbering scheme)
# - North: set false for southern hemisphere
# - NAD83: set false if the NAD27 zone definition should be used instead of NAD83
# - UnitName: to override the legal definition for a zone
# - UnitConversionFactor: to override the legal definition for a zone
# - Spheroid: user visible name
# - HorizontalCS: Horizontal coordinate system name
# - Projection: name of a projection, one of Geo::OSR::Projections (give also optionally Parameters and Variant)
#
# @note Numerous Set* methods also exist but are not documented here.

## @method $IsSame($rs)
# @param rs a Geo::OSR::SpatialReference object
# @return boolean

## @method $IsSameGeogCS($rs)
# @param rs a Geo::OSR::SpatialReference object
# @return boolean

## @method $IsGeographic()
# @return boolean

## @method $IsProjected()
# @return boolean

## @method $IsLocal()
# @return boolean

## @method $IsCompound()
# @return boolean

## @method $IsGeocentric()
# @return boolean

## @method $IsVertical()
# @return boolean

## @method $IsSameVertCS($rs)
# @param rs a Geo::OSR::SpatialReference object
# @return boolean

## @method $GetAttrValue($name, $child = 0)
# @param name
# @param child
# @return string

## @method $GetAngularUnits()
# @return a number

## @method $GetLinearUnits()
# @return a number

## @method $GetLinearUnitsName()
# @return string

## @method $GetAuthorityCode($target_key)
# @param target_key
# @return string

## @method $GetAuthorityName($target_key)
# @param target_key
# @return string

## @method $GetProjParm($name, $default_val = 0.0)
# @param name
# @param default_val
# @return a number

## @method $GetNormProjParm($name, $default_val = 0.0)
# @param name
# @param default_val
# @return a number

## @method CopyGeogCSFrom($rhs)
# @param rhs Geo::OSR::SpatialReference

## @method GetTOWGS84()
# @return array = ($p1, $p2, $p3, $p4, $p5, $p6, $p7)

## @method GetInvFlattening()

## @method GetSemiMinor()

## @method GetSemiMajor()

## @method GetUTMZone()
# Get UTM zone information.
# @return The UTM zone (integer). In scalar context the returned value
# is negative for southern hemisphere zones. In list context returns
# two values ($zone, $north), where $zone is always non-negative and
# $north is true or false.

## @method AutoIdentifyEPSG()
# Set EPSG authority info if possible.

## @method EPSGTreatsAsLatLong()
# Returns TRUE if EPSG feels this geographic coordinate system should be treated as having lat/long coordinate ordering.

## @method Validate()

## @method StripCTParms()

## @method FixupOrdering()

## @method Fixup()

## @method MorphToESRI()

## @method MorphFromESRI()


## @class Geo::OSR::CoordinateTransformation
# @brief An object for transforming from one projection to another.
# @details

## @cmethod Geo::OSR::CoordinateTransformation new($src, $dst)
# @param src a Geo::OSR::SpatialReference object
# @param dst a Geo::OSR::SpatialReference object
# @return a new Geo::OSR::CoordinateTransformation object

## @method \@TransformPoint($x, $y, $z)
# @param x
# @param y
# @param z [optional]
# @return arrayref = [$x, $y, $z]

## @method TransformPoints(arrayref points)
# @param points [in/out] a reference to a list of points (line string
# or ring) that is modified in-place. A list of points is: ([x, y, z],
# [x, y, z], ...), where z is optional. Supports also lists of line
# strings and polygons.
