OGR
ogr_geometry.h
Go to the documentation of this file.
1 /******************************************************************************
2  * $Id: ogr_geometry.h 23638 2011-12-22 21:02:56Z rouault $
3  *
4  * Project: OpenGIS Simple Features Reference Implementation
5  * Purpose: Classes for manipulating simple features that is not specific
6  * to a particular interface technology.
7  * Author: Frank Warmerdam, warmerdam@pobox.com
8  *
9  ******************************************************************************
10  * Copyright (c) 1999, Frank Warmerdam
11  *
12  * Permission is hereby granted, free of charge, to any person obtaining a
13  * copy of this software and associated documentation files (the "Software"),
14  * to deal in the Software without restriction, including without limitation
15  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
16  * and/or sell copies of the Software, and to permit persons to whom the
17  * Software is furnished to do so, subject to the following conditions:
18  *
19  * The above copyright notice and this permission notice shall be included
20  * in all copies or substantial portions of the Software.
21  *
22  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
23  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
25  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
27  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28  * DEALINGS IN THE SOFTWARE.
29  ****************************************************************************/
30 
31 #ifndef _OGR_GEOMETRY_H_INCLUDED
32 #define _OGR_GEOMETRY_H_INCLUDED
33 
34 #include "ogr_core.h"
35 #include "ogr_spatialref.h"
36 
47 {
48  public:
49  OGRRawPoint()
50  {
51  x = y = 0.0;
52  }
53  double x;
54  double y;
55 };
56 
57 typedef struct GEOSGeom_t *GEOSGeom;
58 
59 /************************************************************************/
60 /* OGRGeometry */
61 /************************************************************************/
62 
63 class OGRPoint;
64 
77 class CPL_DLL OGRGeometry
78 {
79  private:
80  OGRSpatialReference * poSRS; // may be NULL
81 
82  protected:
83  int nCoordDimension;
84 
85  public:
86  OGRGeometry();
87  virtual ~OGRGeometry();
88 
89  // standard IGeometry
90  virtual int getDimension() const = 0;
91  virtual int getCoordinateDimension() const;
92  virtual OGRBoolean IsEmpty() const = 0;
93  virtual OGRBoolean IsValid() const;
94  virtual OGRBoolean IsSimple() const;
95  virtual OGRBoolean IsRing() const;
96  virtual void empty() = 0;
97  virtual OGRGeometry *clone() const = 0;
98  virtual void getEnvelope( OGREnvelope * psEnvelope ) const = 0;
99  virtual void getEnvelope( OGREnvelope3D * psEnvelope ) const = 0;
100 
101  // IWks Interface
102  virtual int WkbSize() const = 0;
103  virtual OGRErr importFromWkb( unsigned char *, int=-1 )=0;
104  virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const = 0;
105  virtual OGRErr importFromWkt( char ** ppszInput ) = 0;
106  virtual OGRErr exportToWkt( char ** ppszDstText ) const = 0;
107 
108  // non-standard
109  virtual OGRwkbGeometryType getGeometryType() const = 0;
110  virtual const char *getGeometryName() const = 0;
111  virtual void dumpReadable( FILE *, const char * = NULL, char** papszOptions = NULL ) const;
112  virtual void flattenTo2D() = 0;
113  virtual char * exportToGML( const char* const * papszOptions = NULL ) const;
114  virtual char * exportToKML() const;
115  virtual char * exportToJson() const;
116  virtual GEOSGeom exportToGEOS() const;
117  virtual void closeRings();
118 
119  virtual void setCoordinateDimension( int nDimension );
120 
121  void assignSpatialReference( OGRSpatialReference * poSR );
122  OGRSpatialReference *getSpatialReference( void ) const { return poSRS; }
123 
124  virtual OGRErr transform( OGRCoordinateTransformation *poCT ) = 0;
125  OGRErr transformTo( OGRSpatialReference *poSR );
126 
127  virtual void segmentize(double dfMaxLength);
128 
129  // ISpatialRelation
130  virtual OGRBoolean Intersects( OGRGeometry * ) const;
131  virtual OGRBoolean Equals( OGRGeometry * ) const = 0;
132  virtual OGRBoolean Disjoint( const OGRGeometry * ) const;
133  virtual OGRBoolean Touches( const OGRGeometry * ) const;
134  virtual OGRBoolean Crosses( const OGRGeometry * ) const;
135  virtual OGRBoolean Within( const OGRGeometry * ) const;
136  virtual OGRBoolean Contains( const OGRGeometry * ) const;
137  virtual OGRBoolean Overlaps( const OGRGeometry * ) const;
138 // virtual OGRBoolean Relate( const OGRGeometry *, const char * ) const;
139 
140  virtual OGRGeometry *Boundary() const;
141  virtual double Distance( const OGRGeometry * ) const;
142  virtual OGRGeometry *ConvexHull() const;
143  virtual OGRGeometry *Buffer( double dfDist, int nQuadSegs = 30 ) const;
144  virtual OGRGeometry *Intersection( const OGRGeometry *) const;
145  virtual OGRGeometry *Union( const OGRGeometry * ) const;
146  virtual OGRGeometry *UnionCascaded() const;
147  virtual OGRGeometry *Difference( const OGRGeometry * ) const;
148  virtual OGRGeometry *SymDifference( const OGRGeometry * ) const;
149  virtual OGRErr Centroid( OGRPoint * poPoint ) const;
150  virtual OGRGeometry *Simplify(double dTolerance) const;
151  OGRGeometry *SimplifyPreserveTopology(double dTolerance) const;
152 
153  virtual OGRGeometry *Polygonize() const;
154 
155  // backward compatibility to non-standard method names.
156  OGRBoolean Intersect( OGRGeometry * ) const;
157  OGRBoolean Equal( OGRGeometry * ) const;
158  virtual OGRGeometry *SymmetricDifference( const OGRGeometry * ) const;
159  virtual OGRGeometry *getBoundary() const;
160 
161  // Special HACK for DB2 7.2 support
162  static int bGenerate_DB2_V72_BYTE_ORDER;
163 
164  virtual void swapXY();
165 };
166 
167 /************************************************************************/
168 /* OGRPoint */
169 /************************************************************************/
170 
177 class CPL_DLL OGRPoint : public OGRGeometry
178 {
179  double x;
180  double y;
181  double z;
182 
183  public:
184  OGRPoint();
185  OGRPoint( double x, double y );
186  OGRPoint( double x, double y, double z );
187  virtual ~OGRPoint();
188 
189  // IWks Interface
190  virtual int WkbSize() const;
191  virtual OGRErr importFromWkb( unsigned char *, int=-1 );
192  virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
193  virtual OGRErr importFromWkt( char ** );
194  virtual OGRErr exportToWkt( char ** ppszDstText ) const;
195 
196  // IGeometry
197  virtual int getDimension() const;
198  virtual OGRGeometry *clone() const;
199  virtual void empty();
200  virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
201  virtual void getEnvelope( OGREnvelope3D * psEnvelope ) const;
202  virtual OGRBoolean IsEmpty() const;
203 
204  // IPoint
205  double getX() const { return x; }
206  double getY() const { return y; }
207  double getZ() const { return z; }
208 
209  // Non standard
210  virtual void setCoordinateDimension( int nDimension );
211  void setX( double xIn ) { x = xIn; if (nCoordDimension == 0) nCoordDimension = 2; }
212  void setY( double yIn ) { y = yIn; if (nCoordDimension == 0) nCoordDimension = 2; }
213  void setZ( double zIn ) { z = zIn; nCoordDimension=3; }
214 
215  // ISpatialRelation
216  virtual OGRBoolean Equals( OGRGeometry * ) const;
217 
218  // Non standard from OGRGeometry
219  virtual const char *getGeometryName() const;
220  virtual OGRwkbGeometryType getGeometryType() const;
221  virtual OGRErr transform( OGRCoordinateTransformation *poCT );
222  virtual void flattenTo2D();
223 
224  virtual void swapXY();
225 };
226 
227 /************************************************************************/
228 /* OGRCurve */
229 /************************************************************************/
230 
235 class CPL_DLL OGRCurve : public OGRGeometry
236 {
237  public:
238  OGRCurve();
239  virtual ~OGRCurve();
240  // ICurve methods
241  virtual double get_Length() const = 0;
242  virtual void StartPoint(OGRPoint *) const = 0;
243  virtual void EndPoint(OGRPoint *) const = 0;
244  virtual int get_IsClosed() const;
245  virtual void Value( double, OGRPoint * ) const = 0;
246 
247 };
248 
249 /************************************************************************/
250 /* OGRLineString */
251 /************************************************************************/
252 
257 class CPL_DLL OGRLineString : public OGRCurve
258 {
259  protected:
260  int nPointCount;
261  OGRRawPoint *paoPoints;
262  double *padfZ;
263 
264  void Make3D();
265  void Make2D();
266 
267  public:
268  OGRLineString();
269  virtual ~OGRLineString();
270 
271  // IWks Interface
272  virtual int WkbSize() const;
273  virtual OGRErr importFromWkb( unsigned char *, int = -1 );
274  virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
275  virtual OGRErr importFromWkt( char ** );
276  virtual OGRErr exportToWkt( char ** ppszDstText ) const;
277 
278  // IGeometry interface
279  virtual int getDimension() const;
280  virtual OGRGeometry *clone() const;
281  virtual void empty();
282  virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
283  virtual void getEnvelope( OGREnvelope3D * psEnvelope ) const;
284  virtual OGRBoolean IsEmpty() const;
285 
286  // ICurve methods
287  virtual double get_Length() const;
288  virtual void StartPoint(OGRPoint *) const;
289  virtual void EndPoint(OGRPoint *) const;
290  virtual void Value( double, OGRPoint * ) const;
291 
292  // ILineString methods
293  int getNumPoints() const { return nPointCount; }
294  void getPoint( int, OGRPoint * ) const;
295  double getX( int i ) const { return paoPoints[i].x; }
296  double getY( int i ) const { return paoPoints[i].y; }
297  double getZ( int i ) const;
298 
299  // ISpatialRelation
300  virtual OGRBoolean Equals( OGRGeometry * ) const;
301 
302  // non standard.
303  virtual void setCoordinateDimension( int nDimension );
304  void setNumPoints( int );
305  void setPoint( int, OGRPoint * );
306  void setPoint( int, double, double );
307  void setPoint( int, double, double, double );
308  void setPoints( int, OGRRawPoint *, double * = NULL );
309  void setPoints( int, double * padfX, double * padfY,
310  double *padfZ = NULL );
311  void addPoint( OGRPoint * );
312  void addPoint( double, double );
313  void addPoint( double, double, double );
314 
315  void getPoints( OGRRawPoint *, double * = NULL ) const;
316  void getPoints( void* pabyX, int nXStride,
317  void* pabyY, int nYStride,
318  void* pabyZ = NULL, int nZStride = 0 ) const;
319 
320  void addSubLineString( const OGRLineString *,
321  int nStartVertex = 0, int nEndVertex = -1 );
322 
323  // non-standard from OGRGeometry
324  virtual OGRwkbGeometryType getGeometryType() const;
325  virtual const char *getGeometryName() const;
326  virtual OGRErr transform( OGRCoordinateTransformation *poCT );
327  virtual void flattenTo2D();
328  virtual void segmentize(double dfMaxLength);
329 
330  virtual void swapXY();
331 };
332 
333 /************************************************************************/
334 /* OGRLinearRing */
335 /************************************************************************/
336 
355 class CPL_DLL OGRLinearRing : public OGRLineString
356 {
357  private:
358  friend class OGRPolygon;
359 
360  // These are not IWks compatible ... just a convenience for OGRPolygon.
361  virtual int _WkbSize( int b3D ) const;
362  virtual OGRErr _importFromWkb( OGRwkbByteOrder, int b3D,
363  unsigned char *, int=-1 );
364  virtual OGRErr _exportToWkb( OGRwkbByteOrder, int b3D,
365  unsigned char * ) const;
366 
367  public:
368  OGRLinearRing();
370  ~OGRLinearRing();
371 
372  // Non standard.
373  virtual const char *getGeometryName() const;
374  virtual OGRGeometry *clone() const;
375  virtual int isClockwise() const;
376  virtual void reverseWindingOrder();
377  virtual void closeRings();
378  virtual double get_Area() const;
379  OGRBoolean isPointInRing(const OGRPoint* pt, int bTestEnvelope = TRUE) const;
380  OGRBoolean isPointOnRingBoundary(const OGRPoint* pt, int bTestEnvelope = TRUE) const;
381 
382  // IWks Interface - Note this isnt really a first class object
383  // for the purposes of WKB form. These methods always fail since this
384  // object cant be serialized on its own.
385  virtual int WkbSize() const;
386  virtual OGRErr importFromWkb( unsigned char *, int=-1 );
387  virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
388 };
389 
390 /************************************************************************/
391 /* OGRSurface */
392 /************************************************************************/
393 
398 class CPL_DLL OGRSurface : public OGRGeometry
399 {
400  public:
401  virtual double get_Area() const = 0;
402  virtual OGRErr PointOnSurface( OGRPoint * poPoint ) const = 0;
403 };
404 
405 /************************************************************************/
406 /* OGRPolygon */
407 /************************************************************************/
408 
418 class CPL_DLL OGRPolygon : public OGRSurface
419 {
420  int nRingCount;
421  OGRLinearRing **papoRings;
422 
423  public:
424  OGRPolygon();
425  virtual ~OGRPolygon();
426 
427  // Non standard (OGRGeometry).
428  virtual const char *getGeometryName() const;
429  virtual OGRwkbGeometryType getGeometryType() const;
430  virtual OGRGeometry *clone() const;
431  virtual void empty();
432  virtual OGRErr transform( OGRCoordinateTransformation *poCT );
433  virtual void flattenTo2D();
434  virtual OGRBoolean IsEmpty() const;
435  virtual void segmentize(double dfMaxLength);
436 
437  // ISurface Interface
438  virtual double get_Area() const;
439  virtual int PointOnSurface( OGRPoint * poPoint ) const;
440 
441  // IWks Interface
442  virtual int WkbSize() const;
443  virtual OGRErr importFromWkb( unsigned char *, int = -1 );
444  virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
445  virtual OGRErr importFromWkt( char ** );
446  virtual OGRErr exportToWkt( char ** ppszDstText ) const;
447 
448  // IGeometry
449  virtual int getDimension() const;
450  virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
451  virtual void getEnvelope( OGREnvelope3D * psEnvelope ) const;
452 
453  // ISpatialRelation
454  virtual OGRBoolean Equals( OGRGeometry * ) const;
455 
456  // Non standard
457  virtual void setCoordinateDimension( int nDimension );
458 
459  void addRing( OGRLinearRing * );
460  void addRingDirectly( OGRLinearRing * );
461 
462  OGRLinearRing *getExteriorRing();
463  const OGRLinearRing *getExteriorRing() const;
464  int getNumInteriorRings() const;
465  OGRLinearRing *getInteriorRing( int );
466  const OGRLinearRing *getInteriorRing( int ) const;
467 
468  OGRBoolean IsPointOnSurface( const OGRPoint * ) const;
469 
470  virtual void closeRings();
471 
472  virtual void swapXY();
473 };
474 
475 /************************************************************************/
476 /* OGRGeometryCollection */
477 /************************************************************************/
478 
486 class CPL_DLL OGRGeometryCollection : public OGRGeometry
487 {
488  int nGeomCount;
489  OGRGeometry **papoGeoms;
490 
491  OGRErr importFromWkbInternal( unsigned char * pabyData, int nSize, int nRecLevel );
492  OGRErr importFromWktInternal( char **ppszInput, int nRecLevel );
493 
494  public:
496  virtual ~OGRGeometryCollection();
497 
498  // Non standard (OGRGeometry).
499  virtual const char *getGeometryName() const;
500  virtual OGRwkbGeometryType getGeometryType() const;
501  virtual OGRGeometry *clone() const;
502  virtual void empty();
503  virtual OGRErr transform( OGRCoordinateTransformation *poCT );
504  virtual void flattenTo2D();
505  virtual OGRBoolean IsEmpty() const;
506  virtual void segmentize(double dfMaxLength);
507 
508  // IWks Interface
509  virtual int WkbSize() const;
510  virtual OGRErr importFromWkb( unsigned char *, int = -1 );
511  virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
512  virtual OGRErr importFromWkt( char ** );
513  virtual OGRErr exportToWkt( char ** ppszDstText ) const;
514 
515  virtual double get_Length() const;
516  virtual double get_Area() const;
517 
518  // IGeometry methods
519  virtual int getDimension() const;
520  virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
521  virtual void getEnvelope( OGREnvelope3D * psEnvelope ) const;
522 
523  // IGeometryCollection
524  int getNumGeometries() const;
525  OGRGeometry *getGeometryRef( int );
526  const OGRGeometry *getGeometryRef( int ) const;
527 
528  // ISpatialRelation
529  virtual OGRBoolean Equals( OGRGeometry * ) const;
530 
531  // Non standard
532  virtual void setCoordinateDimension( int nDimension );
533  virtual OGRErr addGeometry( const OGRGeometry * );
534  virtual OGRErr addGeometryDirectly( OGRGeometry * );
535  virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE );
536 
537  void closeRings();
538 
539  virtual void swapXY();
540 };
541 
542 /************************************************************************/
543 /* OGRMultiPolygon */
544 /************************************************************************/
545 
554 {
555  public:
556  OGRMultiPolygon();
557  // Non standard (OGRGeometry).
558  virtual const char *getGeometryName() const;
559  virtual OGRwkbGeometryType getGeometryType() const;
560  virtual OGRGeometry *clone() const;
561  virtual OGRErr importFromWkt( char ** );
562  virtual OGRErr exportToWkt( char ** ) const;
563 
564  // Non standard
565  virtual OGRErr addGeometryDirectly( OGRGeometry * );
566 
567  virtual double get_Area() const;
568 };
569 
570 /************************************************************************/
571 /* OGRMultiPoint */
572 /************************************************************************/
573 
578 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection
579 {
580  private:
581  OGRErr importFromWkt_Bracketed( char **, int bHasM, int bHasZ );
582 
583  public:
584  OGRMultiPoint();
585  // Non standard (OGRGeometry).
586  virtual const char *getGeometryName() const;
587  virtual OGRwkbGeometryType getGeometryType() const;
588  virtual OGRGeometry *clone() const;
589  virtual OGRErr importFromWkt( char ** );
590  virtual OGRErr exportToWkt( char ** ) const;
591 
592  // Non standard
593  virtual OGRErr addGeometryDirectly( OGRGeometry * );
594 };
595 
596 /************************************************************************/
597 /* OGRMultiLineString */
598 /************************************************************************/
599 
605 {
606  public:
609  // Non standard (OGRGeometry).
610  virtual const char *getGeometryName() const;
611  virtual OGRwkbGeometryType getGeometryType() const;
612  virtual OGRGeometry *clone() const;
613  virtual OGRErr importFromWkt( char ** );
614  virtual OGRErr exportToWkt( char ** ) const;
615 
616  // Non standard
617  virtual OGRErr addGeometryDirectly( OGRGeometry * );
618 };
619 
620 
621 /************************************************************************/
622 /* OGRGeometryFactory */
623 /************************************************************************/
624 
629 class CPL_DLL OGRGeometryFactory
630 {
631  static OGRErr createFromFgfInternal( unsigned char *pabyData,
632  OGRSpatialReference * poSR,
633  OGRGeometry **ppoReturn,
634  int nBytes,
635  int *pnBytesConsumed,
636  int nRecLevel );
637  public:
638  static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *,
639  OGRGeometry **, int = -1 );
640  static OGRErr createFromWkt( char **, OGRSpatialReference *,
641  OGRGeometry ** );
642  static OGRErr createFromFgf( unsigned char *, OGRSpatialReference *,
643  OGRGeometry **, int = -1, int * = NULL );
644  static OGRGeometry *createFromGML( const char * );
645  static OGRGeometry *createFromGEOS( GEOSGeom );
646 
647  static void destroyGeometry( OGRGeometry * );
648  static OGRGeometry *createGeometry( OGRwkbGeometryType );
649 
650  static OGRGeometry * forceToPolygon( OGRGeometry * );
651  static OGRGeometry * forceToMultiPolygon( OGRGeometry * );
652  static OGRGeometry * forceToMultiPoint( OGRGeometry * );
653  static OGRGeometry * forceToMultiLineString( OGRGeometry * );
654 
655  static OGRGeometry * organizePolygons( OGRGeometry **papoPolygons,
656  int nPolygonCount,
657  int *pbResultValidGeometry,
658  const char **papszOptions = NULL);
659 
660  static void *getGEOSGeometryFactory();
661 
662  static int haveGEOS();
663 
664  static OGRGeometry* transformWithOptions( const OGRGeometry* poSrcGeom,
666  char** papszOptions );
667 
668  static OGRGeometry*
669  approximateArcAngles( double dfX, double dfY, double dfZ,
670  double dfPrimaryRadius, double dfSecondaryAxis,
671  double dfRotation,
672  double dfStartAngle, double dfEndAngle,
673  double dfMaxAngleStepSizeDegrees );
674 };
675 
676 OGRwkbGeometryType CPL_DLL OGRFromOGCGeomType( const char *pszGeomType );
677 const char CPL_DLL * OGRToOGCGeomType( OGRwkbGeometryType eGeomType );
678 
679 #endif /* ndef _OGR_GEOMETRY_H_INCLUDED */

Generated for GDAL by doxygen 1.8.3.