Added an "-a" speed averager option and a "-o filename" output option.
This commit is contained in:
parent
c40a4ff9cb
commit
4b4dd94b5d
@ -98,7 +98,7 @@ protected:
|
|||||||
|
|
||||||
double convertTime(const std::string& timestr)
|
double convertTime(const std::string& timestr)
|
||||||
{
|
{
|
||||||
//osg::notify(osg::NOTICE)<<" time = "<<timestr<<std::endl;
|
osg::notify(osg::NOTICE)<<" time = "<<timestr<<std::endl;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -218,6 +218,7 @@ TrackSegment* computeSmoothedTrackSegment(TrackSegment* ts)
|
|||||||
new_points[i].latitude = (orig_points[i-1].latitude+orig_points[i].latitude+orig_points[i+1].latitude)/3.0;
|
new_points[i].latitude = (orig_points[i-1].latitude+orig_points[i].latitude+orig_points[i+1].latitude)/3.0;
|
||||||
new_points[i].longitude = (orig_points[i-1].longitude+orig_points[i].longitude+orig_points[i+1].longitude)/3.0;
|
new_points[i].longitude = (orig_points[i-1].longitude+orig_points[i].longitude+orig_points[i+1].longitude)/3.0;
|
||||||
new_points[i].elevation = (orig_points[i-1].elevation+orig_points[i].elevation+orig_points[i+1].elevation)/3.0;
|
new_points[i].elevation = (orig_points[i-1].elevation+orig_points[i].elevation+orig_points[i+1].elevation)/3.0;
|
||||||
|
new_points[i].time = (orig_points[i-1].time+orig_points[i].time+orig_points[i+1].time)/3.0;
|
||||||
}
|
}
|
||||||
return new_ts.release();
|
return new_ts.release();
|
||||||
}
|
}
|
||||||
@ -229,6 +230,81 @@ TrackSegment* computeSmoothedTrackSegment(TrackSegment* ts)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TrackSegment* computeAveragedSpeedTrackSegment(TrackSegment* ts)
|
||||||
|
{
|
||||||
|
if (!ts) return 0;
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::EllipsoidModel> em = new osg::EllipsoidModel;
|
||||||
|
const TrackSegment::TrackPoints& orig_points = ts->getTrackPoints();
|
||||||
|
|
||||||
|
if (orig_points.size()>2)
|
||||||
|
{
|
||||||
|
// only do smoothing if we have more than two points.
|
||||||
|
osg::ref_ptr<TrackSegment> new_ts = new TrackSegment;
|
||||||
|
|
||||||
|
|
||||||
|
// compute overall distance
|
||||||
|
double total_distance = 0;
|
||||||
|
for(unsigned int i=1; i<orig_points.size()-1; ++i)
|
||||||
|
{
|
||||||
|
osg::Vec3d point_a, point_b;
|
||||||
|
em->convertLatLongHeightToXYZ(osg::DegreesToRadians(orig_points[i].latitude), osg::DegreesToRadians(orig_points[i].longitude), orig_points[i].elevation,
|
||||||
|
point_a.x(), point_a.y(), point_a.z());
|
||||||
|
em->convertLatLongHeightToXYZ(osg::DegreesToRadians(orig_points[i+1].latitude), osg::DegreesToRadians(orig_points[i+1].longitude), orig_points[i+1].elevation,
|
||||||
|
point_b.x(), point_b.y(), point_b.z());
|
||||||
|
total_distance += (point_b-point_a).length();
|
||||||
|
}
|
||||||
|
|
||||||
|
double total_time = orig_points[orig_points.size()-1].time - orig_points[0].time;
|
||||||
|
double average_speed = total_distance/total_time;
|
||||||
|
|
||||||
|
OSG_NOTICE<<"total_time = "<<total_time<<std::endl;
|
||||||
|
OSG_NOTICE<<"total_distance = "<<total_distance<<std::endl;
|
||||||
|
OSG_NOTICE<<"average_speed = "<<average_speed<<std::endl;
|
||||||
|
|
||||||
|
TrackSegment::TrackPoints& new_points = new_ts->getTrackPoints();
|
||||||
|
new_points.resize(orig_points.size());
|
||||||
|
new_points[0] = orig_points[0];
|
||||||
|
|
||||||
|
double accumulated_distance = 0.0;
|
||||||
|
for(unsigned int i=0; i<orig_points.size()-1; ++i)
|
||||||
|
{
|
||||||
|
osg::Vec3d point_a, point_b;
|
||||||
|
em->convertLatLongHeightToXYZ(osg::DegreesToRadians(orig_points[i].latitude), osg::DegreesToRadians(orig_points[i].longitude), orig_points[i].elevation,
|
||||||
|
point_a.x(), point_a.y(), point_a.z());
|
||||||
|
em->convertLatLongHeightToXYZ(osg::DegreesToRadians(orig_points[i+1].latitude), osg::DegreesToRadians(orig_points[i+1].longitude), orig_points[i+1].elevation,
|
||||||
|
point_b.x(), point_b.y(), point_b.z());
|
||||||
|
|
||||||
|
accumulated_distance += (point_b-point_a).length();
|
||||||
|
|
||||||
|
new_points[i+1] = orig_points[i+1];
|
||||||
|
new_points[i+1].time = accumulated_distance / average_speed;
|
||||||
|
}
|
||||||
|
return new_ts.release();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// we have two or less points and can't do smoothing, so will just return original TrackSegment
|
||||||
|
return ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Track* computeAveragedSpeedTrack(Track* track)
|
||||||
|
{
|
||||||
|
osg::ref_ptr<Track> new_track = new Track;
|
||||||
|
|
||||||
|
for(Track::TrackSegments::iterator itr = track->getTrackSegments().begin();
|
||||||
|
itr != track->getTrackSegments().end();
|
||||||
|
++itr)
|
||||||
|
{
|
||||||
|
new_track->addTrackSegment(computeAveragedSpeedTrackSegment(itr->get()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return new_track.release();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Track* computeSmoothedTrack(Track* track)
|
Track* computeSmoothedTrack(Track* track)
|
||||||
{
|
{
|
||||||
osg::ref_ptr<Track> new_track = new Track;
|
osg::ref_ptr<Track> new_track = new Track;
|
||||||
@ -291,9 +367,15 @@ int main(int argv, char **argc)
|
|||||||
typedef std::list< osg::ref_ptr<Track> > Tracks;
|
typedef std::list< osg::ref_ptr<Track> > Tracks;
|
||||||
Tracks tracks;
|
Tracks tracks;
|
||||||
|
|
||||||
|
bool average = false;
|
||||||
|
while (arguments.read("-a") || arguments.read("--average")) average = true;
|
||||||
|
|
||||||
bool smooth = false;
|
bool smooth = false;
|
||||||
while (arguments.read("-s") || arguments.read("--smooth")) smooth = true;
|
while (arguments.read("-s") || arguments.read("--smooth")) smooth = true;
|
||||||
|
|
||||||
|
std::string outputFilename;
|
||||||
|
while (arguments.read("-o",outputFilename)) {}
|
||||||
|
|
||||||
std::string trackFilename;
|
std::string trackFilename;
|
||||||
while (arguments.read("-t",trackFilename))
|
while (arguments.read("-t",trackFilename))
|
||||||
{
|
{
|
||||||
@ -316,6 +398,17 @@ int main(int argv, char **argc)
|
|||||||
|
|
||||||
group->addChild(createTrackModel(track, osg::Vec4(1.0,1.0,1.0,1.0)));
|
group->addChild(createTrackModel(track, osg::Vec4(1.0,1.0,1.0,1.0)));
|
||||||
|
|
||||||
|
// smooth the track
|
||||||
|
if (average)
|
||||||
|
{
|
||||||
|
for(Track::TrackSegments::iterator itr = track->getTrackSegments().begin();
|
||||||
|
itr != track->getTrackSegments().end();
|
||||||
|
++itr)
|
||||||
|
{
|
||||||
|
*itr = computeAveragedSpeedTrackSegment(itr->get());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// smooth the track
|
// smooth the track
|
||||||
if (smooth)
|
if (smooth)
|
||||||
{
|
{
|
||||||
@ -401,6 +494,45 @@ int main(int argv, char **argc)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!outputFilename.empty())
|
||||||
|
{
|
||||||
|
std::ofstream fout(outputFilename.c_str());
|
||||||
|
|
||||||
|
fout<<"<?xml version=\"1.0\" encoding=\"utf-8\"?><gpx version=\"1.0\" creator=\"osggpx\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://www.topografix.com/GPX/1/0\" xsi:schemaLocation=\"http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd\">"<<std::endl;
|
||||||
|
|
||||||
|
for(Tracks::iterator itr = tracks.begin();
|
||||||
|
itr != tracks.end();
|
||||||
|
++itr)
|
||||||
|
{
|
||||||
|
Track* track = itr->get();
|
||||||
|
|
||||||
|
fout<<"<trk>"<<std::endl;
|
||||||
|
fout<<"<desc>The track description</desc>"<<std::endl;
|
||||||
|
for(Track::TrackSegments::iterator itr = track->getTrackSegments().begin();
|
||||||
|
itr != track->getTrackSegments().end();
|
||||||
|
++itr)
|
||||||
|
{
|
||||||
|
TrackSegment* ts = itr->get();
|
||||||
|
fout<<"<trkseg>"<<std::endl;
|
||||||
|
|
||||||
|
for(TrackSegment::TrackPoints::iterator pitr = ts->getTrackPoints().begin();
|
||||||
|
pitr != ts->getTrackPoints().end();
|
||||||
|
++pitr)
|
||||||
|
{
|
||||||
|
fout<<"<trkpt lat=\""<<pitr->latitude<<"\" lon=\""<<pitr->longitude<<"\">"<<std::endl;
|
||||||
|
fout<<"<ele>"<<pitr->elevation<<"</ele>"<<std::endl;
|
||||||
|
fout<<"<time>"<<pitr->time<<"</time>"<<std::endl;
|
||||||
|
fout<<"</trkpt>"<<std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
fout<<"</trkseg>"<<std::endl;
|
||||||
|
|
||||||
|
}
|
||||||
|
fout<<"</trk>"<<std::endl;
|
||||||
|
}
|
||||||
|
fout<<"</gpx>"<<std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
osgViewer::Viewer viewer(arguments);
|
osgViewer::Viewer viewer(arguments);
|
||||||
viewer.setCameraManipulator(new osgGA::TerrainManipulator);
|
viewer.setCameraManipulator(new osgGA::TerrainManipulator);
|
||||||
viewer.setSceneData(group.get());
|
viewer.setSceneData(group.get());
|
||||||
|
Loading…
Reference in New Issue
Block a user