用于EagleEye3.0 规则集漏报和误报测试的示例项目,项目收集于github和gitee
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1970 lines
65 KiB

#ifndef SQL_GIS_SRS_SRS_H_INCLUDED
#define SQL_GIS_SRS_SRS_H_INCLUDED
// Copyright (c) 2016, 2018, Oracle and/or its affiliates. All rights reserved.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License, version 2.0,
// as published by the Free Software Foundation.
//
// This program is also distributed with certain software (including
// but not limited to OpenSSL) that is licensed under separate terms,
// as designated in a particular file or component or in included license
// documentation. The authors of MySQL hereby grant you an additional
// permission to link the program and your derivative works with the
// separately licensed software that they have included with MySQL.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License, version 2.0, for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#include <cmath>
#include <cstdint>
#include <string>
#include "my_dbug.h"
#include "sql/gis/srid.h"
namespace gis {
namespace srs {
/// Spatial reference system type.
enum class Srs_type : std::uint8_t { UNKNOWN = 0, PROJECTED, GEOGRAPHIC };
/// Projection method. Values are EPSG codes.
enum class Projection_type : std::uint32_t {
UNKNOWN = 0,
POPULAR_VISUALISATION_PSEUDO_MERCATOR = 1024,
LAMBERT_AZIMUTHAL_EQUAL_AREA_SPHERICAL = 1027,
EQUIDISTANT_CYLINDRICAL = 1028,
EQUIDISTANT_CYLINDRICAL_SPHERICAL = 1029,
KROVAK_NORTH_ORIENTATED = 1041,
KROVAK_MODIFIED = 1042,
KROVAK_MODIFIED_NORTH_ORIENTATED = 1043,
LAMBERT_CONIC_CONFORMAL_2SP_MICHIGAN = 1051,
COLOMBIA_URBAN = 1052,
LAMBERT_CONIC_CONFORMAL_1SP = 9801,
LAMBERT_CONIC_CONFORMAL_2SP = 9802,
LAMBERT_CONIC_CONFORMAL_2SP_BELGIUM = 9803,
MERCATOR_VARIANT_A = 9804,
MERCATOR_VARIANT_B = 9805,
CASSINI_SOLDNER = 9806,
TRANSVERSE_MERCATOR = 9807,
TRANSVERSE_MERCATOR_SOUTH_ORIENTATED = 9808,
OBLIQUE_STEREOGRAPHIC = 9809,
POLAR_STEREOGRAPHIC_VARIANT_A = 9810,
NEW_ZEALAND_MAP_GRID = 9811,
HOTINE_OBLIQUE_MERCATOR_VARIANT_A = 9812,
LABORDE_OBLIQUE_MERCATOR = 9813,
HOTINE_OBLIQUE_MERCATOR_VARIANT_B = 9815,
TUNISIA_MINING_GRID = 9816,
LAMBERT_CONIC_NEAR_CONFORMAL = 9817,
AMERICAN_POLYCONIC = 9818,
KROVAK = 9819,
LAMBERT_AZIMUTHAL_EQUAL_AREA = 9820,
ALBERS_EQUAL_AREA = 9822,
TRANSVERSE_MERCATOR_ZONED_GRID_SYSTEM = 9824,
LAMBERT_CONIC_CONFORMAL_WEST_ORIENTATED = 9826,
BONNE_SOUTH_ORIENTATED = 9828,
POLAR_STEREOGRAPHIC_VARIANT_B = 9829,
POLAR_STEREOGRAPHIC_VARIANT_C = 9830,
GUAM_PROJECTION = 9831,
MODIFIED_AZIMUTHAL_EQUIDISTANT = 9832,
HYPERBOLIC_CASSINI_SOLDNER = 9833,
LAMBERT_CYLINDRICAL_EQUAL_AREA_SPHERICAL = 9834,
LAMBERT_CYLINDRICAL_EQUAL_AREA = 9835
};
/// Coordinate axis direction.
enum class Axis_direction : std::uint8_t {
UNSPECIFIED = 0,
NORTH,
SOUTH,
EAST,
WEST,
OTHER
};
/// Superclass for all spatial reference systems.
class Spatial_reference_system {
public:
Spatial_reference_system() = default;
Spatial_reference_system(const Spatial_reference_system &) = default;
Spatial_reference_system(Spatial_reference_system &&) = default;
virtual ~Spatial_reference_system() {}
/**
Get the type of spatial refrence system: projected, geometric,
etc.
@return SRS type
*/
virtual Srs_type srs_type() const = 0;
/**
Clone the object.
@return A new Spatial_reference_system object
*/
virtual Spatial_reference_system *clone() = 0;
/**
Retrieve the axis direction of the spatial
reference system.
@param axis axis number, zero indexed
@return Axis direction
*/
virtual Axis_direction axis_direction(const int axis) const = 0;
/**
Retrieve the angular unit relative to radians.
@return Conversion factor.
*/
virtual double angular_unit() const = 0;
/**
* Retrieve how long the unit of the spatial reference system is in meters.
*
* @return Conversion factor
*/
virtual double linear_unit() const = 0;
/**
Retrieve the prime meridian relative to Greenwich.
The prime meridian is returned in the angular unit of the
SRS. Positive numbers are East of Greenwich.
@see angular_unit
@return Prime meridian.
*/
virtual double prime_meridian() const = 0;
/// Checks if this SRS can be changed to another SRS without causing
/// computational incompatibilities.
///
/// This means checking that all values in the two SRSs that affect
/// computations are the same. The syntax of the SRS definitions may still
/// vary, e.g., by using different names or by having different authority
/// codes.
///
/// In some cases, e.g., unknown projection methods, we don't know how to
/// compare the two SRSs. In that case, we fail by saying that the SRSs are
/// not the same.
///
/// The operation is not commutative. The SRS parameter is allowed to have a
/// TOWGS84 specification even though this object doesn't. The opposite is not
/// necessarily true. If this object lacks TOWGS84 information, transformation
/// operations are forbidden on this SRS. Adding that possibility changes what
/// computations are available, but it doesn't change the result of any
/// computation that can currently be done.
///
/// An SRS that is currently identified as WGS 84 may both add and remove
/// TOWGS84 information as long as the parameters are all 0. Adding a
/// non-all-zero TOWGS84 clause to a WGS 84 SRS is not allowed.
///
/// @param srs The SRS to compare with.
///
/// @retval true The two SRSs are semantically the same.
/// @retval false The two SRSs are semantically different, or we don't know
/// how to compare them.
virtual bool can_be_modified_to(
const Spatial_reference_system &srs) const = 0;
/// Retrieve the proj4 parameter string.
///
/// If the SRS can't be represented as a proj4 parameter string, an empty
/// string is returned.
///
/// @return Proj4 parameter string or empty string.
virtual std::string proj4_parameters() const { return std::string(); }
/// Checks if this SRS has valid Bursa Wolf parameters.
///
/// @retval true Transformation parameters are specified.
/// @retval false Transformation parameters are not specified.
virtual bool has_towgs84() const = 0;
/// Checks if this SRS is WGS 84 or a projection based on WGS 84.
///
/// @retval true This SRS is WGS 84 or a projection of WGS 84.
/// @retval false This SRS is neither WGS 84 or a projection of WGS 84.
virtual bool is_wgs84_based() const = 0;
};
namespace wkt_parser {
struct Geographic_cs;
} // namespace wkt_parser
/// A geographic (longitude-latitude) spatial reference system.
class Geographic_srs : public Spatial_reference_system {
private:
/// Semi-major axis of ellipsoid
double m_semi_major_axis;
/// Inverse flattening of ellipsoid
double m_inverse_flattening;
/// Bursa Wolf transformation parameters used to transform to WGS84.
double m_towgs84[7];
/// Longitude of the prime meridian relative to the Greenwich
/// Meridian (measured in m_angular_unit). Positive values are East
/// of Greenwich.
double m_prime_meridian;
/// Conversion factor for the angular unit relative to radians.
double m_angular_unit;
/// Direction of x and y axis, respectively.
Axis_direction m_axes[2];
/// Whether this SRS is WGS 84.
bool m_is_wgs84;
public:
Geographic_srs()
: m_semi_major_axis(NAN),
m_inverse_flattening(NAN),
m_prime_meridian(NAN),
m_angular_unit(NAN),
m_is_wgs84(false) {
for (double &d : m_towgs84) d = NAN;
for (Axis_direction &d : m_axes) d = Axis_direction::UNSPECIFIED;
}
virtual Srs_type srs_type() const override { return Srs_type::GEOGRAPHIC; }
virtual Spatial_reference_system *clone() override {
return new Geographic_srs(*this);
}
/**
Initialize from parse tree.
@param[in] srid Spatial reference system ID to use when reporting errors
@param[in] g Parser output
@retval true An error has occurred. The error has been flagged.
@retval false Success
*/
virtual bool init(srid_t srid, wkt_parser::Geographic_cs *g);
bool has_towgs84() const override {
// Either none or all parameters are specified.
return !std::isnan(m_towgs84[0]);
}
bool is_wgs84_based() const override { return m_is_wgs84; }
Axis_direction axis_direction(const int axis) const override {
DBUG_ASSERT(axis >= 0 && axis <= 1);
return m_axes[axis];
}
double semi_major_axis() const { return m_semi_major_axis; }
double inverse_flattening() const { return m_inverse_flattening; }
double linear_unit() const override { return 1.0; }
double angular_unit() const override { return m_angular_unit; }
double prime_meridian() const override { return m_prime_meridian; }
bool can_be_modified_to(const Spatial_reference_system &srs) const override;
std::string proj4_parameters() const override;
};
namespace wkt_parser {
struct Projected_cs;
} // namespace wkt_parser
/// A projected spatial reference system.
class Projected_srs : public Spatial_reference_system {
private:
/// The geographic SRS this SRS is projected from.
Geographic_srs m_geographic_srs;
/// Converson factor for the linar unit relative to meters.
double m_linear_unit;
/// Direction of x and y axis, respectively.
Axis_direction m_axes[2];
protected:
/// Checks if the parameters that are common to all projections can safely be
/// modified to another SRS without causing computational differences.
///
/// This function is called by can_be_modified_to() in subclasses to check if
/// the common parameters match. Projected_srs::can_be_modified_to is abstract
/// to avoid that subclasses forget to implement can_be_modified_to().
///
/// @see Spatial_reference_system::can_be_modified_to
///
/// @param srs The SRS to compare with.
///
/// @retval true The common projection parameters are the same in both SRSs.
/// @retval false The two SRSs differ in the common projection parameters.
bool common_proj_parameters_can_be_modified_to(
const Spatial_reference_system &srs) const;
public:
Projected_srs() : m_linear_unit(NAN) {
for (Axis_direction &d : m_axes) d = Axis_direction::UNSPECIFIED;
}
virtual Srs_type srs_type() const override { return Srs_type::PROJECTED; }
/**
Initialize from parse tree.
@param[in] srid Spatial reference system ID to use when reporting errors
@param[in] p Parser output
@retval true An error has occurred. The error has been flagged.
@retval false Success
*/
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p);
/**
Get the map projection method.
@return Projection type
*/
virtual Projection_type projection_type() const = 0;
Axis_direction axis_direction(const int axis) const override {
DBUG_ASSERT(axis >= 0 && axis <= 1);
return m_axes[axis];
}
double linear_unit() const override { return m_linear_unit; }
double angular_unit() const override {
return m_geographic_srs.angular_unit();
}
double prime_meridian() const override {
return m_geographic_srs.prime_meridian();
}
bool has_towgs84() const override { return m_geographic_srs.has_towgs84(); }
bool is_wgs84_based() const override {
return m_geographic_srs.is_wgs84_based();
}
};
/// A projected SRS of an unknown projection type.
///
/// This SRS can be used as any other projected SRS, but since the
/// projection type is unkown, geometries in this SRS can't be
/// transformed to other SRSs.
class Unknown_projected_srs : public Projected_srs {
public:
virtual Spatial_reference_system *clone() override {
return new Unknown_projected_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::UNKNOWN;
}
bool can_be_modified_to(const Spatial_reference_system &) const override {
// We don't know how to compare this SRS with other SRSs.
return false;
}
};
/// A Popular Visualisation Pseudo Mercator projection (EPSG 1024).
class Popular_visualisation_pseudo_mercator_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Popular_visualisation_pseudo_mercator_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Popular_visualisation_pseudo_mercator_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::POPULAR_VISUALISATION_PSEUDO_MERCATOR;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Lambert Azimuthal Equal Area (Spherical) projection (EPSG 1027).
class Lambert_azimuthal_equal_area_spherical_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Lambert_azimuthal_equal_area_spherical_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Lambert_azimuthal_equal_area_spherical_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::LAMBERT_AZIMUTHAL_EQUAL_AREA_SPHERICAL;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// An Equidistant Cylindrical projection (EPSG 1028).
class Equidistant_cylindrical_srs : public Projected_srs {
private:
/// Latitude of the first parallel of intersection between the cone
/// and the ellipsoid (EPSG 8823).
double m_standard_parallel_1;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Equidistant_cylindrical_srs()
: m_standard_parallel_1(NAN),
m_longitude_of_origin(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Equidistant_cylindrical_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::EQUIDISTANT_CYLINDRICAL;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// An Equidistant Cylindrical (Spherical) projection (EPSG 1029).
class Equidistant_cylindrical_spherical_srs : public Projected_srs {
private:
/// Latitude of the first parallel of intersection between the cone
/// and the ellipsoid (EPSG 8823).
double m_standard_parallel_1;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Equidistant_cylindrical_spherical_srs()
: m_standard_parallel_1(NAN),
m_longitude_of_origin(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Equidistant_cylindrical_spherical_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::EQUIDISTANT_CYLINDRICAL_SPHERICAL;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Krovak (North Orientated) projection (EPSG 1041).
class Krovak_north_orientated_srs : public Projected_srs {
private:
/// Latitude of the point at which the azimuth of the central line
/// is defined (EPSG 8811).
double m_latitude_of_center;
/// The meridian along which the northing axis increments and also
/// across which parallels of latitude increment towards the north
/// pole (EPSG 8833).
double m_longitude_of_center;
/// The rotation applied to spherical coordinates, measured on the
/// conformal sphere in the plane of the meridian of origin (EPSG
/// 1036).
double m_azimuth;
/// Latitude of the parallel on which the projection is based. This
/// latitude is not geographic, but is defined on the conformal
/// sphere AFTER its rotation to obtain the oblique aspect of the
/// projection (EPSG 8818).
double m_pseudo_standard_parallel_1;
/// The factor by which the map grid is reduced or enlarged at the
/// pseudo-standard parallel (EPSG 8819).
double m_scale_factor;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Krovak_north_orientated_srs()
: m_latitude_of_center(NAN),
m_longitude_of_center(NAN),
m_azimuth(NAN),
m_pseudo_standard_parallel_1(NAN),
m_scale_factor(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Krovak_north_orientated_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::KROVAK_NORTH_ORIENTATED;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Krovak Modified projection (EPSG 1042).
class Krovak_modified_srs : public Projected_srs {
private:
/// Latitude of the point at which the azimuth of the central line
/// is defined (EPSG 8811).
double m_latitude_of_center;
/// The meridian along which the northing axis increments and also
/// across which parallels of latitude increment towards the north
/// pole (EPSG 8833).
double m_longitude_of_center;
/// The rotation applied to spherical coordinates, measured on the
/// conformal sphere in the plane of the meridian of origin (EPSG
/// 1036).
double m_azimuth;
/// Latitude of the parallel on which the projection is based. This
/// latitude is not geographic, but is defined on the conformal
/// sphere AFTER its rotation to obtain the oblique aspect of the
/// projection (EPSG 8818).
double m_pseudo_standard_parallel_1;
/// The factor by which the map grid is reduced or enlarged at the
/// pseudo-standard parallel (EPSG 8819).
double m_scale_factor;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
/// The first ordinate of the evaluation point (EPSG 8617).
double m_evaluation_point_ordinate_1;
/// The second ordinate of the evaluation point(EPSG 8618).
double m_evaluation_point_ordinate_2;
/// Coefficient C1 used in polynomial transformation (EPSG 1026).
double m_c1;
/// Coefficient C2 used in polynomial transformation (EPSG 1027).
double m_c2;
/// Coefficient C3 used in polynomial transformation (EPSG 1028).
double m_c3;
/// Coefficient C4 used in polynomial transformation (EPSG 1029).
double m_c4;
/// Coefficient C5 used in polynomial transformation (EPSG 1030).
double m_c5;
/// Coefficient C6 used in polynomial transformation (EPSG 1031).
double m_c6;
/// Coefficient C7 used in polynomial transformation (EPSG 1032).
double m_c7;
/// Coefficient C8 used in polynomial transformation (EPSG 1033).
double m_c8;
/// Coefficient C9 used in polynomial transformation (EPSG 1034).
double m_c9;
/// Coefficient C10 used in polynomial transformation (EPSG 1035).
double m_c10;
public:
Krovak_modified_srs()
: m_latitude_of_center(NAN),
m_longitude_of_center(NAN),
m_azimuth(NAN),
m_pseudo_standard_parallel_1(NAN),
m_scale_factor(NAN),
m_false_easting(NAN),
m_false_northing(NAN),
m_evaluation_point_ordinate_1(NAN),
m_evaluation_point_ordinate_2(NAN),
m_c1(NAN),
m_c2(NAN),
m_c3(NAN),
m_c4(NAN),
m_c5(NAN),
m_c6(NAN),
m_c7(NAN),
m_c8(NAN),
m_c9(NAN),
m_c10(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Krovak_modified_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::KROVAK_MODIFIED;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Krovak Modified (North Orientated) projection (EPSG 1043).
class Krovak_modified_north_orientated_srs : public Projected_srs {
private:
/// Latitude of the point at which the azimuth of the central line
/// is defined (EPSG 8811).
double m_latitude_of_center;
/// The meridian along which the northing axis increments and also
/// across which parallels of latitude increment towards the north
/// pole (EPSG 8833).
double m_longitude_of_center;
/// The rotation applied to spherical coordinates, measured on the
/// conformal sphere in the plane of the meridian of origin (EPSG
/// 1036).
double m_azimuth;
/// Latitude of the parallel on which the projection is based. This
/// latitude is not geographic, but is defined on the conformal
/// sphere AFTER its rotation to obtain the oblique aspect of the
/// projection (EPSG 8818).
double m_pseudo_standard_parallel_1;
/// The factor by which the map grid is reduced or enlarged at the
/// pseudo-standard parallel (EPSG 8819).
double m_scale_factor;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
/// The first ordinate of the evaluation point (EPSG 8617).
double m_evaluation_point_ordinate_1;
/// The second ordinate of the evaluation point(EPSG 8618).
double m_evaluation_point_ordinate_2;
/// Coefficient C1 used in polynomial transformation (EPSG 1026).
double m_c1;
/// Coefficient C2 used in polynomial transformation (EPSG 1027).
double m_c2;
/// Coefficient C3 used in polynomial transformation (EPSG 1028).
double m_c3;
/// Coefficient C4 used in polynomial transformation (EPSG 1029).
double m_c4;
/// Coefficient C5 used in polynomial transformation (EPSG 1030).
double m_c5;
/// Coefficient C6 used in polynomial transformation (EPSG 1031).
double m_c6;
/// Coefficient C7 used in polynomial transformation (EPSG 1032).
double m_c7;
/// Coefficient C8 used in polynomial transformation (EPSG 1033).
double m_c8;
/// Coefficient C9 used in polynomial transformation (EPSG 1034).
double m_c9;
/// Coefficient C10 used in polynomial transformation (EPSG 1035).
double m_c10;
public:
Krovak_modified_north_orientated_srs()
: m_latitude_of_center(NAN),
m_longitude_of_center(NAN),
m_azimuth(NAN),
m_pseudo_standard_parallel_1(NAN),
m_scale_factor(NAN),
m_false_easting(NAN),
m_false_northing(NAN),
m_evaluation_point_ordinate_1(NAN),
m_evaluation_point_ordinate_2(NAN),
m_c1(NAN),
m_c2(NAN),
m_c3(NAN),
m_c4(NAN),
m_c5(NAN),
m_c6(NAN),
m_c7(NAN),
m_c8(NAN),
m_c9(NAN),
m_c10(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Krovak_modified_north_orientated_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::KROVAK_MODIFIED_NORTH_ORIENTATED;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Lambert Conic Conformal (2SP Michigan) projection (EPSG 1051).
class Lambert_conic_conformal_2sp_michigan_srs : public Projected_srs {
private:
/// Latitude of the false origin, at which the false easting and
/// northing is defined (EPSG 8821).
double m_latitude_of_origin;
/// Longitude (central meridian) of the false origin, at which the
/// false easting and northing is defined (EPSG 8822).
double m_longitude_of_origin;
/// Latitude of the first parallel of intersection between the cone
/// and the ellipsoid (EPSG 8823).
double m_standard_parallel_1;
/// Latitude of the second parallel of intersection between the cone
/// and the ellipsoid (EPSG 8824).
double m_standard_parallel_2;
/// Easting value assigned to the false origin (EPSG 8826).
double m_false_easting;
/// Northing value assigned to the false origin (EPSG 8827).
double m_false_northing;
/// Ellipsoid scaling factor (EPSG 1038).
double m_ellipsoid_scale_factor;
public:
Lambert_conic_conformal_2sp_michigan_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_standard_parallel_1(NAN),
m_standard_parallel_2(NAN),
m_false_easting(NAN),
m_false_northing(NAN),
m_ellipsoid_scale_factor(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Lambert_conic_conformal_2sp_michigan_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::LAMBERT_CONIC_CONFORMAL_2SP_MICHIGAN;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Colombia Urban projection(EPSG 1052).
class Colombia_urban_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
/// The height of the projection plane at its origin (EPSG 1039).
double m_projection_plane_height_at_origin;
public:
Colombia_urban_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_false_easting(NAN),
m_false_northing(NAN),
m_projection_plane_height_at_origin(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Colombia_urban_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::COLOMBIA_URBAN;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Lambert Conic Conformal (1SP) projection, alias Lambert Conic
/// Conformal or LCC (EPSG 9801).
class Lambert_conic_conformal_1sp_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Multiplier for reducing a distance obtained from a map to the
/// actual distance on the datum of the map (EPSG 8805).
double m_scale_factor;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Lambert_conic_conformal_1sp_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_scale_factor(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Lambert_conic_conformal_1sp_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::LAMBERT_CONIC_CONFORMAL_1SP;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Lambert Conic Conformal (2SP) projection, alias Lambert Conic
/// Conformal or LCC (EPSG 9802).
class Lambert_conic_conformal_2sp_srs : public Projected_srs {
private:
/// Latitude of the false origin, at which the false easting and
/// northing is defined (EPSG 8821).
double m_latitude_of_origin;
/// Longitude (central meridian) of the false origin, at which the
/// false easting and northing is defined (EPSG 8822).
double m_longitude_of_origin;
/// Latitude of the first parallel of intersection between the cone
/// and the ellipsoid (EPSG 8823).
double m_standard_parallel_1;
/// Latitude of the second parallel of intersection between the cone
/// and the ellipsoid (EPSG 8824).
double m_standard_parallel_2;
/// Easting value assigned to the false origin (EPSG 8826).
double m_false_easting;
/// Northing value assigned to the false origin (EPSG 8827).
double m_false_northing;
public:
Lambert_conic_conformal_2sp_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_standard_parallel_1(NAN),
m_standard_parallel_2(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Lambert_conic_conformal_2sp_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::LAMBERT_CONIC_CONFORMAL_2SP;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Lambert Conic Conformal (2SP Belgium) projection (EPSG 9803).
class Lambert_conic_conformal_2sp_belgium_srs : public Projected_srs {
private:
/// Latitude of the false origin, at which the false easting and
/// northing is defined (EPSG 8821).
double m_latitude_of_origin;
/// Longitude (central meridian) of the false origin, at which the
/// false easting and northing is defined (EPSG 8822).
double m_longitude_of_origin;
/// Latitude of the first parallel of intersection between the cone
/// and the ellipsoid (EPSG 8823).
double m_standard_parallel_1;
/// Latitude of the second parallel of intersection between the cone
/// and the ellipsoid (EPSG 8824).
double m_standard_parallel_2;
/// Easting value assigned to the false origin (EPSG 8826).
double m_false_easting;
/// Northing value assigned to the false origin (EPSG 8827).
double m_false_northing;
public:
Lambert_conic_conformal_2sp_belgium_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_standard_parallel_1(NAN),
m_standard_parallel_2(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Lambert_conic_conformal_2sp_belgium_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::LAMBERT_CONIC_CONFORMAL_2SP_BELGIUM;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Mercator (variant A) projection, alias Mercator (EPSG 9804).
class Mercator_variant_a_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Multiplier for reducing a distance obtained from a map to the
/// actual distance on the datum of the map (EPSG 8805).
double m_scale_factor;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Mercator_variant_a_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_scale_factor(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Mercator_variant_a_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::MERCATOR_VARIANT_A;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Mercator (variant B) projection, alias Mercator (EPSG 9805).
class Mercator_variant_b_srs : public Projected_srs {
private:
/// Latitude of the first parallel of intersection between the cone
/// and the ellipsoid (EPSG 8823).
double m_standard_parallel_1;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Mercator_variant_b_srs()
: m_standard_parallel_1(NAN),
m_longitude_of_origin(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Mercator_variant_b_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::MERCATOR_VARIANT_B;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Cassini-Soldner projection, alias Cassini (EPSG 9806).
class Cassini_soldner_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Cassini_soldner_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Cassini_soldner_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::CASSINI_SOLDNER;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Transverse Mercator projection, alias Gauss-Boaga, Gauss-Krüger
/// or TM (EPSG 9807).
class Transverse_mercator_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Multiplier for reducing a distance obtained from a map to the
/// actual distance on the datum of the map (EPSG 8805).
double m_scale_factor;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Transverse_mercator_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_scale_factor(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Transverse_mercator_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::TRANSVERSE_MERCATOR;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Transverse Mercator (South Orientated) projection, alias
/// Gauss-Conform (EPSG 9808).
class Transverse_mercator_south_orientated_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Multiplier for reducing a distance obtained from a map to the
/// actual distance on the datum of the map (EPSG 8805).
double m_scale_factor;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Transverse_mercator_south_orientated_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_scale_factor(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Transverse_mercator_south_orientated_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::TRANSVERSE_MERCATOR_SOUTH_ORIENTATED;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// An Oblique stereographic projection, alias Double stereographic
/// (EPSG 9809).
class Oblique_stereographic_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Multiplier for reducing a distance obtained from a map to the
/// actual distance on the datum of the map (EPSG 8805).
double m_scale_factor;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Oblique_stereographic_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_scale_factor(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Oblique_stereographic_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::OBLIQUE_STEREOGRAPHIC;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Polar Stereographic (variant A) projection (EPSG 9810).
class Polar_stereographic_variant_a_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Multiplier for reducing a distance obtained from a map to the
/// actual distance on the datum of the map (EPSG 8805).
double m_scale_factor;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Polar_stereographic_variant_a_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_scale_factor(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Polar_stereographic_variant_a_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::POLAR_STEREOGRAPHIC_VARIANT_A;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A New Zealand Map Grid projection (EPSG 9811).
class New_zealand_map_grid_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
New_zealand_map_grid_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new New_zealand_map_grid_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::NEW_ZEALAND_MAP_GRID;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Hotine Oblique Mercator (variant A) projection, alias Rectified
/// skew orthomorphic (EPSG 9812).
class Hotine_oblique_mercator_variant_a_srs : public Projected_srs {
private:
/// Latitude of the point at which the azimuth of the central line
/// is defined (EPSG 8811).
double m_latitude_of_center;
/// Longitude of the point at which the azimuth of the central line
/// is defined (EPSG 8812).
double m_longitude_of_center;
/// Direction east of north of the great circle which is the central
/// line (EPSG 8813).
double m_azimuth;
/// Angle at the natural origin through which the natural SRS is
/// rotated to make the projection north axis parallel with true
/// north (EPSG 8814).
double m_rectified_grid_angle;
/// Multiplier for reducing a distance obtained from a map to the
/// actual distance on the datum of the map (EPSG 8815).
double m_scale_factor;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Hotine_oblique_mercator_variant_a_srs()
: m_latitude_of_center(NAN),
m_longitude_of_center(NAN),
m_azimuth(NAN),
m_rectified_grid_angle(NAN),
m_scale_factor(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Hotine_oblique_mercator_variant_a_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::HOTINE_OBLIQUE_MERCATOR_VARIANT_A;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Laborde Oblique Mercator projection (EPSG 9813).
class Laborde_oblique_mercator_srs : public Projected_srs {
private:
/// Latitude of the point at which the azimuth of the central line
/// is defined (EPSG 8811).
double m_latitude_of_center;
/// Longitude of the point at which the azimuth of the central line
/// is defined (EPSG 8812).
double m_longitude_of_center;
/// Direction east of north of the great circle which is the central
/// line (EPSG 8813).
double m_azimuth;
/// Multiplier for reducing a distance obtained from a map to the
/// actual distance on the datum of the map (EPSG 8815).
double m_scale_factor;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Laborde_oblique_mercator_srs()
: m_latitude_of_center(NAN),
m_longitude_of_center(NAN),
m_azimuth(NAN),
m_scale_factor(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Laborde_oblique_mercator_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::LABORDE_OBLIQUE_MERCATOR;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Hotine Oblique Mercator (variant B) projection, alias Rectified
/// skew orthomorphic (EPSG 9815).
class Hotine_oblique_mercator_variant_b_srs : public Projected_srs {
private:
/// Latitude of the point at which the azimuth of the central line
/// is defined (EPSG 8811).
double m_latitude_of_center;
/// Longitude of the point at which the azimuth of the central line
/// is defined (EPSG 8812).
double m_longitude_of_center;
/// Direction east of north of the great circle which is the central
/// line (EPSG 8813).
double m_azimuth;
/// Angle at the natural origin through which the natural SRS is
/// rotated to make the projection north axis parallel with true
/// north (EPSG 8814).
double m_rectified_grid_angle;
/// Multiplier for reducing a distance obtained from a map to the
/// actual distance on the datum of the map (EPSG 8815).
double m_scale_factor;
/// Easting value assigned to the projection center (EPSG 8816).
double m_false_easting;
/// Northing value assigned to the projection center (EPSG 8817).
double m_false_northing;
public:
Hotine_oblique_mercator_variant_b_srs()
: m_latitude_of_center(NAN),
m_longitude_of_center(NAN),
m_azimuth(NAN),
m_rectified_grid_angle(NAN),
m_scale_factor(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Hotine_oblique_mercator_variant_b_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::HOTINE_OBLIQUE_MERCATOR_VARIANT_B;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Tunisia Mining Grid projection (EPSG 9816).
class Tunisia_mining_grid_srs : public Projected_srs {
private:
/// Latitude of the false origin, at which the false easting and
/// northing is defined (EPSG 8821).
double m_latitude_of_origin;
/// Longitude (central meridian) of the false origin, at which the
/// false easting and northing is defined (EPSG 8822).
double m_longitude_of_origin;
/// Easting value assigned to the false origin (EPSG 8826).
double m_false_easting;
/// Northing value assigned to the false origin (EPSG 8827).
double m_false_northing;
public:
Tunisia_mining_grid_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Tunisia_mining_grid_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::TUNISIA_MINING_GRID;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Lambert Conic Near-Conformal projection (EPSG 9817).
class Lambert_conic_near_conformal_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Multiplier for reducing a distance obtained from a map to the
/// actual distance on the datum of the map (EPSG 8805).
double m_scale_factor;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Lambert_conic_near_conformal_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_scale_factor(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Lambert_conic_near_conformal_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::LAMBERT_CONIC_NEAR_CONFORMAL;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// An American Polyconic projection, alias Polyconic (EPSG 9818).
class American_polyconic_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
American_polyconic_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new American_polyconic_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::AMERICAN_POLYCONIC;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Krovak projection (EPSG 9819).
class Krovak_srs : public Projected_srs {
private:
/// Latitude of the point at which the azimuth of the central line
/// is defined (EPSG 8811).
double m_latitude_of_center;
/// The meridian along which the northing axis increments and also
/// across which parallels of latitude increment towards the north
/// pole (EPSG 8833).
double m_longitude_of_center;
/// The rotation applied to spherical coordinates, measured on the
/// conformal sphere in the plane of the meridian of origin (EPSG
/// 1036).
double m_azimuth;
/// Latitude of the parallel on which the projection is based. This
/// latitude is not geographic, but is defined on the conformal
/// sphere AFTER its rotation to obtain the oblique aspect of the
/// projection (EPSG 8818).
double m_pseudo_standard_parallel_1;
/// The factor by which the map grid is reduced or enlarged at the
/// pseudo-standard parallel (EPSG 8819).
double m_scale_factor;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Krovak_srs()
: m_latitude_of_center(NAN),
m_longitude_of_center(NAN),
m_azimuth(NAN),
m_pseudo_standard_parallel_1(NAN),
m_scale_factor(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Krovak_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::KROVAK;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Lambert Azimuthal Equal Area projection, alias Lambert Equal
/// Area or LAEA (EPSG 9820).
class Lambert_azimuthal_equal_area_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Lambert_azimuthal_equal_area_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Lambert_azimuthal_equal_area_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::LAMBERT_AZIMUTHAL_EQUAL_AREA;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// An Albers Equal Area projection, alias Albers (EPSG 9822).
class Albers_equal_area_srs : public Projected_srs {
private:
/// Latitude of the false origin, at which the false easting and
/// northing is defined (EPSG 8821).
double m_latitude_of_origin;
/// Longitude (central meridian) of the false origin, at which the
/// false easting and northing is defined (EPSG 8822).
double m_longitude_of_origin;
/// Latitude of the first parallel of intersection between the cone
/// and the ellipsoid (EPSG 8823).
double m_standard_parallel_1;
/// Latitude of the second parallel of intersection between the cone
/// and the ellipsoid (EPSG 8824).
double m_standard_parallel_2;
/// Easting value assigned to the false origin (EPSG 8826).
double m_false_easting;
/// Northing value assigned to the false origin (EPSG 8827).
double m_false_northing;
public:
Albers_equal_area_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_standard_parallel_1(NAN),
m_standard_parallel_2(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Albers_equal_area_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::ALBERS_EQUAL_AREA;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Transverse Mercator Zoned Grid System projection (EPSG 9824).
class Transverse_mercator_zoned_grid_system_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// The longitude of the western limit of the first zone (EPSG
/// 8830).
double m_initial_longitude;
/// The longitude width of a zone (EPSG 8831).
double m_zone_width;
/// Multiplier for reducing a distance obtained from a map to the
/// actual distance on the datum of the map (EPSG 8805).
double m_scale_factor;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Transverse_mercator_zoned_grid_system_srs()
: m_latitude_of_origin(NAN),
m_initial_longitude(NAN),
m_zone_width(NAN),
m_scale_factor(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Transverse_mercator_zoned_grid_system_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::TRANSVERSE_MERCATOR_ZONED_GRID_SYSTEM;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Lambert Conic Conformal (West Orientated) projection (EPSG 9826).
class Lambert_conic_conformal_west_orientated_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Multiplier for reducing a distance obtained from a map to the
/// actual distance on the datum of the map (EPSG 8805).
double m_scale_factor;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Lambert_conic_conformal_west_orientated_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_scale_factor(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Lambert_conic_conformal_west_orientated_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::LAMBERT_CONIC_CONFORMAL_WEST_ORIENTATED;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Bonne (South Orientated) projection (EPSG 9828).
class Bonne_south_orientated_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Bonne_south_orientated_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Bonne_south_orientated_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::BONNE_SOUTH_ORIENTATED;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Polar Stereographic (variant B) projection (EPSG 9829).
class Polar_stereographic_variant_b_srs : public Projected_srs {
private:
/// The parallel on which the scale factor is defined to be unity
/// (EPSG 8832).
double m_standard_parallel;
/// The meridian along which the northing axis increments and also
/// across which parallels of latitude increment towards the north
/// pole (EPSG 8833).
double m_longitude_of_origin;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Polar_stereographic_variant_b_srs()
: m_standard_parallel(NAN),
m_longitude_of_origin(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Polar_stereographic_variant_b_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::POLAR_STEREOGRAPHIC_VARIANT_B;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Polar Stereographic (variant C) projection (EPSG 9830).
class Polar_stereographic_variant_c_srs : public Projected_srs {
private:
/// The parallel on which the scale factor is defined to be unity
/// (EPSG 8832).
double m_standard_parallel;
/// The meridian along which the northing axis increments and also
/// across which parallels of latitude increment towards the north
/// pole (EPSG 8833).
double m_longitude_of_origin;
/// Easting value assigned to the false origin (EPSG 8826).
double m_false_easting;
/// Northing value assigned to the false origin (EPSG 8827).
double m_false_northing;
public:
Polar_stereographic_variant_c_srs()
: m_standard_parallel(NAN),
m_longitude_of_origin(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Polar_stereographic_variant_c_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::POLAR_STEREOGRAPHIC_VARIANT_C;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Guam Projection projection (EPSG 9831).
class Guam_projection_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Guam_projection_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Guam_projection_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::GUAM_PROJECTION;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Modified Azimuthal Equidistant projection (EPSG 9832).
class Modified_azimuthal_equidistant_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Modified_azimuthal_equidistant_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Modified_azimuthal_equidistant_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::MODIFIED_AZIMUTHAL_EQUIDISTANT;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Hyperbolic Cassini-Soldner projection (EPSG 9833).
class Hyperbolic_cassini_soldner_srs : public Projected_srs {
private:
/// Latitude chosen as origin of y-coordinates (EPSG 8801).
double m_latitude_of_origin;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Hyperbolic_cassini_soldner_srs()
: m_latitude_of_origin(NAN),
m_longitude_of_origin(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Hyperbolic_cassini_soldner_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::HYPERBOLIC_CASSINI_SOLDNER;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Lambert Cylindrical Equal Area (Spherical) projection (EPSG
/// 9834).
class Lambert_cylindrical_equal_area_spherical_srs : public Projected_srs {
private:
/// Latitude of the first parallel of intersection between the cone
/// and the ellipsoid (EPSG 8823).
double m_standard_parallel_1;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Lambert_cylindrical_equal_area_spherical_srs()
: m_standard_parallel_1(NAN),
m_longitude_of_origin(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Lambert_cylindrical_equal_area_spherical_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::LAMBERT_CYLINDRICAL_EQUAL_AREA_SPHERICAL;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/// A Lambert Cylindrical Equal Area projection (EPSG 9835).
class Lambert_cylindrical_equal_area_srs : public Projected_srs {
private:
/// Latitude of the first parallel of intersection between the cone
/// and the ellipsoid (EPSG 8823).
double m_standard_parallel_1;
/// Longitude chosen as origin of x-coordinates (central meridian)
/// (EPSG 8802).
double m_longitude_of_origin;
/// Value added to x-coordinates (EPSG 8806).
double m_false_easting;
/// Value added to y-coordinates (EPSG 8807).
double m_false_northing;
public:
Lambert_cylindrical_equal_area_srs()
: m_standard_parallel_1(NAN),
m_longitude_of_origin(NAN),
m_false_easting(NAN),
m_false_northing(NAN) {}
virtual Spatial_reference_system *clone() override {
return new Lambert_cylindrical_equal_area_srs(*this);
}
virtual bool init(srid_t srid, wkt_parser::Projected_cs *p) override;
virtual Projection_type projection_type() const override {
return Projection_type::LAMBERT_CYLINDRICAL_EQUAL_AREA;
}
bool can_be_modified_to(const Spatial_reference_system &) const override;
};
/**
Parse an SRS definition WKT string.
The parser understands WKT as defined by the \<horz cs\>
specification in OGC 01-009.
If the string is successfully parsed, a new SRS object will be
allocated on the heap. The caller is responsible for deleting it.
If an error occurs, no object is allocated.
@param[in] srid Spatial reference system ID to use when reporting errors
@param[in] begin Start of WKT string in UTF-8
@param[in] end End of WKT string (one past the last byte)
@param[out] result Spatial reference system
@retval true An error has occurred
@retval false Success
*/
bool parse_wkt(srid_t srid, const char *begin, const char *end,
Spatial_reference_system **result);
} // namespace srs
} // namespace gis
#endif // SQL_GIS_SRS_SRS_H_INCLUDED