Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/utils/geom/GeoConvHelper.h
169678 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2001-2025 German Aerospace Center (DLR) and others.
4
// This program and the accompanying materials are made available under the
5
// terms of the Eclipse Public License 2.0 which is available at
6
// https://www.eclipse.org/legal/epl-2.0/
7
// This Source Code may also be made available under the following Secondary
8
// Licenses when the conditions for such availability set forth in the Eclipse
9
// Public License 2.0 are satisfied: GNU General Public License, version 2
10
// or later which is available at
11
// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13
/****************************************************************************/
14
/// @file GeoConvHelper.h
15
/// @author Daniel Krajzewicz
16
/// @author Jakob Erdmann
17
/// @author Michael Behrisch
18
/// @date 2006-08-01
19
///
20
// static methods for processing the coordinates conversion for the current net
21
/****************************************************************************/
22
#pragma once
23
#include <config.h>
24
25
#include <map>
26
#include <string>
27
#include <utils/geom/Position.h>
28
#include <utils/geom/Boundary.h>
29
30
#ifdef PROJ_API_FILE
31
#include PROJ_API_FILE
32
#ifdef PROJ_VERSION_MAJOR
33
typedef PJ* projPJ;
34
#endif
35
#endif
36
37
38
// ===========================================================================
39
// class declarations
40
// ===========================================================================
41
42
class OptionsCont;
43
class PositionVector;
44
class OutputDevice;
45
46
// ===========================================================================
47
// class definitions
48
// ===========================================================================
49
/**
50
* @class GeoConvHelper
51
* @brief static methods for processing the coordinates conversion for the current net
52
*/
53
class GeoConvHelper {
54
public:
55
56
/**@brief Constructor based on the stored options
57
* @param[in] oc The OptionsCont from which to read options
58
*/
59
GeoConvHelper(OptionsCont& oc);
60
61
/// @brief Constructor
62
GeoConvHelper(const std::string& proj, const Position& offset,
63
const Boundary& orig, const Boundary& conv, double scale = 1.0, double rot = 0.0, bool inverse = false, bool flatten = false);
64
65
/// @brief Destructor
66
~GeoConvHelper();
67
68
/**@brief Adds projection options to the given container
69
* @param[in] oc The options container to add the options to
70
* @todo let the container be retrieved
71
*/
72
static void addProjectionOptions(OptionsCont& oc);
73
74
/// @brief Initialises the processing and the final instance using the given options
75
static bool init(OptionsCont& oc);
76
77
/// @brief Initialises the processing and the final instance using the given proj.4-definition and complete network parameter
78
static void init(const std::string& proj, const Position& offset, const Boundary& orig,
79
const Boundary& conv, double scale = 1.0);
80
81
/**@brief the coordinate transformation to use for input conversion and processing
82
* @note instance is modified during use: boundary may adapt to new coordinates
83
*/
84
static GeoConvHelper& getProcessing() {
85
return myProcessing;
86
}
87
88
/// @brief the coordinate transformation that was loaded fron an input file
89
static GeoConvHelper& getLoaded() {
90
return myLoaded;
91
}
92
93
static int getNumLoaded() {
94
return myNumLoaded;
95
}
96
97
/**@brief compute the location attributes which will be used for output
98
* based on the loaded location data, the given options and the transformations applied during processing
99
*/
100
static void computeFinal(bool lefthand = false);
101
102
/// @brief the coordinate transformation for writing the location element and for tracking the original coordinate system
103
static const GeoConvHelper& getFinal() {
104
return myFinal;
105
}
106
107
/// @brief sets the coordinate transformation loaded from a location element
108
static void setLoaded(const GeoConvHelper& loaded);
109
110
/// @brief registers the coordinate transformation as having been loaded from the given file
111
static void setLoadedPlain(const std::string& nodFile, const GeoConvHelper& loaded);
112
113
static GeoConvHelper* getLoadedPlain(const std::string& plainFile, const std::string& suffix = ".edg.xml");
114
115
/// @brief @brief resets loaded location elements
116
static void resetLoaded();
117
118
/// @brief Converts the given cartesian (shifted) position to its geo (lat/long) representation
119
void cartesian2geo(Position& cartesian) const;
120
121
/**@brief Converts the given coordinate into a cartesian and optionally update myConvBoundary
122
* @note: initializes UTM / DHDN projection on first use (select zone)
123
*/
124
bool x2cartesian(Position& from, bool includeInBoundary = true);
125
126
/// @brief Converts the given coordinate into a cartesian using the previous initialisation
127
bool x2cartesian_const(Position& from) const;
128
129
/// @brief Returns whether a transformation from geo to metric coordinates will be performed
130
bool usingGeoProjection() const;
131
132
/// @brief Returns the information whether an inverse transformation will happen
133
bool usingInverseGeoProjection() const;
134
135
/// @brief Shifts the converted boundary by the given amounts
136
void moveConvertedBy(double x, double y);
137
138
/// @brief Returns the original boundary
139
const Boundary& getOrigBoundary() const;
140
141
/// @brief Returns the converted boundary
142
const Boundary& getConvBoundary() const;
143
144
/// @brief sets the converted boundary
145
void setConvBoundary(const Boundary& boundary) {
146
myConvBoundary = boundary;
147
}
148
149
/// @brief Returns the network offset
150
const Position getOffset() const;
151
152
/// @brief Returns the network base
153
const Position getOffsetBase() const;
154
155
/// @brief Returns the original projection definition
156
const std::string& getProjString() const;
157
158
/// @brief init projString such as 'UTM' in loaded projection
159
void resolveAbstractProjection();
160
161
/// @brief @brief writes the location element
162
static void writeLocation(OutputDevice& into);
163
164
bool operator==(const GeoConvHelper& o) const;
165
166
bool operator!=(const GeoConvHelper& o) const {
167
return !(*this == o);
168
}
169
170
private:
171
/// @brief projection method
172
enum ProjectionMethod {
173
NONE,
174
SIMPLE,
175
UTM,
176
DHDN,
177
DHDN_UTM,
178
PROJ
179
};
180
181
/// @brief A proj options string describing the proj.4-projection to use
182
std::string myProjString;
183
184
#ifdef PROJ_API_FILE
185
void initProj(const std::string& proj);
186
187
#ifdef PROJ_VERSION_MAJOR
188
bool checkError(projPJ projection) const;
189
#endif
190
191
/// @brief The proj.4-projection to use
192
projPJ myProjection;
193
194
/// @brief The inverse proj.4-projection to use first
195
projPJ myInverseProjection;
196
197
/// @brief The geo proj.4-projection which is the target of the inverse projection
198
projPJ myGeoProjection;
199
#endif
200
201
/// @brief The offset to apply
202
Position myOffset;
203
204
/// @brief The scaling to apply to geo-coordinates
205
double myGeoScale;
206
207
/// @brief The rotation to apply to geo-coordinates
208
double mySin;
209
double myCos;
210
211
/// @brief Information whether no projection shall be done
212
ProjectionMethod myProjectionMethod;
213
214
/// @brief Information whether inverse projection shall be used
215
bool myUseInverseProjection;
216
217
/// @brief whether to discard z-data
218
bool myFlatten;
219
220
/// @brief The boundary before conversion (x2cartesian)
221
Boundary myOrigBoundary;
222
223
/// @brief The boundary after conversion (x2cartesian)
224
Boundary myConvBoundary;
225
226
/// @brief coordinate transformation to use for input conversion and processing
227
static GeoConvHelper myProcessing;
228
229
/// @brief coordinate transformation loaded from a location element
230
static GeoConvHelper myLoaded;
231
232
/// @brief coordinate transformation to use for writing the location element and for tracking the original coordinate system
233
static GeoConvHelper myFinal;
234
235
/// @brief the numer of coordinate transformations loaded from location elements
236
static int myNumLoaded;
237
238
/// @brief the projections loaded from .nod.xml (to be re-used when loading edg.xml)
239
static std::map<std::string, std::pair<std::string, Position> > myLoadedPlain;
240
241
/// @brief make assignment operator private
242
GeoConvHelper& operator=(const GeoConvHelper&);
243
244
/// @brief invalidated copy constructor.
245
GeoConvHelper(const GeoConvHelper&) = delete;
246
};
247
248