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