27 #include "../../../datatype/DateTime.h"
28 #include "../../../datatype/DateTimePeriod.h"
29 #include "../../../datatype/DateTimeInstant.h"
30 #include "../../../datatype/DateTimeUtils.h"
31 #include "../../../geometry/Geometry.h"
32 #include "../../../geometry/Utils.h"
33 #include "../../../sam/rtree/Index.h"
37 #include "../timeseries/TimeSeries.h"
38 #include "../interpolator/AbstractTrajectoryInterp.h"
39 #include "../interpolator/NearestGeometryAtTimeInterp.h"
66 m_interpolator(interp),
75 : m_observations(obs),
85 const std::string&
id)
86 : m_observations(obs),
87 m_interpolator(interp),
96 const std::string&
id)
98 m_interpolator(interp),
106 while(it!=patch.
end())
115 : m_observations(ph.m_observations),
116 m_interpolator(ph.m_interpolator),
137 TrajectoryObservationSet::const_iterator it = m_observations.begin();
138 while(it != m_observations.end())
150 return m_observations;
155 return m_interpolator;
160 m_interpolator = interp;
178 std::pair<te::dt::DateTimeShrPtr, te::gm::GeometryShrPtr> pr(t,g);
184 m_observations.insert(p);
186 m_rtree->insert(*env, p.first.get());
191 return m_observations.size();
196 TrajectoryObservationSet::const_iterator it = m_observations.begin();
202 TrajectoryObservationSet::const_iterator it = m_observations.end();
209 TrajectoryObservationSet::const_iterator it = m_observations.find(aux);
216 TrajectoryObservationSet::const_iterator it = m_observations.find(aux);
217 if(it!=m_observations.end())
218 return std::auto_ptr<te::gm::Geometry>(static_cast<te::gm::Geometry*>(it->second->clone()));
220 return std::auto_ptr<te::gm::Geometry>(m_interpolator->estimate(*
this,t));
233 return m_rtree->getMBR();
241 TrajectoryObservationSet::const_iterator itb = m_observations.
end();
242 TrajectoryObservationSet::const_iterator ite = m_observations.end();
248 itb = m_observations.upper_bound(shrdt);
253 itb = m_observations.find(shrdt);
254 if(itb==m_observations.end())
255 itb = m_observations.upper_bound(shrdt);
260 itb = m_observations.begin();
261 ite = m_observations.find(shrdt);
262 if(ite==m_observations.end())
263 ite = m_observations.upper_bound(shrdt);
268 itb = m_observations.begin();
269 ite = m_observations.upper_bound(shrdt);
276 itb = m_observations.find(t1);
277 if(itb==m_observations.end())
278 itb = m_observations.upper_bound(t1);
279 ite = m_observations.upper_bound(t2);
284 std::pair<TrajectoryObservationSet::const_iterator, TrajectoryObservationSet::const_iterator> itPair;
285 itPair = m_observations.equal_range(shrdt);
288 if(ite!= m_observations.end())
298 std::vector<TrajectoryPatch>& result)
const
305 std::vector<te::dt::DateTime*> report;
306 m_rtree->search(g, report);
309 std::vector<te::dt::DateTime*>::const_iterator itResultBegin = report.begin();
310 std::vector<te::dt::DateTime*>::const_iterator itResultEnd = report.end();
313 TrajectoryObservationSet::const_iterator itOriginBegin = m_observations.find(shrdt);
314 TrajectoryObservationSet::const_iterator itOriginEnd = m_observations.end();
316 TrajectoryObservationSet::const_iterator pathBegin;
317 TrajectoryObservationSet::const_iterator pathEnd;
319 while(itResultBegin!=itResultEnd && itOriginBegin!=itOriginEnd)
321 pathBegin = itOriginBegin;
324 while( (itResultBegin!=itResultEnd) && (itOriginBegin!=itOriginEnd) &&
325 (*itResultBegin == itOriginBegin->first.get()))
327 pathEnd = itOriginBegin;
334 if(pathEnd!=itOriginEnd)
340 if(itResultBegin!=itResultEnd)
342 shrdt.reset(static_cast<te::dt::DateTime*>((*itResultBegin)->clone()));
343 itOriginBegin = m_observations.find(shrdt);
352 std::vector<TrajectoryPatch>& result)
const
358 std::vector<te::dt::DateTime*> report;
359 m_rtree->search(*geom.
getMBR(), report);
363 std::vector<te::dt::DateTime*>::const_iterator itResultBegin = report.begin();
364 std::vector<te::dt::DateTime*>::const_iterator itResultEnd = report.end();
367 TrajectoryObservationSet::const_iterator itOriginBegin = m_observations.find(shrdt);
368 TrajectoryObservationSet::const_iterator itOriginEnd = m_observations.end();
370 TrajectoryObservationSet::const_iterator pathBegin;
371 TrajectoryObservationSet::const_iterator pathEnd;
373 while(itResultBegin!=itResultEnd && itOriginBegin!=itOriginEnd)
375 if(!geom.
intersects(itOriginBegin->second.get()))
378 if(itResultBegin!=itResultEnd)
380 shrdt.reset(static_cast<te::dt::DateTime*>((*itResultBegin)->clone()));
381 itOriginBegin = m_observations.find(shrdt);
386 pathBegin = itOriginBegin;
388 while( itResultBegin!=itResultEnd && itOriginBegin!=itOriginEnd
389 && (*itResultBegin == itOriginBegin->first.get())
390 && geom.
intersects(itOriginBegin->second.get()))
392 pathEnd = itOriginBegin;
394 if(itResultBegin!=itResultEnd)
396 shrdt.reset(static_cast<te::dt::DateTime*>((*itResultBegin)->clone()));
397 itOriginBegin = m_observations.find(shrdt);
403 if(pathEnd!=itOriginEnd)
417 std::vector<TrajectoryPatch>& result)
const
424 std::vector<TrajectoryPatch> res2;
427 std::vector<TrajectoryPatch>::const_iterator it = res2.begin();
429 TrajectoryObservationSet::const_iterator itObsEnd = m_observations.end();
431 while(it!=res2.end())
440 if(itAuxBegin!=tj.
end())
447 if(itAuxEnd==tj.
end())
469 std::vector<TrajectoryPatch>& result)
const
476 std::vector<TrajectoryPatch> res2;
479 std::vector<TrajectoryPatch>::const_iterator it = res2.begin();
481 TrajectoryObservationSet::const_iterator itObsEnd = m_observations.end();
483 while(it!=res2.end())
492 if(itAuxBegin!=tj.
end())
499 if(itAuxEnd==tj.
end())
520 const std::vector<TrajectoryPatch>& result)
const
527 TrajectoryObservationSet::const_iterator it = m_observations.begin();
529 while(it!=m_observations.end())
532 std::auto_ptr<te::gm::Geometry> otherGeom(other.
getGeometry(t));
534 double dist = it->second->distance(otherGeom.get());
537 result->add(static_cast<te::dt::DateTime*>(t->
clone()),dist);
545 std::auto_ptr<te::st::TimeSeries> res;
AbstractTrajectoryInterp * m_interpolator
The interpolator used to estimate non-observed times.
This file contains a class to represent a trajectory.
void setId(const std::string &id)
It sets the trajectory id.
A struct to represent a patch or a continuous piece of a trajectory.
virtual bool intersects(const Geometry *const rhs) const
It returns true if the geometry object spatially intersects rhs geometry.
A class that represents an R-tree.
TrajectoryIterator end() const
It returns an iterator that points to the end of the trajectory.
TrajectoryIterator end() const
TemporalRelation
Temporal relations between date and time (Source: Allen, 1991).
Trajectory()
Empty constructor.
An auxiliary struct to compare two datetime pointers.
SpatialRelation
Spatial relations between geometric objects.
It is an interpolation function the estimates the nearest geometry at a given non-observed time of a ...
const TrajectoryObservationSet & getObservations() const
It returns the trajectory observations.
std::auto_ptr< TimeSeries > getDistance(const Trajectory &other) const
It returns the distance between two trajectories.
TrajectoryIterator at(te::dt::DateTime *t) const
It returns an iterator that points to an observation at a given time.
std::map< te::dt::DateTimeShrPtr, te::gm::GeometryShrPtr, CompareShrDateTime > TrajectoryObservationSet
TrajectoryPatch getPatch(const te::dt::DateTime &dt, te::dt::TemporalRelation r=te::dt::DURING) const
It returns a trajectory subset that satisfies a given temporal relation.
boost::shared_ptr< DateTime > DateTimeShrPtr
TrajectoryObservationSet m_observations
The trajectory observations.
An abstract class for an interpolation function or interpolator that estimates geometries at non-obse...
SpatioTemporalRelation
An enum for the types of spatiotemporal relation.
std::pair< te::dt::DateTimeShrPtr, te::gm::GeometryShrPtr > TrajectoryObservation
std::string getId() const
It returns the trajectory id.
An Envelope defines a 2D rectangular region.
void getPatches(const te::gm::Envelope &g, te::gm::SpatialRelation r, std::vector< TrajectoryPatch > &result) const
It returns trajectory subsets that satisfy a given spatial relation.
std::auto_ptr< te::gm::Geometry > getGeometry(te::dt::DateTime *t) const
It returns the geometry associated to a given date and time.
void setInterpolator(AbstractTrajectoryInterp *interp)
It sets the interpolator associated to the path.
te::gm::Envelope getSpatialExtent() const
It returns the spatial extent of the trajectory observations.
Trajectory * clone() const
It returns a clone of this trajectory.
te::dt::DateTime * getTime() const
It returns the datetime pointed by the internal cursor.
Trajectory & operator=(const Trajectory &other)
Copy assignment operator.
Geometry is the root class of the geometries hierarchy, it follows OGC and ISO standards.
std::auto_ptr< te::dt::DateTimePeriod > getTemporalExtent() const
It returns the temporal extent of the trajectory observations.
std::size_t size() const
It returns the size of the trajectory observations.
TrajectoryIterator begin() const
virtual ~Trajectory()
Virtual destructor.
A class to represent time series.
A class to represent trajectory.
TjRTreeShrPtr m_rtree
The RTree to index the trajectory geometries.
TEDATATYPEEXPORT DateTimePeriod * GetTemporalExtent(const DateTime *t1, const DateTime *t2)
It returns the temporal extent of two date and time types.
std::string m_id
The trajectory identification.
A class to traverse the observations of a trajectory.
boost::shared_ptr< Geometry > GeometryShrPtr
void add(te::dt::DateTime *time, te::gm::Geometry *geom)
It adds an observation (time and geometry) into the trajectory.
virtual AbstractData * clone() const =0
It returns a clone of this object.
AbstractTrajectoryInterp * getInterpolator() const
It returns the interpolator associated to the trajectory.
const Envelope * getMBR() const
It returns the minimum bounding rectangle for the geometry in an internal representation.
TrajectoryIterator begin() const
It returns an iterator that points to the first observation of the trajectory.