-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathDF_Proj_Point.hpp
More file actions
127 lines (108 loc) · 4.41 KB
/
Copy pathDF_Proj_Point.hpp
File metadata and controls
127 lines (108 loc) · 4.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// DFLib: A library of Bearings Only Target Localization algorithms
// Copyright (C) 2009-2015 Thomas V. Russo
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// 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 for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//-------------------------------------------------------------------------
//-------------------------------------------------------------------------
// Filename : DF_Proj_Point.cpp
//
// Purpose : Implement a DFLib::Abstract::Point interface such that
// the "user" coordinate system is whatever the user has
// specified with a proj.4 spatial reference system, and the
// "XY" coordinate system is a mercator projection on the
// WGS84 ellipsoid.
//
//-------------------------------------------------------------------------
#ifndef DF_PROJ_POINT_HPP
#define DF_PROJ_POINT_HPP
#include "DFLib_port.h"
#include <vector>
#include <string>
#include "proj.h"
#include "DF_Abstract_Point.hpp"
namespace DFLib
{
namespace Proj
{
class CPL_DLL Point : public DFLib::Abstract::Point
{
private:
std::vector<double> theMerc;
bool mercDirty;
std::vector<double> theUserCoords;
bool userDirty;
PJ *convertPJ;
public:
/// \brief Constructor
///
/// \param uPosition coordinates <em>in user's coordinates</em>
/// \param projArgs a vector of strings representing the Proj.4
/// description of the user's coordinate system.
///
Point(const std::vector<double> &uPosition,const std::vector<std::string> &projArgs);
/// \brief Copy Constructor
Point(const Point &right);
/// \brief destructor
~Point();
/// \brief assignment operator
Point& operator=(const Point& rhs);
/// \brief set user projection information
///
/// \param projArgs vector of strings representing the new projection
///
/// This method can be used to change the coordinate system of a point.
/// When called, the Mercator representation of the point is updated,
/// then the user projection is changed. The next call to getUserCoords
/// will therefore return the point's coordinates in the new coordinate
/// system.
void setUserProj(const std::vector<std::string> &projArgs);
/// \brief return true if user projection expects input in radians
bool isUserProjRadians() const;
/// \brief set mercator projection (XY) position
///
/// \param aPosition coordinates in mercator projection
///
virtual void setXY(const std::vector<double> &mPosition);
/// \brief get mercator projection (XY) position
///
/// \return vector of coordinates in mercator projection
///
virtual const std::vector<double> &getXY();
/// \brief get user position
///
/// \return a vector<double> containing the coordinates of this
/// point in the user's coordinate system.
///
/// This method works by converting the mercator coordinates of
/// the point back to the user's coordinate system using the Proj.4
/// cartographic projection library if the mercator coordinates
/// or user projection have changed since the last call.
virtual const std::vector<double> &getUserCoords();
/// \brief set user position
///
/// Sets the coordinates of the point in user's coordinate system,
/// marking the mercator coordinates invalid. Mercator coordinates
/// will be updated by conversion with Proj.4 upon the next call to
/// getXY().
///
/// \param uPosition vector of doubles with user coordinates.
virtual void setUserCoords(const std::vector<double> &uPosition) ;
virtual Point * Clone();
private:
void mercToUser();
void userToMerc();
};
}
}
#endif // DF_PROJ_POINT_HPP