Skip to content

Commit cd13aa5

Browse files
committed
GeoData: use double precision
1 parent a4b6167 commit cd13aa5

3 files changed

Lines changed: 43 additions & 43 deletions

File tree

src/OpenCOVER/geodata/GeoData.cpp

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ GeoData::GeoData()
1818
#endif
1919

2020
m_transformRoot = new osg::MatrixTransform;
21-
m_transformRoot->setMatrix(osg::Matrix::identity());
21+
m_transformRoot->setMatrix(osg::Matrixd::identity());
2222
cover->getObjectsRoot()->addChild(m_transformRoot);
2323

2424
m_terrainRoot = new osg::Group;
@@ -82,39 +82,39 @@ void GeoData::setProjection(std::string_view projection)
8282
#endif
8383
}
8484

85-
void GeoData::setProjectOffset(const osg::Vec3 &projectOffset)
85+
void GeoData::setProjectOffset(const osg::Vec3d &projectOffset)
8686
{
8787
setProjectTransform(projectOffset, m_projectTrueNorthDegree);
8888
}
8989

90-
void GeoData::setProjectTransform(const osg::Vec3 &projectOffset, const double trueNorthDeg)
90+
void GeoData::setProjectTransform(const osg::Vec3d &projectOffset, const double trueNorthDeg)
9191
{
9292
m_projectOffset = projectOffset;
9393
m_projectTrueNorthDegree = trueNorthDeg;
94-
osg::Matrix rot = osg::Matrix::rotate(osg::DegreesToRadians(-trueNorthDeg), osg::Vec3(0, 0, 1));
95-
osg::Matrix trans = osg::Matrix::translate(-projectOffset);
94+
osg::Matrixd rot = osg::Matrixd::rotate(osg::DegreesToRadians(-trueNorthDeg), osg::Vec3d(0, 0, 1));
95+
osg::Matrixd trans = osg::Matrixd::translate(-projectOffset);
9696
m_projectTransform = trans * rot;
97-
m_inverseProjectTransform = osg::Matrix::inverse(m_projectTransform);
97+
m_inverseProjectTransform = osg::Matrixd::inverse(m_projectTransform);
9898
m_transformRoot->setMatrix(m_projectTransform);
9999
}
100100

101101
const std::string &GeoData::projection() const
102102
{
103103
return m_projection;
104104
}
105-
const osg::Vec3 &GeoData::projectOffset() const
105+
const osg::Vec3d &GeoData::projectOffset() const
106106
{
107107
return m_projectOffset;
108108
}
109109
const double GeoData::projectTrueNorthDegree() const
110110
{
111111
return m_projectTrueNorthDegree;
112112
}
113-
const osg::Matrix &GeoData::projectTransform() const
113+
const osg::Matrixd &GeoData::projectTransform() const
114114
{
115115
return m_projectTransform;
116116
}
117-
const osg::Matrix &GeoData::inverseProjectTransform() const
117+
const osg::Matrixd &GeoData::inverseProjectTransform() const
118118
{
119119
return m_inverseProjectTransform;
120120
}
@@ -128,23 +128,23 @@ osg::Group *GeoData::terrainRoot()
128128
return m_terrainRoot;
129129
}
130130

131-
osg::Vec3 GeoData::getProjectPosition()
131+
osg::Vec3d GeoData::getProjectPosition()
132132
{
133-
return osg::Matrix::inverse(cover->getXformMat()).getTrans() / cover->getScale();
133+
return osg::Matrixd::inverse(cover->getXformMat()).getTrans() / cover->getScale();
134134
}
135135

136-
osg::Vec3 GeoData::getGlobalPosition()
136+
osg::Vec3d GeoData::getGlobalPosition()
137137
{
138138
auto projectLocation = getProjectPosition();
139139
return projectToGlobal(projectLocation);
140140
}
141141

142-
osg::Vec3 GeoData::globalToProject(const osg::Vec3 &globalPosition) const
142+
osg::Vec3d GeoData::globalToProject(const osg::Vec3d &globalPosition) const
143143
{
144144
return globalToReference(globalPosition) * m_projectTransform;
145145
}
146146

147-
osg::Vec3 GeoData::globalToReference(const osg::Vec3 &globalPosition) const
147+
osg::Vec3d GeoData::globalToReference(const osg::Vec3d &globalPosition) const
148148
{
149149
#ifndef HAVE_PROJ
150150
return globalPosition;
@@ -156,13 +156,13 @@ osg::Vec3 GeoData::globalToReference(const osg::Vec3 &globalPosition) const
156156

157157
PJ_COORD c_out = proj_trans(m_transformation, PJ_FWD, c);
158158

159-
osg::Vec3 position_transformed(c_out.enu.e, c_out.enu.n, c_out.enu.u);
159+
osg::Vec3d position_transformed(c_out.enu.e, c_out.enu.n, c_out.enu.u);
160160

161161
return position_transformed;
162162
#endif
163163
}
164164

165-
osg::Vec3 GeoData::projectToGlobal(const osg::Vec3 &projectPosition) const
165+
osg::Vec3d GeoData::projectToGlobal(const osg::Vec3d &projectPosition) const
166166
{
167167
#ifndef HAVE_PROJ
168168
return projectPosition;
@@ -176,23 +176,23 @@ osg::Vec3 GeoData::projectToGlobal(const osg::Vec3 &projectPosition) const
176176

177177
PJ_COORD c_out = proj_trans(m_transformation, PJ_INV, c);
178178

179-
return osg::Vec3(c_out.lpz.lam, c_out.lpz.phi, c_out.lpz.z);
179+
return osg::Vec3d(c_out.lpz.lam, c_out.lpz.phi, c_out.lpz.z);
180180
#endif
181181
}
182182

183-
void GeoData::jumpToLocation(const osg::Vec3 &projectPosition)
183+
void GeoData::jumpToLocation(const osg::Vec3d &projectPosition)
184184
{
185-
osg::Vec3 target = projectPosition;
185+
osg::Vec3d target = projectPosition;
186186
double scale = cover->getScale();
187187

188-
cover->setXformMat(osg::Matrix::translate(-projectPosition * scale)); // * osg::Matrix::rotate(cover->getXformMat().getRotate()));
188+
cover->setXformMat(osg::Matrixd::translate(-projectPosition * scale)); // * osg::Matrixd::rotate(cover->getXformMat().getRotate()));
189189
}
190190

191-
void GeoData::jumpToLocation(const osg::Vec3 &projectPosition, double aboveTerrain)
191+
void GeoData::jumpToLocation(const osg::Vec3d &projectPosition, double aboveTerrain)
192192
{
193193
osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector = new osgUtil::LineSegmentIntersector(
194-
osg::Vec3(projectPosition.x(), projectPosition.y(), 10000.0),
195-
osg::Vec3(projectPosition.x(), projectPosition.y(), -10000.0));
194+
osg::Vec3d(projectPosition.x(), projectPosition.y(), 10000.0),
195+
osg::Vec3d(projectPosition.x(), projectPosition.y(), -10000.0));
196196
osgUtil::IntersectionVisitor iv(intersector);
197197

198198
auto terrainRoot = GeoData::instance()->terrainRoot();
@@ -201,7 +201,7 @@ void GeoData::jumpToLocation(const osg::Vec3 &projectPosition, double aboveTerra
201201

202202
if (intersector->containsIntersections())
203203
{
204-
jumpToLocation(osg::Vec3(
204+
jumpToLocation(osg::Vec3d(
205205
projectPosition.x(),
206206
projectPosition.y(),
207207
intersector->getFirstIntersection().getLocalIntersectPoint().z() + aboveTerrain));

src/OpenCOVER/geodata/GeoData.h

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
#include <string>
1212
#include <string_view>
1313

14-
#include <osg/Vec3>
15-
#include <osg/Matrix>
14+
#include <osg/Vec3d>
15+
#include <osg/Matrixd>
1616
#include <osg/PositionAttitudeTransform>
1717

1818
#include <util/coExport.h>
@@ -36,43 +36,43 @@ class COVRGEODATAEXPORT GeoData
3636
static GeoData *instance();
3737

3838
void setProjection(std::string_view projection);
39-
void setProjectOffset(const osg::Vec3 &projectOffset);
40-
void setProjectTransform(const osg::Vec3 &projectOffset, const double trueNorthDeg);
39+
void setProjectOffset(const osg::Vec3d &projectOffset);
40+
void setProjectTransform(const osg::Vec3d &projectOffset, const double trueNorthDeg);
4141

4242
const std::string &projection() const;
43-
const osg::Vec3 &projectOffset() const;
43+
const osg::Vec3d &projectOffset() const;
4444
const double projectTrueNorthDegree() const;
45-
const osg::Matrix &projectTransform() const;
46-
const osg::Matrix &inverseProjectTransform() const;
45+
const osg::Matrixd &projectTransform() const;
46+
const osg::Matrixd &inverseProjectTransform() const;
4747

4848
osg::MatrixTransform *transformRoot();
4949
osg::Group *terrainRoot();
5050

51-
osg::Vec3 getProjectPosition();
52-
osg::Vec3 getGlobalPosition();
51+
osg::Vec3d getProjectPosition();
52+
osg::Vec3d getGlobalPosition();
5353

5454
/**
5555
* Transform a global position (easting-northing-altitude) into project
5656
* (x-y-z) coordinates, applying transform and project offset.
5757
*/
58-
osg::Vec3 globalToProject(const osg::Vec3 &globalPosition) const;
58+
osg::Vec3d globalToProject(const osg::Vec3d &globalPosition) const;
5959

6060
/**
6161
* Transform a global position (easting-northing-altitude) into the
6262
* reference (x-y-z) coordinates, applying the projection transform, but
6363
* not the project offset.
6464
*/
65-
osg::Vec3 globalToReference(const osg::Vec3 &globalPosition) const;
65+
osg::Vec3d globalToReference(const osg::Vec3d &globalPosition) const;
6666

6767
/**
6868
* Transform a project (x-y-z) coordinate into a global position
6969
* (easting-northing-altitude), applying the reverse project offset and
7070
* transformation.
7171
*/
72-
osg::Vec3 projectToGlobal(const osg::Vec3 &projectPosition) const;
72+
osg::Vec3d projectToGlobal(const osg::Vec3d &projectPosition) const;
7373

74-
void jumpToLocation(const osg::Vec3 &projectPosition);
75-
void jumpToLocation(const osg::Vec3 &projectPosition, double aboveTerrain);
74+
void jumpToLocation(const osg::Vec3d &projectPosition);
75+
void jumpToLocation(const osg::Vec3d &projectPosition, double aboveTerrain);
7676

7777
protected:
7878
#ifdef HAVE_PROJ
@@ -81,10 +81,10 @@ class COVRGEODATAEXPORT GeoData
8181
#endif
8282

8383
std::string m_projection;
84-
osg::Vec3 m_projectOffset;
84+
osg::Vec3d m_projectOffset;
8585
double m_projectTrueNorthDegree = 0.0;
86-
osg::Matrix m_projectTransform;
87-
osg::Matrix m_inverseProjectTransform;
86+
osg::Matrixd m_projectTransform;
87+
osg::Matrixd m_inverseProjectTransform;
8888

8989
osg::MatrixTransform *m_transformRoot;
9090
osg::Group *m_terrainRoot;

src/OpenCOVER/plugins/general/GeoData/GeoDataLoader.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ bool GeoDataLoader::init()
119119

120120
if (latitude || longitude)
121121
{
122-
auto enu = GeoData::instance()->globalToReference(osg::Vec3(longitude, latitude, altitude));
122+
auto enu = GeoData::instance()->globalToReference(osg::Vec3d(longitude, latitude, altitude));
123123
dataset.easting = enu.x();
124124
dataset.northing = enu.y();
125125
dataset.altitude = enu.z();
@@ -769,7 +769,7 @@ std::optional<PlaceLabelGroup> GeoDataLoader::loadLabels(const std::string &file
769769
double altitude = feature->GetFieldAsDouble("altitude");
770770
int size = feature->GetFieldAsInteger("size");
771771

772-
osg::Vec3f global(poPoint->getX(), poPoint->getY(), altitude);
772+
osg::Vec3d global(poPoint->getX(), poPoint->getY(), altitude);
773773
auto local = GeoData::instance()->globalToReference(global);
774774

775775
labels.emplace_back(std::make_shared<PlaceLabel>(name, local, node, size));

0 commit comments

Comments
 (0)