1
0
mirror of https://github.com/tumic0/GPXSee.git synced 2025-03-01 21:40:48 +01:00
GPXSee/src/map/projection.cpp
Martin Tůma a48b46d0fb Refactoring
Moved Projection::Method and Projection::Setup to the Conversion class
2024-03-19 22:39:42 +01:00

133 lines
3.6 KiB
C++

#include "proj/mercator.h"
#include "proj/webmercator.h"
#include "proj/transversemercator.h"
#include "proj/lambertconic.h"
#include "proj/albersequal.h"
#include "proj/lambertazimuthal.h"
#include "proj/krovak.h"
#include "proj/polarstereographic.h"
#include "proj/obliquestereographic.h"
#include "proj/polyconic.h"
#include "datum.h"
#include "pcs.h"
#include "projection.h"
Projection::Projection(const PCS &pcs)
: _gcs(pcs.gcs()), _ct(0), _units(pcs.conversion().units()),
_cs(pcs.conversion().cs())
{
const Ellipsoid &ellipsoid = _gcs.datum().ellipsoid();
const Conversion::Setup &setup = pcs.conversion().setup();
switch (pcs.conversion().method().id()) {
case 1024:
_ct = new WebMercator();
break;
case 1041:
_ct = new KrovakNE(ellipsoid, setup.standardParallel1(),
setup.standardParallel2(), setup.scale(), setup.latitudeOrigin(),
setup.longitudeOrigin(), setup.falseEasting(),
setup.falseNorthing());
break;
case 9801:
case 9815: // Oblique mercator aproximation using LCC1
_ct = new LambertConic1(ellipsoid, setup.latitudeOrigin(),
setup.longitudeOrigin(), setup.scale(), setup.falseEasting(),
setup.falseNorthing());
break;
case 9802:
_ct = new LambertConic2(ellipsoid, setup.standardParallel1(),
setup.standardParallel2(), setup.latitudeOrigin(),
setup.longitudeOrigin(), setup.falseEasting(),
setup.falseNorthing());
break;
case 9804:
_ct = new Mercator(ellipsoid, setup.latitudeOrigin(),
setup.longitudeOrigin(), setup.falseEasting(),
setup.falseNorthing());
break;
case 9807:
_ct = new TransverseMercator(ellipsoid, setup.latitudeOrigin(),
setup.longitudeOrigin(), setup.scale(), setup.falseEasting(),
setup.falseNorthing());
break;
case 9809:
_ct = new ObliqueStereographic(ellipsoid, setup.latitudeOrigin(),
setup.longitudeOrigin(), setup.scale(), setup.falseEasting(),
setup.falseNorthing());
break;
case 9818:
_ct = new Polyconic(ellipsoid, setup.latitudeOrigin(),
setup.longitudeOrigin(), setup.falseEasting(),
setup.falseNorthing());
break;
case 9819:
_ct = new Krovak(ellipsoid, setup.standardParallel1(),
setup.standardParallel2(), setup.scale(), setup.latitudeOrigin(),
setup.longitudeOrigin(), setup.falseEasting(),
setup.falseNorthing());
break;
case 9820:
_ct = new LambertAzimuthal(ellipsoid, setup.latitudeOrigin(),
setup.longitudeOrigin(), setup.falseEasting(),
setup.falseNorthing());
break;
case 9822:
_ct = new AlbersEqual(ellipsoid, setup.standardParallel1(),
setup.standardParallel2(), setup.latitudeOrigin(),
setup.longitudeOrigin(), setup.falseEasting(),
setup.falseNorthing());
break;
case 9829:
_ct = new PolarStereographic(ellipsoid, setup.latitudeOrigin(),
setup.longitudeOrigin(), setup.falseEasting(),
setup.falseNorthing());
break;
default:
_ct = 0;
}
}
Projection::Projection(const GCS &gcs, const CoordinateSystem &cs)
: _gcs(gcs), _units(LinearUnits(9001)), _cs(cs)
{
_ct = new LatLon(gcs.angularUnits());
}
Projection::Projection(const Projection &p)
{
_gcs = p._gcs;
_units = p._units;
_ct = p._ct ? p._ct->clone() : 0;
_cs = p._cs;
}
Projection::~Projection()
{
delete _ct;
}
Projection &Projection::operator=(const Projection &p)
{
if (this != &p) {
delete _ct;
_gcs = p._gcs;
_units = p._units;
_ct = p._ct ? p._ct->clone() : 0;
_cs = p._cs;
}
return *this;
}
bool Projection::operator==(const Projection &p) const
{
if (!isValid() || !p.isValid())
return false;
return (*_ct == *p._ct && _gcs == p._gcs && _units == p._units
&& _cs == p._cs);
}