1 /******************************************************************************
2  *
3  * Project:  OpenGIS Simple Features Reference Implementation
4  * Purpose:  Classes for manipulating simple features that is not specific
5  *           to a particular interface technology.
6  * Author:   Frank Warmerdam, warmerda@home.com
7  *
8  ******************************************************************************
9  * Copyright (c) 1999, Frank Warmerdam
10  *
11  * Permission is hereby granted, free of charge, to any person obtaining a
12  * copy of this software and associated documentation files (the "Software"),
13  * to deal in the Software without restriction, including without limitation
14  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15  * and/or sell copies of the Software, and to permit persons to whom the
16  * Software is furnished to do so, subject to the following conditions:
17  *
18  * The above copyright notice and this permission notice shall be included
19  * in all copies or substantial portions of the Software.
20  *
21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27  * DEALINGS IN THE SOFTWARE.
28  ******************************************************************************
29  *
30  */
31 
32 #ifndef _OGR_GEOMETRY_H_INCLUDED
33 #define _OGR_GEOMETRY_H_INCLUDED
34 
35 #include "ogr_core.h"
36 #include "ogr_spatialref.h"
37 
38 /**
39  * \file ogr_geometry.h
40  *
41  * Simple feature geometry classes.
42  */
43 
44 /**
45  * Simple container for a position.
46  */
47 class OGRRawPoint
48 {
49   public:
OGRRawPoint()50           OGRRawPoint()
51           {
52                   x = y = 0.0;
53           }
54     double      x;
55     double      y;
56 };
57 
58 
59 /************************************************************************/
60 /*                             OGRGeometry                              */
61 /************************************************************************/
62 
63 /**
64  * Abstract base class for all geometry classes.
65  *
66  * Note that the family of spatial analysis methods (Equal(), Disjoint(), ...,
67  * ConvexHull(), Buffer(), ...) are not implemented at ths time.  Some other
68  * required and optional geometry methods have also been omitted at this
69  * time.
70  */
71 
72 class CPL_DLL OGRGeometry
73 {
74   private:
75     OGRSpatialReference * poSRS;                // may be NULL
76 
77   public:
78                 OGRGeometry();
79     virtual     ~OGRGeometry();
80 
81     // standard IGeometry
82     virtual int getDimension() const = 0;
83     virtual int getCoordinateDimension() const = 0;
IsEmpty()84     virtual OGRBoolean  IsEmpty() const { return 0; }
IsSimple()85     virtual OGRBoolean  IsSimple() const { return 1; }
86     virtual void        empty() = 0;
87     virtual OGRGeometry *clone() const = 0;
88     virtual void getEnvelope( OGREnvelope * psEnvelope ) const = 0;
89 
90     // IWks Interface
91     virtual int WkbSize() const = 0;
92     virtual OGRErr importFromWkb( unsigned char *, int=-1 )=0;
93     virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const = 0;
94     virtual OGRErr importFromWkt( char ** ppszInput ) = 0;
95     virtual OGRErr exportToWkt( char ** ppszDstText ) const = 0;
96 
97     // non-standard
98     virtual OGRwkbGeometryType getGeometryType() const = 0;
99     virtual const char *getGeometryName() const = 0;
100     virtual void   dumpReadable( FILE *, const char * = NULL );
101     virtual void   flattenTo2D() = 0;
102 
103     void    assignSpatialReference( OGRSpatialReference * poSR );
getSpatialReference(void)104     OGRSpatialReference *getSpatialReference( void ) const { return poSRS; }
105 
106     virtual OGRErr  transform( OGRCoordinateTransformation *poCT ) = 0;
107     OGRErr  transformTo( OGRSpatialReference *poSR );
108 
109     // ISpatialRelation
110     virtual OGRBoolean  Intersect( OGRGeometry * ) const;
111     virtual OGRBoolean  Equal( OGRGeometry * ) const = 0;
112 
113 #ifdef notdef
114 
115     // I presume all these should be virtual?  How many
116     // should be pure?
117     OGRGeometry *getBoundary();
118 
119     OGRBoolean  Disjoint( OGRGeometry * );
120     OGRBoolean  Touch( OGRGeometry * );
121     OGRBoolean  Cross( OGRGeometry * );
122     OGRBoolean  Within( OGRGeometry * );
123     OGRBoolean  Contains( OGRGeometry * );
124     OGRBoolean  Overlap( OGRGeometry * );
125     OGRBoolean  Relate( OGRGeometry *, const char * );
126 
127     double      Distance( OGRGeometry * );
128     OGRGeometry *Intersection(OGRGeometry *);
129     OGRGeometry *Buffer( double );
130     OGRGeometry *ConvexHull();
131     OGRGeometry *Union( OGRGeometry * );
132     OGRGeometry *Difference( OGRGeometry * );
133     OGRGeometry *SymmetricDifference( OGRGeometry * );
134 #endif
135 
136     // Special HACK for DB2 7.2 support
137     static int bGenerate_DB2_V72_BYTE_ORDER;
138 };
139 
140 /************************************************************************/
141 /*                               OGRPoint                               */
142 /************************************************************************/
143 
144 /**
145  * Point class.
146  *
147  * Implements SFCOM IPoint methods.
148  */
149 
150 class CPL_DLL OGRPoint : public OGRGeometry
151 {
152     double      x;
153     double      y;
154     double      z;
155     int         nQual;              // Point Positional accuracy declaration
156                                     // Obtained from geometry record attributes
157                                     // Field=ATTV
158                                     //    Subfields ATTL = 402
159                                     //              ATVL = 1-11
160 
161   public:
162                 OGRPoint();
163                 OGRPoint( double x, double y, double z = 0.0 );
164     virtual     ~OGRPoint();
165 
166     // IWks Interface
167     virtual int WkbSize() const;
168     virtual OGRErr importFromWkb( unsigned char *, int=-1 );
169     virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
170     virtual OGRErr importFromWkt( char ** );
171     virtual OGRErr exportToWkt( char ** ppszDstText ) const;
172 
173     // IGeometry
174     virtual int getDimension() const;
175     virtual int getCoordinateDimension() const;
176     virtual OGRGeometry *clone() const;
177     virtual void empty();
178     virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
179 
180     // IPoint
getX()181     double      getX() const { return x; }
getY()182     double      getY() const { return y; }
getZ()183     double      getZ() const { return z; }
getnQual()184     int         getnQual() const { return nQual; }
185 
186     // Non standard
setX(double xIn)187     void        setX( double xIn ) { x = xIn; }
setY(double yIn)188     void        setY( double yIn ) { y = yIn; }
setZ(double zIn)189     void        setZ( double zIn ) { z = zIn; }
setnQual(int q)190     void        setnQual( int q ) { nQual = q; }
191 
192     // ISpatialRelation
193     virtual OGRBoolean  Equal( OGRGeometry * ) const;
194 
195     // Non standard from OGRGeometry
196     virtual const char *getGeometryName() const;
197     virtual OGRwkbGeometryType getGeometryType() const;
198     virtual OGRErr  transform( OGRCoordinateTransformation *poCT );
199     virtual void flattenTo2D();
200 
201 };
202 
203 /************************************************************************/
204 /*                               OGRCurve                               */
205 /************************************************************************/
206 
207 /**
208  * Abstract curve base class.
209  */
210 
211 class CPL_DLL OGRCurve : public OGRGeometry
212 {
213   public:
214             OGRCurve();
215     virtual ~OGRCurve();
216     // ICurve methods
217     virtual double get_Length() const = 0;
218     virtual void StartPoint(OGRPoint *) const = 0;
219     virtual void EndPoint(OGRPoint *) const = 0;
220     virtual int  get_IsClosed() const;
221     virtual void Value( double, OGRPoint * ) const = 0;
222 
223 };
224 
225 /************************************************************************/
226 /*                            OGRLineString                             */
227 /************************************************************************/
228 
229 /**
230  * Concrete representation of a multi-vertex line.
231  */
232 
233 class CPL_DLL OGRLineString : public OGRCurve
234 {
235   protected:
236     int         nPointCount;
237     OGRRawPoint *paoPoints;
238     double      *padfZ;
239 
240     void        Make3D();
241     void        Make2D();
242 
243   public:
244                 OGRLineString();
245     virtual     ~OGRLineString();
246 
247     // IWks Interface
248     virtual int WkbSize() const;
249     virtual OGRErr importFromWkb( unsigned char *, int = -1 );
250     virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
251     virtual OGRErr importFromWkt( char ** );
252     virtual OGRErr exportToWkt( char ** ppszDstText ) const;
253 
254     // IGeometry interface
255     virtual int getDimension() const;
256     virtual int getCoordinateDimension() const;
257     virtual OGRGeometry *clone() const;
258     virtual void empty();
259     virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
260 
261     // ICurve methods
262     virtual double get_Length() const;
263     virtual void StartPoint(OGRPoint *) const;
264     virtual void EndPoint(OGRPoint *) const;
265     virtual void Value( double, OGRPoint * ) const;
266 
267     // ILineString methods
getNumPoints()268     int         getNumPoints() const { return nPointCount; }
269     void        getPoint( int, OGRPoint * ) const;
getX(int i)270     double      getX( int i ) const { return paoPoints[i].x; }
getY(int i)271     double      getY( int i ) const { return paoPoints[i].y; }
272     double      getZ( int i ) const;
273 
274     // ISpatialRelation
275     virtual OGRBoolean  Equal( OGRGeometry * ) const;
276 
277     // non standard.
278     void        setNumPoints( int );
279     void        setPoint( int, OGRPoint * );
280     void        setPoint( int, double, double, double = 0.0 );
281     void        setPoints( int, OGRRawPoint *, double * = NULL );
282     void        setPoints( int, double * padfX, double * padfY,
283                            double *padfZ = NULL );
284     void        addPoint( OGRPoint * );
285     void        addPoint( double, double, double = 0.0 );
286 
287     // non-standard from OGRGeometry
288     virtual OGRwkbGeometryType getGeometryType() const;
289     virtual const char *getGeometryName() const;
290     virtual OGRErr  transform( OGRCoordinateTransformation *poCT );
291     virtual void flattenTo2D();
292 
293 };
294 
295 /************************************************************************/
296 /*                            OGRLinearRing                             */
297 /*                                                                      */
298 /*      This is an alias for OGRLineString for now.                     */
299 /************************************************************************/
300 
301 /**
302  * Concrete representation of a closed ring.
303  *
304  * This class is functionally equivelent to an OGRLineString, but has a
305  * separate identity to maintain alignment with the OpenGIS simple feature
306  * data model.  It exists to serve as a component of an OGRPolygon.
307  */
308 
309 class CPL_DLL OGRLinearRing : public OGRLineString
310 {
311   private:
312     friend class OGRPolygon;
313 
314     // These are not IWks compatible ... just a convenience for OGRPolygon.
315     virtual int _WkbSize( int b3D ) const;
316     virtual OGRErr _importFromWkb( OGRwkbByteOrder, int b3D,
317                                    unsigned char *, int=-1 );
318     virtual OGRErr _exportToWkb( OGRwkbByteOrder, int b3D,
319                                  unsigned char * ) const;
320 
321   public:
322                         OGRLinearRing();
323                         OGRLinearRing( OGRLinearRing * );
324                         ~OGRLinearRing();
325 
326     // Non standard.
327     virtual const char *getGeometryName() const;
328     virtual OGRGeometry *clone() const;
329     virtual int isClockwise() const;
330 
331     // IWks Interface - Note this isnt really a first class object
332     // for the purposes of WKB form.  These methods always fail since this
333     // object cant be serialized on its own.
334     virtual int WkbSize() const;
335     virtual OGRErr importFromWkb( unsigned char *, int=-1 );
336     virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
337 };
338 
339 /************************************************************************/
340 /*                              OGRSurface                              */
341 /************************************************************************/
342 
343 /**
344  * Abstract base class for 2 dimensional objects like polygons.
345  */
346 
347 class CPL_DLL OGRSurface : public OGRGeometry
348 {
349   public:
350     virtual double      get_Area() const = 0;
351     virtual OGRErr      Centroid( OGRPoint * poPoint ) const = 0;
352     virtual OGRErr      PointOnSurface( OGRPoint * poPoint ) const = 0;
353 };
354 
355 /************************************************************************/
356 /*                              OGRPolygon                              */
357 /************************************************************************/
358 
359 /**
360  * Concrete class representing polygons.
361  *
362  * Note that the OpenGIS simple features polygons consist of one outer
363  * ring, and zero or more inner rings.  A polygon cannot represent disconnected
364  * regions (such as multiple islands in a political body).  The
365  * OGRMultiPolygon must be used for this.
366  */
367 
368 class CPL_DLL OGRPolygon : public OGRSurface
369 {
370     int         nRingCount;
371     OGRLinearRing **papoRings;
372 
373   public:
374                 OGRPolygon();
375     virtual     ~OGRPolygon();
376 
377     // Non standard (OGRGeometry).
378     virtual const char *getGeometryName() const;
379     virtual OGRwkbGeometryType getGeometryType() const;
380     virtual OGRGeometry *clone() const;
381     virtual void empty();
382     virtual OGRErr  transform( OGRCoordinateTransformation *poCT );
383     virtual void flattenTo2D();
384 
385     // ISurface Interface
386     virtual double      get_Area() const;
387     virtual int         Centroid( OGRPoint * poPoint ) const;
388     virtual int         PointOnSurface( OGRPoint * poPoint ) const;
389 
390     // IWks Interface
391     virtual int WkbSize() const;
392     virtual OGRErr importFromWkb( unsigned char *, int = -1 );
393     virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
394     virtual OGRErr importFromWkt( char ** );
395     virtual OGRErr exportToWkt( char ** ppszDstText ) const;
396 
397     // IGeometry
398     virtual int getDimension() const;
399     virtual int getCoordinateDimension() const;
400     virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
401 
402     // ISpatialRelation
403     virtual OGRBoolean  Equal( OGRGeometry * ) const;
404 
405     // Non standard
406     void        addRing( OGRLinearRing * );
407     void        addRingDirectly( OGRLinearRing * );
408 
409     OGRLinearRing *getExteriorRing();
410     const OGRLinearRing *getExteriorRing() const;
411     int         getNumInteriorRings() const;
412     OGRLinearRing *getInteriorRing( int );
413     const OGRLinearRing *getInteriorRing( int ) const;
414 };
415 
416 /************************************************************************/
417 /*                        OGRGeometryCollection                         */
418 /************************************************************************/
419 
420 /**
421  * A collection of 1 or more geometry objects.
422  *
423  * All geometries must share a common spatial reference system, and
424  * Subclasses may impose additional restrictions on the contents.
425  */
426 
427 class CPL_DLL OGRGeometryCollection : public OGRGeometry
428 {
429     int         nGeomCount;
430     OGRGeometry **papoGeoms;
431 
432     int         nCoordinateDimension;
433 
434   public:
435                 OGRGeometryCollection();
436     virtual     ~OGRGeometryCollection();
437 
438     // Non standard (OGRGeometry).
439     virtual const char *getGeometryName() const;
440     virtual OGRwkbGeometryType getGeometryType() const;
441     virtual OGRGeometry *clone() const;
442     virtual void empty();
443     virtual OGRErr  transform( OGRCoordinateTransformation *poCT );
444     virtual void flattenTo2D();
445 
446     // IWks Interface
447     virtual int WkbSize() const;
448     virtual OGRErr importFromWkb( unsigned char *, int = -1 );
449     virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
450     virtual OGRErr importFromWkt( char ** );
451     virtual OGRErr exportToWkt( char ** ppszDstText ) const;
452 
453     // IGeometry methods
454     virtual int getDimension() const;
455     virtual int getCoordinateDimension() const;
456     virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
457 
458     // IGeometryCollection
459     int         getNumGeometries() const;
460     OGRGeometry *getGeometryRef( int );
461     const OGRGeometry *getGeometryRef( int ) const;
462 
463     // ISpatialRelation
464     virtual OGRBoolean  Equal( OGRGeometry * ) const;
465 
466     // Non standard
467     virtual OGRErr addGeometry( const OGRGeometry * );
468     virtual OGRErr addGeometryDirectly( OGRGeometry * );
469     virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE );
470 };
471 
472 /************************************************************************/
473 /*                           OGRMultiPolygon                            */
474 /************************************************************************/
475 
476 /**
477  * A collection of non-overlapping OGRPolygons.
478  *
479  * Note that the IMultiSurface class hasn't been modelled, nor have any
480  * of it's methods.
481  */
482 
483 class CPL_DLL OGRMultiPolygon : public OGRGeometryCollection
484 {
485   public:
486             OGRMultiPolygon();
487     // Non standard (OGRGeometry).
488     virtual const char *getGeometryName() const;
489     virtual OGRwkbGeometryType getGeometryType() const;
490     virtual OGRGeometry *clone() const;
491     virtual OGRErr importFromWkt( char ** );
492     virtual OGRErr exportToWkt( char ** ) const;
493 
494     // Non standard
495     virtual OGRErr addGeometryDirectly( OGRGeometry * );
496 };
497 
498 /************************************************************************/
499 /*                            OGRMultiPoint                             */
500 /************************************************************************/
501 
502 /**
503  * A collection of OGRPoints.
504  */
505 
506 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection
507 {
508   private:
509     OGRErr  importFromWkt_Bracketed( char ** );
510 
511   public:
512             OGRMultiPoint();
513     // Non standard (OGRGeometry).
514     virtual const char *getGeometryName() const;
515     virtual OGRwkbGeometryType getGeometryType() const;
516     virtual OGRGeometry *clone() const;
517     virtual OGRErr importFromWkt( char ** );
518     virtual OGRErr exportToWkt( char ** ) const;
519 
520     // Non standard
521     virtual OGRErr addGeometryDirectly( OGRGeometry * );
522 };
523 
524 /************************************************************************/
525 /*                          OGRMultiLineString                          */
526 /************************************************************************/
527 
528 /**
529  * A collection of OGRLineStrings.
530  */
531 
532 class CPL_DLL OGRMultiLineString : public OGRGeometryCollection
533 {
534   public:
535             OGRMultiLineString();
536             ~OGRMultiLineString();
537     // Non standard (OGRGeometry).
538     virtual const char *getGeometryName() const;
539     virtual OGRwkbGeometryType getGeometryType() const;
540     virtual OGRGeometry *clone() const;
541     virtual OGRErr importFromWkt( char ** );
542     virtual OGRErr exportToWkt( char ** ) const;
543 
544     // Non standard
545     virtual OGRErr addGeometryDirectly( OGRGeometry * );
546 };
547 
548 
549 /************************************************************************/
550 /*                          OGRGeometryFactory                          */
551 /************************************************************************/
552 
553 /**
554  * Create geometry objects from well known text/binary.
555  */
556 
557 class CPL_DLL OGRGeometryFactory
558 {
559   public:
560     static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *,
561                                  OGRGeometry **, int = -1 );
562     static OGRErr createFromWkt( char **, OGRSpatialReference *,
563                                  OGRGeometry ** );
564 
565     static void   destroyGeometry( OGRGeometry * );
566     static OGRGeometry *createGeometry( OGRwkbGeometryType );
567 
568     static OGRGeometry * forceToPolygon( OGRGeometry * );
569     static OGRGeometry * forceToMultiPolygon( OGRGeometry * );
570     static OGRGeometry * forceToMultiPoint( OGRGeometry * );
571     static OGRGeometry * forceToMultiLineString( OGRGeometry * );
572 };
573 
574 #endif /* ndef _OGR_GEOMETRY_H_INCLUDED */
575