VR-Forces Developer's Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
featureGeometry.h
Go to the documentation of this file.
1 /*******************************************************************************
2 ** Copyright (c) 2020 MAK Technologies, Inc.
3 ** All rights reserved.
4 *******************************************************************************/
5 
9 
10 #pragma once
11 
13 #include <features/proj.h>
14 
15 #include <geometry/point.h>
16 #include <vrfutil/objectCounter.h>
17 
18 #include <boost/function.hpp>
19 
20 #include <iosfwd>
21 #include <mutex>
22 
23 namespace MAKVRinTerra
24 {
41 #ifdef DtObjectDebugger_Enable
42  : public DtObjectDebugger<DtFeatureGeometry>
43 #endif
44  {
45  public:
48 
54  typedef int Type;
55 
56  static const int UnknownType = -1;
57  static const int PointType = 0;
58  static const int PathType = 1;
59  static const int AreaType = 2;
60 
61  template <Type T> class Handle;
62 
74 
75  typedef std::vector<DtFeatureGeometry> GeometryVector;
76  typedef std::vector<DtPoint> PointVector;
77 
78  class Implementation;
79  class EmptyImplementation;
80  class RelationshipMatrix;
81 
83  typedef std::shared_ptr<Implementation> ImplPtr;
84 
86  typedef std::shared_ptr<const Implementation> ImplCPtr;
87 
90  typedef std::string Hash;
91 
93  static std::string ToString(Type);
94 
96  static DtFeatureGeometry FromWKT(const std::string&, const DtProj&);
97 
99 
100  static Area MakeBox(Point, double length, double width, double rotation);
101  static Area MakeBox(const DtProj&, double xmin, double ymin, double xmax, double ymax);
102  static Area MakeBox(const DtProj::Bounds&);
104 
106 
107  static Area MakeArea(const DtProj&, const std::vector<DtPoint>& points);
108  static Area MakeArea(const DtProj&, const std::vector<DtVector>& points);
109  static Path MakePath(const DtProj&, const std::vector<DtPoint>& points);
110  static Path MakePath(const DtProj&, const std::vector<DtVector>& points);
112 
114 
115  static DtFeatureGeometry MakeSet(const GeometryVector&, const DtProj&);
116  static DtFeatureGeometry MakeSet(const GeometryVector&);
117 
118  template <typename Container>
119  static DtFeatureGeometry MakeSet(const Container& cont)
120  {
121  return MakeSet(GeometryVector(cont.begin(), cont.end()));
122  }
123 
124  template <typename Iterator>
125  static DtFeatureGeometry MakeSet(Iterator i, Iterator end)
126  {
127  return MakeSet(GeometryVector(i,end));
128  }
130 
132  static GeometryVector Flatten(DtFeatureGeometry);
133 
137  static std::vector<Path> MergeLines(DtFeatureGeometry);
138 
142  static DtFeatureGeometry SimplifySet(const GeometryVector&, const DtProj&);
143  static DtFeatureGeometry SimplifySet(const GeometryVector&);
144 
147 
149  //DtFeatureGeometry(const ImplPtr&);
150  DtFeatureGeometry(const ImplCPtr&);
151  DtFeatureGeometry(Implementation*);
152 
155 
157  template <Type T>
159  : myImpl(h.myImpl)
160  {
161  }
162 
163  DtFeatureGeometry& operator=(const DtFeatureGeometry&);
164 
165  template <Type T>
167  {
168  myImpl = h.myImpl;
169  return *this;
170  }
171 
173  Type type() const;
174 
176  std::string description() const;
177 
179  std::string toWKT() const;
180 
182  bool isValid() const;
183 
185  bool isEmpty() const;
186 
188  bool isUnknown() const;
189 
191  bool isPoint() const;
192 
194  bool isPath() const;
195 
197  bool isArea() const;
198 
200  unsigned dimension() const;
201 
204  Area asArea() const;
205 
207  Hash hash() const;
208 
211  template <typename T>
212  std::shared_ptr<T> cast();
213 
214  template <typename T>
215  std::shared_ptr<const T> cast() const;
216 
218  const DtProj& projection() const;
219 
221  typedef boost::function<DtPoint (const DtPoint&)> TransformFunction;
222 
224  void transform(const TransformFunction& func);
225 
227  void convert(const DtProj& p);
228 
230  void convertToLocalTopo();
231 
233  void prepare();
234 
235  DtFeatureGeometry simplify(double tolerance) const;
236 
238  unsigned numberOfPoints() const;
239 
242  std::unique_ptr<PointVector> points() const;
243 
245  std::unique_ptr<PointVector> pointsWithHeight() const;
246 
247  boost::optional<DtPoint> singlePointWithHeight() const;
248 
251  std::unique_ptr<PointVector> pointsWithoutHeight() const;
252 
254  unsigned numberOfSubGeometries() const;
255 
257  std::unique_ptr<GeometryVector> subGeometries() const;
258 
263  std::unique_ptr<RelationshipMatrix> relate(DtFeatureGeometry) const;
264 
266  bool equals(DtFeatureGeometry g) const;
267 
269  bool intersects(DtFeatureGeometry g) const;
270 
271  bool overlaps(DtFeatureGeometry g) const;
272 
273  bool crosses(DtFeatureGeometry g) const;
274 
275  bool covers(DtFeatureGeometry g) const;
276 
277  bool within(DtFeatureGeometry g) const;
278 
279  bool touches(DtFeatureGeometry g) const;
280 
281  bool contains(DtFeatureGeometry g) const;
282 
284  DtProj::Bounds bounds() const;
285 
287  DtFeatureGeometry extent() const;
288 
290  double length() const;
291 
293  double area() const;
294 
296  Point centroid() const;
297 
299  double distanceTo(DtFeatureGeometry g, const DtProj& p) const;
300 
302  DtFeatureGeometry unionWith(DtFeatureGeometry g) const;
303 
305  DtFeatureGeometry intersectionWith(DtFeatureGeometry g) const;
306 
308  DtFeatureGeometry differenceWith(DtFeatureGeometry g) const;
309 
311  DtFeatureGeometry buffer(double width) const;
312 
315  DtFeatureGeometry buffer(double width, unsigned quadrantSegments) const;
316 
319  DtFeatureGeometry bufferWithFlatCap(double width, unsigned segments) const;
320 
322  DtFeatureGeometry convexHull() const;
323 
325  DtFeatureGeometry boundary() const;
326 
329  DtFeatureGeometry::Point closestPointTo(
330  DtFeatureGeometry g, const DtProj&, double* distanceTo = 0) const;
331 
332  DtFeatureGeometry::Point closestPointTo(
333  DtFeatureGeometry g, double* distanceTo = 0) const;
334 
336  ImplPtr implementation();
337  ImplCPtr implementation() const;
338 
340  {
341  public:
342  virtual ~Mutex();
343 
344  virtual void lock() = 0;
345  virtual void unlock() = 0;
346  };
347 
348  protected:
351  class DT_DLL_features Lock : boost::noncopyable
352  {
353  public:
355  explicit Lock(const Implementation&);
356 
358  explicit Lock(const Implementation&, const Implementation&);
359 
361  ~Lock();
362 
363  private:
366  };
367 
369  };
370 
371  template <typename T>
372  std::shared_ptr<T> DtFeatureGeometry::cast()
373  {
374  return std::dynamic_pointer_cast<T>(implementation());
375  }
376 
377  template <typename T>
378  std::shared_ptr<const T> DtFeatureGeometry::cast() const
379  {
380  return std::dynamic_pointer_cast<const T>(implementation());
381  }
382 
384  class DT_DLL_features DtFeatureGeometry::Implementation
385  : public std::enable_shared_from_this<DtFeatureGeometry::Implementation>
386 #ifdef DtObjectDebugger_Enable
387  , public DtObjectDebugger<DtFeatureGeometry::Implementation>
388 #endif
389  {
390  public:
393 
395  typedef std::vector<DtFeatureGeometry> GeometryVector;
396  typedef std::vector<DtPoint> PointVector;
397 
398  virtual ~Implementation();
399 
400  virtual Mutex& getMutex() const;
401 
402  virtual std::string description() const;
403 
404  virtual std::string toWKT() const;
405 
406  virtual bool isValid() const;
407 
408  virtual bool isEmpty() const;
409 
410  virtual unsigned dimension() const;
411 
412  virtual Hash hash() const;
413 
415  virtual DtFeatureGeometry clone() const = 0;
416 
419  virtual bool unique() const;
420 
422  virtual const DtProj & projection() const = 0;
423 
424  typedef boost::function<DtPoint (const DtPoint&)> TransformFunction;
425 
426  virtual void transform(const TransformFunction&) = 0;
427 
429  virtual void convert(const DtProj &) = 0;
430 
432  virtual void prepare();
433 
434  virtual DtFeatureGeometry simplify(double tolerance) const;
435 
437  virtual Type type() const = 0;
438 
440  virtual unsigned numberOfPoints() const = 0;
441 
443  virtual std::unique_ptr<PointVector> points() const = 0;
444 
446  virtual boost::optional<DtPoint> singlePoint() const;
447 
449  virtual unsigned numberOfSubGeometries() const = 0;
450 
452  virtual std::unique_ptr<GeometryVector> subGeometries() const = 0;
453 
454  virtual std::unique_ptr<RelationshipMatrix> relate(DtFeatureGeometry) const;
455 
456  virtual bool equals(DtFeatureGeometry) const = 0;
457 
459  virtual bool intersects(DtFeatureGeometry) const = 0;
460 
461  virtual bool overlaps(DtFeatureGeometry) const = 0;
462 
463  virtual bool crosses(DtFeatureGeometry) const = 0;
464 
465  virtual bool covers(DtFeatureGeometry) const = 0;
466 
467  virtual bool within(DtFeatureGeometry) const = 0;
468 
469  virtual bool touches(DtFeatureGeometry) const = 0;
470 
471  virtual bool contains(DtFeatureGeometry) const = 0;
472 
474  virtual DtProj::Bounds bounds() const;
475 
477  virtual DtFeatureGeometry extent() const;
478 
479  virtual double length() const = 0;
480 
481  virtual double area() const = 0;
482 
484  virtual Point centroid() const = 0;
485 
487  virtual double distanceTo(DtFeatureGeometry, const DtProj &) const = 0;
488 
490  virtual DtFeatureGeometry unionWith(DtFeatureGeometry) const = 0;
491 
493  virtual DtFeatureGeometry intersectionWith(DtFeatureGeometry) const = 0;
494 
495  virtual DtFeatureGeometry differenceWith(DtFeatureGeometry) const = 0;
496 
498  virtual DtFeatureGeometry buffer(double width, unsigned segments) const = 0;
499 
501  virtual DtFeatureGeometry bufferWithFlatCap(double width, unsigned segments) const = 0;
502 
504  virtual DtFeatureGeometry convexHull() const = 0;
505 
506  virtual DtFeatureGeometry boundary() const = 0;
507 
510  virtual DtFeatureGeometry::Point closestPointTo(
511  DtFeatureGeometry, const DtProj&, double* distanceTo = 0) const = 0;
512 
514  {
515  private:
516  virtual void lock() override { myMutex.lock(); }
517 
518  virtual void unlock() override {
519  myMutex.unlock();
520  }
521 
522  std::recursive_mutex myMutex;
523  };
524 
525  protected:
526  explicit Implementation();
527  explicit Implementation(const Implementation&);
528 
531  };
532 
538 #ifdef DtObjectDebugger_Enable
539  , public DtObjectDebugger<DtFeatureGeometry::Implementation>
540 #endif
541  {
542  public:
543  typedef std::shared_ptr<EmptyImplementation> Ptr;
544 
546 
547  virtual DtFeatureGeometry clone() const override;
548 
549  virtual const DtProj& projection() const override;
550  virtual void transform(const TransformFunction&) override;
551  virtual void convert(const DtProj&) override;
552  virtual Type type() const override;
553  virtual bool isValid() const override;
554 
555  virtual unsigned numberOfPoints() const override;
556  virtual std::unique_ptr<PointVector> points() const override;
557  virtual boost::optional<DtPoint> singlePoint() const override;
558 
559  virtual unsigned numberOfSubGeometries() const override;
560  virtual std::unique_ptr<GeometryVector> subGeometries() const override;
561 
562  virtual Point centroid() const override;
563  virtual bool equals(DtFeatureGeometry) const override;
564  virtual bool intersects(DtFeatureGeometry) const override;
565  virtual bool overlaps(DtFeatureGeometry) const override;
566  virtual bool crosses(DtFeatureGeometry) const override;
567  virtual bool covers(DtFeatureGeometry) const override;
568  virtual bool within(DtFeatureGeometry) const override;
569  virtual bool touches(DtFeatureGeometry) const override;
570  virtual bool contains(DtFeatureGeometry) const override;
571  virtual double length() const override;
572  virtual double area() const override;
573  virtual double distanceTo(DtFeatureGeometry, const DtProj&) const override;
574  virtual DtFeatureGeometry unionWith(DtFeatureGeometry g) const override;
575  virtual DtFeatureGeometry intersectionWith(DtFeatureGeometry g) const override;
576  virtual DtFeatureGeometry differenceWith(DtFeatureGeometry g) const override;
577  virtual DtFeatureGeometry buffer(double width, unsigned segments) const override;
578  virtual DtFeatureGeometry bufferWithFlatCap(double width, unsigned segments) const override;
579  virtual DtFeatureGeometry convexHull() const override;
580  virtual DtFeatureGeometry boundary() const override;
582  DtFeatureGeometry g, const DtProj&, double* distanceTo = 0) const override;
583 
584  private:
586  };
587 
588  class DT_DLL_features DtFeatureGeometry::RelationshipMatrix
589  : boost::noncopyable
590 #ifdef DtObjectDebugger_Enable
591  , public DtObjectDebugger<DtFeatureGeometry::RelationshipMatrix>
592 #endif
593  {
594  public:
595  virtual ~RelationshipMatrix();
596 
597  virtual bool equals() const;
598  virtual bool intersects() const;
599  virtual bool disjoint() const;
600  virtual bool covers() const;
601  virtual bool coveredBy() const;
602  virtual bool within() const;
603  virtual bool touches() const;
604  virtual bool overlaps() const;
605  virtual bool crosses() const;
606  virtual bool contains() const;
607  };
608 
609  template <>
610  class DT_DLL_features DtFeatureGeometry::Handle<DtFeatureGeometry::PointType>
611  : public DtFeatureGeometry
612  {
613  public:
614  friend class DtFeatureGeometry;
615 
616  static DtFeatureGeometry::Point Make(const DtPoint& p, const DtProj& proj);
617  static DtFeatureGeometry::Point Make(const DtVector& v, const DtProj& proj);
618 
619  Handle();
620  Handle(const DtFeatureGeometry&);
624  Handle(const DtFeatureGeometry&, bool fastCreation);
625  Handle(const Implementation::Ptr&);
626 
627  Handle(const DtPoint&, const DtProj& proj);
628  Handle(const DtVector&, const DtProj& proj);
629 
630  DtPoint point() const;
631  DtPoint pointWithHeight() const;
632  DtPoint pointWithoutHeight() const;
633  };
634 
635  template <>
636  class DT_DLL_features DtFeatureGeometry::Handle<DtFeatureGeometry::PathType>
637  : public DtFeatureGeometry
638  {
639  public:
640  friend class DtFeatureGeometry;
641 
642  typedef std::vector<DtFeatureGeometry::Path> Vector;
643 
644  static DtFeatureGeometry::Path Make(const PointVector& points, const DtProj& proj);
645 
646  static DtFeatureGeometry::Path Make(
647  const DtPoint& p1, const DtPoint& p2,
648  const DtProj& proj);
649 
650  static DtFeatureGeometry::Path Make(
651  const DtPoint& p1, const DtPoint& p2, const DtPoint& p3,
652  const DtProj& proj);
653 
654  template <typename Container>
655  static DtFeatureGeometry::Path Make(const Container& cont, const DtProj& proj)
656  {
657  return Make(PointVector(cont.begin(), cont.end()), proj);
658  }
659 
660  template <typename Iterator>
661  static DtFeatureGeometry::Path Make(Iterator i, Iterator end, const DtProj& proj)
662  {
663  return Make(PointVector(i,end), proj);
664  }
665 
666  Handle();
667  Handle(const DtFeatureGeometry&);
668  Handle(const Implementation::Ptr&);
669 
670  Path reversed() const;
671  };
672 
673  template <>
674  class DT_DLL_features DtFeatureGeometry::Handle<DtFeatureGeometry::AreaType>
675  : public DtFeatureGeometry
676  {
677  public:
678  friend class DtFeatureGeometry;
679 
680  typedef std::vector<DtFeatureGeometry::Area> Vector;
681 
682  Handle();
683  Handle(const DtFeatureGeometry&);
684  Handle(const Implementation::Ptr&);
685 
686  static DtFeatureGeometry::Area Make(const PointVector& points, const DtProj& proj);
687 
688  Path outerBoundary() const;
689 
690  unsigned numberOfHoles() const;
691  std::unique_ptr<GeometryVector> holes() const;
692 
693  Path findShortestPerimeter(Path) const;
694  };
695 
696  DT_DLL_features std::ostream& operator<< (std::ostream&, const DtFeatureGeometry&);
697 }
698 
701 DT_DEFINE_OBJECT_DEBUGGER_NAME(MAKVRinTerra::DtFeatureGeometry::RelationshipMatrix);
virtual const DtProj & projection() const override
#define DT_DLL_features
stop complaining about multiple independent base classes for boost::noncopyable this should probably ...
Definition: featuresDefines.h:41
virtual void transform(const TransformFunction &) override
std::vector< DtPoint > PointVector
Definition: featureGeometry.h:76
DtTaggedException< struct InvalidGeometryTag > InvalidGeometry
Definition: featureGeometry.h:46
virtual std::unique_ptr< GeometryVector > subGeometries() const override
int Type
Type of geometry represented.
Definition: featureGeometry.h:54
virtual void convert(const DtProj &) override
std::shared_ptr< const DtProj > CPtr
Definition: proj.h:56
virtual bool contains(DtFeatureGeometry) const override
MutexType myMutex
Definition: featureGeometry.h:530
std::shared_ptr< Implementation > ImplPtr
Shared pointer to Implementation.
Definition: featureGeometry.h:80
Mutex * mutex2
Definition: featureGeometry.h:365
DtFeatureGeometry::Type Type
Definition: featureGeometry.h:394
virtual DtFeatureGeometry::Point closestPointTo(DtFeatureGeometry g, const DtProj &, double *distanceTo=0) const override
DtFeatureGeometry(const Handle< T > &h)
Create a geometry from a handle.
Definition: featureGeometry.h:158
Definition: featureGeometry.h:513
virtual boost::optional< DtPoint > singlePoint() const override
std::vector< DtFeatureGeometry::Path > Vector
Definition: featureGeometry.h:642
std::string Hash
DtFeatureGeometry caches the hashes for the geometries can be differentiated quickly.
Definition: featureGeometry.h:90
ImplPtr implementation()
Get implementation of this geometry.
#define DT_DEFINE_OBJECT_DEBUGGER_NAME(type)
Definition: objectCounter.h:31
Default on in debug, off in release.
Definition: objectCounter.h:27
Definition: featureGeometry.h:61
DT_DLL_features std::ostream & operator<<(std::ostream &, const DtFeatureTransform &)
std::ostream output.
Definition: proj.h:76
Handle< AreaType > Area
Definition: featureGeometry.h:72
static DtFeatureGeometry MakeSet(const Container &cont)
Functions for creating set or collection geometries.
Definition: featureGeometry.h:119
Definition: featureGeometry.h:339
virtual unsigned numberOfPoints() const override
virtual bool covers(DtFeatureGeometry) const override
ImplPtr myImpl
Definition: featureGeometry.h:368
virtual void lock() override
Definition: featureGeometry.h:516
DtFeatureGeometry::ImplCPtr CPtr
Definition: featureGeometry.h:392
virtual bool touches(DtFeatureGeometry) const override
DtTaggedException< struct BadGeometryCastTag > BadGeometryCast
Definition: featureGeometry.h:47
virtual DtFeatureGeometry boundary() const override
Handle< PointType > Point
Definition: featureGeometry.h:70
Represents some coordinate system. The terms &quot;coordinate system&quot;, &quot;projection&quot;, &quot;spatial reference&quot;...
Definition: proj.h:52
virtual bool intersects(DtFeatureGeometry) const override
std::shared_ptr< EmptyImplementation > Ptr
Definition: featureGeometry.h:543
virtual unsigned numberOfSubGeometries() const override
virtual std::unique_ptr< PointVector > points() const override
Mutex * mutex1
Definition: featureGeometry.h:364
virtual bool equals(DtFeatureGeometry) const override
virtual DtFeatureGeometry convexHull() const override
Scoped lock which will lock two Implementation mutexes in a predefined order to avoid deadlock...
Definition: featureGeometry.h:351
Handle< PathType > Path
Definition: featureGeometry.h:71
virtual bool crosses(DtFeatureGeometry) const override
virtual DtFeatureGeometry buffer(double width, unsigned segments) const override
std::vector< DtFeatureGeometry::Area > Vector
Definition: featureGeometry.h:680
boost::function< DtPoint(const DtPoint &)> TransformFunction
Callback for transform().
Definition: featureGeometry.h:221
virtual DtFeatureGeometry unionWith(DtFeatureGeometry g) const override
Create a new MAK exception type that inherits from boost::exception. Tag is what differentiates this ...
Definition: taggedException.h:15
virtual DtFeatureGeometry clone() const override
virtual double distanceTo(DtFeatureGeometry, const DtProj &) const override
static DtFeatureGeometry::Path Make(Iterator i, Iterator end, const DtProj &proj)
Definition: featureGeometry.h:661
DtFeatureGeometry Unknown
Definition: featureGeometry.h:69
virtual void unlock() override
Definition: featureGeometry.h:518
std::vector< DtFeatureGeometry > GeometryVector
Definition: featureGeometry.h:75
DtProj::CPtr myProjection
Definition: featureGeometry.h:585
Implementation which represents an empty geometry. Empty geometry do have 0 points, do not intersect with any other geometries, and are infinitely far away from all other geometries.
Definition: featureGeometry.h:536
std::shared_ptr< const Implementation > ImplCPtr
Shared pointer to const Implementation.
Definition: featureGeometry.h:86
DT_DLL_VRVCORE double length(const makVrv::DtCoordinateSystem &, const std::vector< DtVector > &vertices)
Returns the total distance of a segmented line defined by the provided vector of vertices. Coordinates are in local database coordinates. The coordinate system is used to convert between the local database coordinates and geocentric. All distance is in 2D – the Z value is ignored.
static DtFeatureGeometry::Path Make(const Container &cont, const DtProj &proj)
Definition: featureGeometry.h:655
virtual DtFeatureGeometry differenceWith(DtFeatureGeometry g) const override
Hash myHash
Definition: featureGeometry.h:529
DT_DLL_vrfutil bool intersects(const DtVector &localPoint1, const DtVector &localPoint2, const DtLocalVertexList &localVertexList, const Coordinate_System &coordinateSystem)
Returns true if the line segment localPoint1-localPoint2 intersects any line segment in localVert...
virtual bool within(DtFeatureGeometry) const override
std::shared_ptr< T > cast()
Get implementation as a specific type.
Definition: featureGeometry.h:372
std::recursive_mutex myMutex
Definition: featureGeometry.h:522
DtFeatureGeometry::ImplPtr Ptr
Definition: featureGeometry.h:391
virtual DtFeatureGeometry bufferWithFlatCap(double width, unsigned segments) const override
virtual DtFeatureGeometry intersectionWith(DtFeatureGeometry g) const override
Represents a feature geometry.
Definition: featureGeometry.h:40
Definition: point.h:34
DtFeatureGeometry & operator=(const Handle< T > &h)
Definition: featureGeometry.h:166
virtual bool overlaps(DtFeatureGeometry) const override
static DtFeatureGeometry MakeSet(Iterator i, Iterator end)
Functions for creating set or collection geometries.
Definition: featureGeometry.h:125

Document ID: Generated on Thu Oct 23 22:29:17 EDT 2025 from SVN revision 280951
Copyright © 2005-2024 MAK Technologies. All Rights Reserved (www.mak.com)