GDAL
|
00001 /****************************************************************************** 00002 * $Id: ogr_geometry.h 28123 2014-12-10 19:27:55Z rouault $ 00003 * 00004 * Project: OpenGIS Simple Features Reference Implementation 00005 * Purpose: Classes for manipulating simple features that is not specific 00006 * to a particular interface technology. 00007 * Author: Frank Warmerdam, warmerdam@pobox.com 00008 * 00009 ****************************************************************************** 00010 * Copyright (c) 1999, Frank Warmerdam 00011 * Copyright (c) 2008-2014, Even Rouault <even dot rouault at mines-paris dot org> 00012 * 00013 * Permission is hereby granted, free of charge, to any person obtaining a 00014 * copy of this software and associated documentation files (the "Software"), 00015 * to deal in the Software without restriction, including without limitation 00016 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 00017 * and/or sell copies of the Software, and to permit persons to whom the 00018 * Software is furnished to do so, subject to the following conditions: 00019 * 00020 * The above copyright notice and this permission notice shall be included 00021 * in all copies or substantial portions of the Software. 00022 * 00023 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 00024 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00025 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 00026 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00027 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 00028 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 00029 * DEALINGS IN THE SOFTWARE. 00030 ****************************************************************************/ 00031 00032 #ifndef _OGR_GEOMETRY_H_INCLUDED 00033 #define _OGR_GEOMETRY_H_INCLUDED 00034 00035 #include "ogr_core.h" 00036 #include "ogr_spatialref.h" 00037 00047 class OGRRawPoint 00048 { 00049 public: 00050 OGRRawPoint() 00051 { 00052 x = y = 0.0; 00053 } 00054 00055 OGRRawPoint(double x, double y) : x(x), y(y) {} 00056 double x; 00057 double y; 00058 }; 00059 00060 typedef struct GEOSGeom_t *GEOSGeom; 00061 typedef struct GEOSContextHandle_HS *GEOSContextHandle_t; 00062 00063 class OGRPoint; 00064 class OGRCurve; 00065 class OGRCompoundCurve; 00066 class OGRLinearRing; 00067 class OGRLineString; 00068 class OGRSurface; 00069 class OGRCurvePolygon; 00070 class OGRPolygon; 00071 class OGRMultiSurface; 00072 class OGRMultiPolygon; 00073 class OGRMultiCurve; 00074 class OGRMultiLineString; 00075 00076 typedef OGRLineString* (*OGRCurveCasterToLineString)(OGRCurve*); 00077 typedef OGRLinearRing* (*OGRCurveCasterToLinearRing)(OGRCurve*); 00078 00079 typedef OGRPolygon* (*OGRSurfaceCasterToPolygon)(OGRSurface*); 00080 typedef OGRCurvePolygon* (*OGRSurfaceCasterToCurvePolygon)(OGRSurface*); 00081 00082 /************************************************************************/ 00083 /* OGRGeometry */ 00084 /************************************************************************/ 00085 00104 class CPL_DLL OGRGeometry 00105 { 00106 private: 00107 OGRSpatialReference * poSRS; // may be NULL 00108 00109 protected: 00110 friend class OGRCurveCollection; 00111 00112 int nCoordDimension; 00113 00114 OGRErr importPreambuleFromWkt( char ** ppszInput, 00115 int* pbHasZ, int* pbHasM ); 00116 OGRErr importCurveCollectionFromWkt( char ** ppszInput, 00117 int bAllowEmptyComponent, 00118 int bAllowLineString, 00119 int bAllowCurve, 00120 int bAllowCompoundCurve, 00121 OGRErr (*pfnAddCurveDirectly)(OGRGeometry* poSelf, OGRCurve* poCurve) ); 00122 OGRErr importPreambuleFromWkb( unsigned char * pabyData, 00123 int nSize, 00124 OGRwkbByteOrder& eByteOrder, 00125 OGRBoolean& b3D, 00126 OGRwkbVariant eWkbVariant ); 00127 OGRErr importPreambuleOfCollectionFromWkb( 00128 unsigned char * pabyData, 00129 int& nSize, 00130 int& nDataOffset, 00131 OGRwkbByteOrder& eByteOrder, 00132 int nMinSubGeomSize, 00133 int& nGeomCount, 00134 OGRwkbVariant eWkbVariant ); 00135 public: 00136 OGRGeometry(); 00137 virtual ~OGRGeometry(); 00138 00139 // standard IGeometry 00140 virtual int getDimension() const = 0; 00141 virtual int getCoordinateDimension() const; 00142 virtual OGRBoolean IsEmpty() const = 0; 00143 virtual OGRBoolean IsValid() const; 00144 virtual OGRBoolean IsSimple() const; 00145 virtual OGRBoolean IsRing() const; 00146 virtual void empty() = 0; 00147 virtual OGRGeometry *clone() const = 0; 00148 virtual void getEnvelope( OGREnvelope * psEnvelope ) const = 0; 00149 virtual void getEnvelope( OGREnvelope3D * psEnvelope ) const = 0; 00150 00151 // IWks Interface 00152 virtual int WkbSize() const = 0; 00153 virtual OGRErr importFromWkb( unsigned char *, int=-1, OGRwkbVariant=wkbVariantOldOgc )=0; 00154 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char *, OGRwkbVariant=wkbVariantOldOgc ) const = 0; 00155 virtual OGRErr importFromWkt( char ** ppszInput ) = 0; 00156 virtual OGRErr exportToWkt( char ** ppszDstText, OGRwkbVariant=wkbVariantOldOgc ) const = 0; 00157 00158 // non-standard 00159 virtual OGRwkbGeometryType getGeometryType() const = 0; 00160 OGRwkbGeometryType getIsoGeometryType() const; 00161 virtual const char *getGeometryName() const = 0; 00162 virtual void dumpReadable( FILE *, const char * = NULL, char** papszOptions = NULL ) const; 00163 virtual void flattenTo2D() = 0; 00164 virtual char * exportToGML( const char* const * papszOptions = NULL ) const; 00165 virtual char * exportToKML() const; 00166 virtual char * exportToJson() const; 00167 00168 static GEOSContextHandle_t createGEOSContext(); 00169 static void freeGEOSContext(GEOSContextHandle_t hGEOSCtxt); 00170 virtual GEOSGeom exportToGEOS(GEOSContextHandle_t hGEOSCtxt) const; 00171 virtual OGRBoolean hasCurveGeometry(int bLookForNonLinear = FALSE) const; 00172 virtual OGRGeometry* getCurveGeometry(const char* const* papszOptions = NULL) const; 00173 virtual OGRGeometry* getLinearGeometry(double dfMaxAngleStepSizeDegrees = 0, 00174 const char* const* papszOptions = NULL) const; 00175 00176 virtual void closeRings(); 00177 00178 virtual void setCoordinateDimension( int nDimension ); 00179 00180 void assignSpatialReference( OGRSpatialReference * poSR ); 00181 OGRSpatialReference *getSpatialReference( void ) const { return poSRS; } 00182 00183 virtual OGRErr transform( OGRCoordinateTransformation *poCT ) = 0; 00184 OGRErr transformTo( OGRSpatialReference *poSR ); 00185 00186 virtual void segmentize(double dfMaxLength); 00187 00188 // ISpatialRelation 00189 virtual OGRBoolean Intersects( const OGRGeometry * ) const; 00190 virtual OGRBoolean Equals( OGRGeometry * ) const = 0; 00191 virtual OGRBoolean Disjoint( const OGRGeometry * ) const; 00192 virtual OGRBoolean Touches( const OGRGeometry * ) const; 00193 virtual OGRBoolean Crosses( const OGRGeometry * ) const; 00194 virtual OGRBoolean Within( const OGRGeometry * ) const; 00195 virtual OGRBoolean Contains( const OGRGeometry * ) const; 00196 virtual OGRBoolean Overlaps( const OGRGeometry * ) const; 00197 // virtual OGRBoolean Relate( const OGRGeometry *, const char * ) const; 00198 00199 virtual OGRGeometry *Boundary() const; 00200 virtual double Distance( const OGRGeometry * ) const; 00201 virtual OGRGeometry *ConvexHull() const; 00202 virtual OGRGeometry *Buffer( double dfDist, int nQuadSegs = 30 ) const; 00203 virtual OGRGeometry *Intersection( const OGRGeometry *) const; 00204 virtual OGRGeometry *Union( const OGRGeometry * ) const; 00205 virtual OGRGeometry *UnionCascaded() const; 00206 virtual OGRGeometry *Difference( const OGRGeometry * ) const; 00207 virtual OGRGeometry *SymDifference( const OGRGeometry * ) const; 00208 virtual OGRErr Centroid( OGRPoint * poPoint ) const; 00209 virtual OGRGeometry *Simplify(double dTolerance) const; 00210 OGRGeometry *SimplifyPreserveTopology(double dTolerance) const; 00211 00212 virtual OGRGeometry *Polygonize() const; 00213 00214 // backward compatibility to non-standard method names. 00215 OGRBoolean Intersect( OGRGeometry * ) const CPL_WARN_DEPRECATED("Non standard method. Use Intersects() instead"); 00216 OGRBoolean Equal( OGRGeometry * ) const CPL_WARN_DEPRECATED("Non standard method. Use Equals() instead"); 00217 virtual OGRGeometry *SymmetricDifference( const OGRGeometry * ) const CPL_WARN_DEPRECATED("Non standard method. Use SymDifference() instead"); 00218 virtual OGRGeometry *getBoundary() const CPL_WARN_DEPRECATED("Non standard method. Use Boundary() instead"); 00219 00220 // Special HACK for DB2 7.2 support 00221 static int bGenerate_DB2_V72_BYTE_ORDER; 00222 00223 virtual void swapXY(); 00224 00225 static OGRGeometry* CastToIdentity(OGRGeometry* poGeom) { return poGeom; } 00226 static OGRGeometry* CastToError(OGRGeometry* poGeom); 00227 }; 00228 00229 /************************************************************************/ 00230 /* OGRPoint */ 00231 /************************************************************************/ 00232 00239 class CPL_DLL OGRPoint : public OGRGeometry 00240 { 00241 double x; 00242 double y; 00243 double z; 00244 00245 public: 00246 OGRPoint(); 00247 OGRPoint( double x, double y ); 00248 OGRPoint( double x, double y, double z ); 00249 virtual ~OGRPoint(); 00250 00251 // IWks Interface 00252 virtual int WkbSize() const; 00253 virtual OGRErr importFromWkb( unsigned char *, int=-1, OGRwkbVariant=wkbVariantOldOgc ); 00254 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char *, OGRwkbVariant=wkbVariantOldOgc ) const; 00255 virtual OGRErr importFromWkt( char ** ); 00256 virtual OGRErr exportToWkt( char ** ppszDstText, OGRwkbVariant=wkbVariantOldOgc ) const; 00257 00258 // IGeometry 00259 virtual int getDimension() const; 00260 virtual int getCoordinateDimension() const; 00261 virtual OGRGeometry *clone() const; 00262 virtual void empty(); 00263 virtual void getEnvelope( OGREnvelope * psEnvelope ) const; 00264 virtual void getEnvelope( OGREnvelope3D * psEnvelope ) const; 00265 virtual OGRBoolean IsEmpty() const; 00266 00267 // IPoint 00268 double getX() const { return x; } 00269 double getY() const { return y; } 00270 double getZ() const { return z; } 00271 00272 // Non standard 00273 virtual void setCoordinateDimension( int nDimension ); 00274 void setX( double xIn ) { x = xIn; if (nCoordDimension <= 0) nCoordDimension = 2; } 00275 void setY( double yIn ) { y = yIn; if (nCoordDimension <= 0) nCoordDimension = 2; } 00276 void setZ( double zIn ) { z = zIn; nCoordDimension=3; } 00277 00278 // ISpatialRelation 00279 virtual OGRBoolean Equals( OGRGeometry * ) const; 00280 virtual OGRBoolean Intersects( const OGRGeometry * ) const; 00281 virtual OGRBoolean Within( const OGRGeometry * ) const; 00282 00283 // Non standard from OGRGeometry 00284 virtual const char *getGeometryName() const; 00285 virtual OGRwkbGeometryType getGeometryType() const; 00286 virtual OGRErr transform( OGRCoordinateTransformation *poCT ); 00287 virtual void flattenTo2D(); 00288 00289 virtual void swapXY(); 00290 }; 00291 00292 /************************************************************************/ 00293 /* OGRPointIterator */ 00294 /************************************************************************/ 00295 00302 class CPL_DLL OGRPointIterator 00303 { 00304 public: 00305 virtual ~OGRPointIterator(); 00306 virtual OGRBoolean getNextPoint(OGRPoint* p) = 0; 00307 00308 static void destroy(OGRPointIterator*); 00309 }; 00310 00311 /************************************************************************/ 00312 /* OGRCurve */ 00313 /************************************************************************/ 00314 00320 class CPL_DLL OGRCurve : public OGRGeometry 00321 { 00322 protected: 00323 OGRCurve(); 00324 00325 virtual OGRCurveCasterToLineString GetCasterToLineString() const = 0; 00326 virtual OGRCurveCasterToLinearRing GetCasterToLinearRing() const = 0; 00327 00328 friend class OGRCurvePolygon; 00329 friend class OGRCompoundCurve; 00330 virtual int ContainsPoint( const OGRPoint* p ) const; 00331 virtual double get_AreaOfCurveSegments() const = 0; 00332 00333 public: 00334 virtual ~OGRCurve(); 00335 00336 // ICurve methods 00337 virtual double get_Length() const = 0; 00338 virtual void StartPoint(OGRPoint *) const = 0; 00339 virtual void EndPoint(OGRPoint *) const = 0; 00340 virtual int get_IsClosed() const; 00341 virtual void Value( double, OGRPoint * ) const = 0; 00342 virtual OGRLineString* CurveToLine(double dfMaxAngleStepSizeDegrees = 0, 00343 const char* const* papszOptions = NULL) const = 0; 00344 virtual int getDimension() const; 00345 00346 // non standard 00347 virtual int getNumPoints() const = 0; 00348 virtual OGRPointIterator* getPointIterator() const = 0; 00349 virtual OGRBoolean IsConvex() const; 00350 virtual double get_Area() const = 0; 00351 00352 static OGRCompoundCurve* CastToCompoundCurve(OGRCurve* puCurve); 00353 static OGRLineString* CastToLineString(OGRCurve* poCurve); 00354 static OGRLinearRing* CastToLinearRing(OGRCurve* poCurve); 00355 }; 00356 00357 /************************************************************************/ 00358 /* OGRSimpleCurve */ 00359 /************************************************************************/ 00360 00370 class CPL_DLL OGRSimpleCurve: public OGRCurve 00371 { 00372 protected: 00373 friend class OGRGeometry; 00374 00375 int nPointCount; 00376 OGRRawPoint *paoPoints; 00377 double *padfZ; 00378 00379 void Make3D(); 00380 void Make2D(); 00381 00382 OGRErr importFromWKTListOnly( char ** ppszInput, int bHasZ, int bHasM, 00383 OGRRawPoint*& paoPointsIn, int& nMaxPoints, 00384 double*& padfZIn ); 00385 00386 virtual double get_LinearArea() const; 00387 00388 OGRSimpleCurve(); 00389 00390 public: 00391 virtual ~OGRSimpleCurve(); 00392 00393 // IWks Interface 00394 virtual int WkbSize() const; 00395 virtual OGRErr importFromWkb( unsigned char *, int = -1, OGRwkbVariant=wkbVariantOldOgc ); 00396 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char *, OGRwkbVariant=wkbVariantOldOgc ) const; 00397 virtual OGRErr importFromWkt( char ** ); 00398 virtual OGRErr exportToWkt( char ** ppszDstText, OGRwkbVariant=wkbVariantOldOgc ) const; 00399 00400 // IGeometry interface 00401 virtual OGRGeometry *clone() const; 00402 virtual void empty(); 00403 virtual void getEnvelope( OGREnvelope * psEnvelope ) const; 00404 virtual void getEnvelope( OGREnvelope3D * psEnvelope ) const; 00405 virtual OGRBoolean IsEmpty() const; 00406 00407 // ICurve methods 00408 virtual double get_Length() const; 00409 virtual void StartPoint(OGRPoint *) const; 00410 virtual void EndPoint(OGRPoint *) const; 00411 virtual void Value( double, OGRPoint * ) const; 00412 virtual double Project(const OGRPoint *) const; 00413 virtual OGRLineString* getSubLine(double, double, int) const; 00414 00415 // ILineString methods 00416 virtual int getNumPoints() const { return nPointCount; } 00417 void getPoint( int, OGRPoint * ) const; 00418 double getX( int i ) const { return paoPoints[i].x; } 00419 double getY( int i ) const { return paoPoints[i].y; } 00420 double getZ( int i ) const; 00421 00422 // ISpatialRelation 00423 virtual OGRBoolean Equals( OGRGeometry * ) const; 00424 00425 // non standard. 00426 virtual void setCoordinateDimension( int nDimension ); 00427 void setNumPoints( int nNewPointCount, int bZeroizeNewContent = TRUE ); 00428 void setPoint( int, OGRPoint * ); 00429 void setPoint( int, double, double ); 00430 void setZ( int, double ); 00431 void setPoint( int, double, double, double ); 00432 void setPoints( int, OGRRawPoint *, double * = NULL ); 00433 void setPoints( int, double * padfX, double * padfY, 00434 double *padfZIn = NULL ); 00435 void addPoint( OGRPoint * ); 00436 void addPoint( double, double ); 00437 void addPoint( double, double, double ); 00438 00439 void getPoints( OGRRawPoint *, double * = NULL ) const; 00440 void getPoints( void* pabyX, int nXStride, 00441 void* pabyY, int nYStride, 00442 void* pabyZ = NULL, int nZStride = 0 ) const; 00443 00444 void addSubLineString( const OGRLineString *, 00445 int nStartVertex = 0, int nEndVertex = -1 ); 00446 void reversePoints( void ); 00447 virtual OGRPointIterator* getPointIterator() const; 00448 00449 // non-standard from OGRGeometry 00450 virtual OGRErr transform( OGRCoordinateTransformation *poCT ); 00451 virtual void flattenTo2D(); 00452 virtual void segmentize(double dfMaxLength); 00453 00454 virtual void swapXY(); 00455 }; 00456 00457 /************************************************************************/ 00458 /* OGRLineString */ 00459 /************************************************************************/ 00460 00468 class CPL_DLL OGRLineString : public OGRSimpleCurve 00469 { 00470 protected: 00471 static OGRLineString* TransferMembersAndDestroy( 00472 OGRLineString* poSrc, 00473 OGRLineString* poDst); 00474 00475 static OGRLinearRing* CastToLinearRing(OGRLineString* poLS); 00476 00477 virtual OGRCurveCasterToLineString GetCasterToLineString() const; 00478 virtual OGRCurveCasterToLinearRing GetCasterToLinearRing() const; 00479 00480 virtual double get_AreaOfCurveSegments() const; 00481 00482 public: 00483 OGRLineString(); 00484 virtual ~OGRLineString(); 00485 00486 virtual OGRLineString* CurveToLine(double dfMaxAngleStepSizeDegrees = 0, 00487 const char* const* papszOptions = NULL) const; 00488 virtual OGRGeometry* getCurveGeometry(const char* const* papszOptions = NULL) const; 00489 virtual double get_Area() const; 00490 00491 // non-standard from OGRGeometry 00492 virtual OGRwkbGeometryType getGeometryType() const; 00493 virtual const char *getGeometryName() const; 00494 }; 00495 00496 /************************************************************************/ 00497 /* OGRLinearRing */ 00498 /************************************************************************/ 00499 00520 class CPL_DLL OGRLinearRing : public OGRLineString 00521 { 00522 protected: 00523 friend class OGRPolygon; 00524 00525 // These are not IWks compatible ... just a convenience for OGRPolygon. 00526 virtual int _WkbSize( int b3D ) const; 00527 virtual OGRErr _importFromWkb( OGRwkbByteOrder, int b3D, 00528 unsigned char *, int=-1 ); 00529 virtual OGRErr _exportToWkb( OGRwkbByteOrder, int b3D, 00530 unsigned char * ) const; 00531 00532 static OGRLineString* CastToLineString(OGRLinearRing* poLR); 00533 00534 virtual OGRCurveCasterToLineString GetCasterToLineString() const; 00535 virtual OGRCurveCasterToLinearRing GetCasterToLinearRing() const; 00536 00537 public: 00538 OGRLinearRing(); 00539 OGRLinearRing( OGRLinearRing * ); 00540 virtual ~OGRLinearRing(); 00541 00542 // Non standard. 00543 virtual const char *getGeometryName() const; 00544 virtual OGRGeometry *clone() const; 00545 virtual int isClockwise() const; 00546 virtual void reverseWindingOrder(); 00547 virtual void closeRings(); 00548 OGRBoolean isPointInRing(const OGRPoint* pt, int bTestEnvelope = TRUE) const; 00549 OGRBoolean isPointOnRingBoundary(const OGRPoint* pt, int bTestEnvelope = TRUE) const; 00550 00551 // IWks Interface - Note this isnt really a first class object 00552 // for the purposes of WKB form. These methods always fail since this 00553 // object cant be serialized on its own. 00554 virtual int WkbSize() const; 00555 virtual OGRErr importFromWkb( unsigned char *, int=-1, OGRwkbVariant=wkbVariantOldOgc ); 00556 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char *, OGRwkbVariant=wkbVariantOldOgc ) const; 00557 }; 00558 00559 /************************************************************************/ 00560 /* OGRCircularString */ 00561 /************************************************************************/ 00562 00575 class CPL_DLL OGRCircularString : public OGRSimpleCurve 00576 { 00577 private: 00578 void ExtendEnvelopeWithCircular( OGREnvelope * psEnvelope ) const; 00579 OGRBoolean IsValidFast() const; 00580 int IsFullCircle( double& cx, double& cy, double& square_R ) const; 00581 00582 protected: 00583 virtual OGRCurveCasterToLineString GetCasterToLineString() const; 00584 virtual OGRCurveCasterToLinearRing GetCasterToLinearRing() const; 00585 virtual int ContainsPoint( const OGRPoint* p ) const; 00586 virtual double get_AreaOfCurveSegments() const; 00587 00588 public: 00589 OGRCircularString(); 00590 virtual ~OGRCircularString(); 00591 00592 // IWks Interface 00593 virtual OGRErr importFromWkb( unsigned char *, int = -1, OGRwkbVariant=wkbVariantOldOgc ); 00594 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char *, OGRwkbVariant=wkbVariantOldOgc ) const; 00595 virtual OGRErr importFromWkt( char ** ); 00596 virtual OGRErr exportToWkt( char ** ppszDstText, OGRwkbVariant=wkbVariantOldOgc ) const; 00597 00598 // IGeometry interface 00599 virtual OGRBoolean IsValid() const; 00600 virtual void getEnvelope( OGREnvelope * psEnvelope ) const; 00601 virtual void getEnvelope( OGREnvelope3D * psEnvelope ) const; 00602 00603 // ICurve methods 00604 virtual double get_Length() const; 00605 virtual OGRLineString* CurveToLine(double dfMaxAngleStepSizeDegrees = 0, 00606 const char* const* papszOptions = NULL) const; 00607 virtual void Value( double, OGRPoint * ) const; 00608 virtual double get_Area() const; 00609 00610 // non-standard from OGRGeometry 00611 virtual OGRwkbGeometryType getGeometryType() const; 00612 virtual const char *getGeometryName() const; 00613 virtual void segmentize(double dfMaxLength); 00614 virtual OGRBoolean hasCurveGeometry(int bLookForNonLinear = FALSE) const; 00615 virtual OGRGeometry* getLinearGeometry(double dfMaxAngleStepSizeDegrees = 0, 00616 const char* const* papszOptions = NULL) const; 00617 }; 00618 00619 /************************************************************************/ 00620 /* OGRCurveCollection */ 00621 /************************************************************************/ 00622 00633 class CPL_DLL OGRCurveCollection 00634 { 00635 protected: 00636 friend class OGRCompoundCurve; 00637 friend class OGRCurvePolygon; 00638 friend class OGRPolygon; 00639 00640 int nCurveCount; 00641 OGRCurve **papoCurves; 00642 00643 public: 00644 OGRCurveCollection(); 00645 ~OGRCurveCollection(); 00646 00647 void empty(OGRGeometry* poGeom); 00648 OGRBoolean IsEmpty() const; 00649 void getEnvelope( OGREnvelope * psEnvelope ) const; 00650 void getEnvelope( OGREnvelope3D * psEnvelope ) const; 00651 00652 OGRErr addCurveDirectly( OGRGeometry* poGeom, OGRCurve* poCurve, 00653 int bNeedRealloc ); 00654 int WkbSize() const; 00655 OGRErr importPreambuleFromWkb( OGRGeometry* poGeom, 00656 unsigned char * pabyData, 00657 int& nSize, 00658 int& nDataOffset, 00659 OGRwkbByteOrder& eByteOrder, 00660 int nMinSubGeomSize, 00661 OGRwkbVariant eWkVariant ); 00662 OGRErr importBodyFromWkb( OGRGeometry* poGeom, 00663 unsigned char * pabyData, 00664 int nSize, 00665 int nDataOffset, 00666 int bAcceptCompoundCurve, 00667 OGRErr (*pfnAddCurveDirectlyFromWkb)(OGRGeometry* poGeom, OGRCurve* poCurve), 00668 OGRwkbVariant eWkVariant ); 00669 OGRErr exportToWkt( const OGRGeometry* poGeom, char ** ppszDstText ) const; 00670 OGRErr exportToWkb( const OGRGeometry* poGeom, OGRwkbByteOrder, 00671 unsigned char *, OGRwkbVariant eWkbVariant ) const; 00672 OGRBoolean Equals(OGRCurveCollection *poOCC) const; 00673 void setCoordinateDimension( OGRGeometry* poGeom, int nNewDimension ); 00674 int getNumCurves() const; 00675 OGRCurve *getCurve( int ); 00676 const OGRCurve *getCurve( int ) const; 00677 OGRCurve *stealCurve( int ); 00678 OGRErr transform( OGRGeometry* poGeom, 00679 OGRCoordinateTransformation *poCT ); 00680 void flattenTo2D(OGRGeometry* poGeom); 00681 void segmentize(double dfMaxLength); 00682 void swapXY(); 00683 OGRBoolean hasCurveGeometry(int bLookForNonLinear) const; 00684 }; 00685 00686 /************************************************************************/ 00687 /* OGRCompoundCurve */ 00688 /************************************************************************/ 00689 00700 class CPL_DLL OGRCompoundCurve : public OGRCurve 00701 { 00702 private: 00703 OGRCurveCollection oCC; 00704 00705 OGRErr addCurveDirectlyInternal( OGRCurve* poCurve, 00706 double dfToleranceEps, 00707 int bNeedRealloc ); 00708 static OGRErr addCurveDirectlyFromWkt( OGRGeometry* poSelf, OGRCurve* poCurve ); 00709 static OGRErr addCurveDirectlyFromWkb( OGRGeometry* poSelf, OGRCurve* poCurve ); 00710 OGRLineString* CurveToLineInternal(double dfMaxAngleStepSizeDegrees, 00711 const char* const* papszOptions, 00712 int bIsLinearRing) const; 00713 00714 protected: 00715 static OGRLineString* CastToLineString(OGRCompoundCurve* poCC); 00716 static OGRLinearRing* CastToLinearRing(OGRCompoundCurve* poCC); 00717 00718 virtual OGRCurveCasterToLineString GetCasterToLineString() const; 00719 virtual OGRCurveCasterToLinearRing GetCasterToLinearRing() const; 00720 00721 public: 00722 OGRCompoundCurve(); 00723 virtual ~OGRCompoundCurve(); 00724 00725 // IWks Interface 00726 virtual int WkbSize() const; 00727 virtual OGRErr importFromWkb( unsigned char *, int = -1, OGRwkbVariant=wkbVariantOldOgc ); 00728 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char *, OGRwkbVariant=wkbVariantOldOgc ) const; 00729 virtual OGRErr importFromWkt( char ** ); 00730 virtual OGRErr exportToWkt( char ** ppszDstText, OGRwkbVariant=wkbVariantOldOgc ) const; 00731 00732 // IGeometry interface 00733 virtual OGRGeometry *clone() const; 00734 virtual void empty(); 00735 virtual void getEnvelope( OGREnvelope * psEnvelope ) const; 00736 virtual void getEnvelope( OGREnvelope3D * psEnvelope ) const; 00737 virtual OGRBoolean IsEmpty() const; 00738 00739 // ICurve methods 00740 virtual double get_Length() const; 00741 virtual void StartPoint(OGRPoint *) const; 00742 virtual void EndPoint(OGRPoint *) const; 00743 virtual void Value( double, OGRPoint * ) const; 00744 virtual OGRLineString* CurveToLine(double dfMaxAngleStepSizeDegrees = 0, 00745 const char* const* papszOptions = NULL) const; 00746 00747 virtual int getNumPoints() const; 00748 virtual double get_AreaOfCurveSegments() const; 00749 virtual double get_Area() const; 00750 00751 // ISpatialRelation 00752 virtual OGRBoolean Equals( OGRGeometry * ) const; 00753 00754 // ICompoundCurve method 00755 int getNumCurves() const; 00756 OGRCurve *getCurve( int ); 00757 const OGRCurve *getCurve( int ) const; 00758 00759 // non standard. 00760 virtual void setCoordinateDimension( int nDimension ); 00761 00762 OGRErr addCurve( OGRCurve*, double dfToleranceEps = 1e-14 ); 00763 OGRErr addCurveDirectly( OGRCurve*, double dfToleranceEps = 1e-14 ); 00764 OGRCurve *stealCurve( int ); 00765 virtual OGRPointIterator* getPointIterator() const; 00766 00767 // non-standard from OGRGeometry 00768 virtual OGRwkbGeometryType getGeometryType() const; 00769 virtual const char *getGeometryName() const; 00770 virtual OGRErr transform( OGRCoordinateTransformation *poCT ); 00771 virtual void flattenTo2D(); 00772 virtual void segmentize(double dfMaxLength); 00773 virtual OGRBoolean hasCurveGeometry(int bLookForNonLinear = FALSE) const; 00774 virtual OGRGeometry* getLinearGeometry(double dfMaxAngleStepSizeDegrees = 0, 00775 const char* const* papszOptions = NULL) const; 00776 00777 virtual void swapXY(); 00778 }; 00779 00780 /************************************************************************/ 00781 /* OGRSurface */ 00782 /************************************************************************/ 00783 00788 class CPL_DLL OGRSurface : public OGRGeometry 00789 { 00790 protected: 00791 00792 virtual OGRSurfaceCasterToPolygon GetCasterToPolygon() const = 0; 00793 virtual OGRSurfaceCasterToCurvePolygon GetCasterToCurvePolygon() const = 0; 00794 00795 public: 00796 virtual double get_Area() const = 0; 00797 virtual OGRErr PointOnSurface( OGRPoint * poPoint ) const = 0; 00798 00799 static OGRPolygon* CastToPolygon(OGRSurface* poSurface); 00800 static OGRCurvePolygon* CastToCurvePolygon(OGRSurface* poSurface); 00801 }; 00802 00803 00804 /************************************************************************/ 00805 /* OGRCurvePolygon */ 00806 /************************************************************************/ 00807 00821 class CPL_DLL OGRCurvePolygon : public OGRSurface 00822 { 00823 private: 00824 OGRBoolean ContainsPoint( const OGRPoint* p ) const; 00825 virtual int checkRing( OGRCurve * poNewRing ) const; 00826 OGRErr addRingDirectlyInternal( OGRCurve* poCurve, int bNeedRealloc ); 00827 static OGRErr addCurveDirectlyFromWkt( OGRGeometry* poSelf, OGRCurve* poCurve ); 00828 static OGRErr addCurveDirectlyFromWkb( OGRGeometry* poSelf, OGRCurve* poCurve ); 00829 00830 protected: 00831 friend class OGRPolygon; 00832 OGRCurveCollection oCC; 00833 00834 static OGRPolygon* CastToPolygon(OGRCurvePolygon* poCP); 00835 00836 virtual OGRSurfaceCasterToPolygon GetCasterToPolygon() const; 00837 virtual OGRSurfaceCasterToCurvePolygon GetCasterToCurvePolygon() const; 00838 00839 public: 00840 OGRCurvePolygon(); 00841 virtual ~OGRCurvePolygon(); 00842 00843 // Non standard (OGRGeometry). 00844 virtual const char *getGeometryName() const; 00845 virtual OGRwkbGeometryType getGeometryType() const; 00846 virtual OGRGeometry *clone() const; 00847 virtual void empty(); 00848 virtual OGRErr transform( OGRCoordinateTransformation *poCT ); 00849 virtual void flattenTo2D(); 00850 virtual OGRBoolean IsEmpty() const; 00851 virtual void segmentize(double dfMaxLength); 00852 virtual OGRBoolean hasCurveGeometry(int bLookForNonLinear = FALSE) const; 00853 virtual OGRGeometry* getLinearGeometry(double dfMaxAngleStepSizeDegrees = 0, 00854 const char* const* papszOptions = NULL) const; 00855 00856 // ISurface Interface 00857 virtual double get_Area() const; 00858 virtual int PointOnSurface( OGRPoint * poPoint ) const; 00859 00860 // IWks Interface 00861 virtual int WkbSize() const; 00862 virtual OGRErr importFromWkb( unsigned char *, int = -1, OGRwkbVariant=wkbVariantOldOgc ); 00863 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char *, OGRwkbVariant=wkbVariantOldOgc ) const; 00864 virtual OGRErr importFromWkt( char ** ); 00865 virtual OGRErr exportToWkt( char ** ppszDstText, OGRwkbVariant eWkbVariant = wkbVariantOldOgc ) const; 00866 00867 // IGeometry 00868 virtual int getDimension() const; 00869 virtual void getEnvelope( OGREnvelope * psEnvelope ) const; 00870 virtual void getEnvelope( OGREnvelope3D * psEnvelope ) const; 00871 00872 // ICurvePolygon 00873 virtual OGRPolygon* CurvePolyToPoly(double dfMaxAngleStepSizeDegrees = 0, 00874 const char* const* papszOptions = NULL) const; 00875 00876 // ISpatialRelation 00877 virtual OGRBoolean Equals( OGRGeometry * ) const; 00878 virtual OGRBoolean Intersects( const OGRGeometry * ) const; 00879 virtual OGRBoolean Contains( const OGRGeometry * ) const; 00880 00881 // Non standard 00882 virtual void setCoordinateDimension( int nDimension ); 00883 00884 OGRErr addRing( OGRCurve * ); 00885 OGRErr addRingDirectly( OGRCurve * ); 00886 00887 OGRCurve *getExteriorRingCurve(); 00888 const OGRCurve *getExteriorRingCurve() const; 00889 int getNumInteriorRings() const; 00890 OGRCurve *getInteriorRingCurve( int ); 00891 const OGRCurve *getInteriorRingCurve( int ) const; 00892 00893 OGRCurve *stealExteriorRingCurve(); 00894 00895 virtual void swapXY(); 00896 }; 00897 00898 /************************************************************************/ 00899 /* OGRPolygon */ 00900 /************************************************************************/ 00901 00911 class CPL_DLL OGRPolygon : public OGRCurvePolygon 00912 { 00913 protected: 00914 friend class OGRMultiSurface; 00915 00916 virtual int checkRing( OGRCurve * poNewRing ) const; 00917 OGRErr importFromWKTListOnly( char ** ppszInput, int bHasZ, int bHasM, 00918 OGRRawPoint*& paoPoints, int& nMaxPoints, 00919 double*& padfZ ); 00920 00921 static OGRCurvePolygon* CastToCurvePolygon(OGRPolygon* poPoly); 00922 00923 virtual OGRSurfaceCasterToPolygon GetCasterToPolygon() const; 00924 virtual OGRSurfaceCasterToCurvePolygon GetCasterToCurvePolygon() const; 00925 00926 public: 00927 OGRPolygon(); 00928 virtual ~OGRPolygon(); 00929 00930 // Non standard (OGRGeometry). 00931 virtual const char *getGeometryName() const; 00932 virtual OGRwkbGeometryType getGeometryType() const; 00933 virtual OGRBoolean hasCurveGeometry(int bLookForNonLinear = FALSE) const; 00934 virtual OGRGeometry* getCurveGeometry(const char* const* papszOptions = NULL) const; 00935 virtual OGRGeometry* getLinearGeometry(double dfMaxAngleStepSizeDegrees = 0, 00936 const char* const* papszOptions = NULL) const; 00937 00938 // ISurface Interface 00939 virtual int PointOnSurface( OGRPoint * poPoint ) const; 00940 00941 // IWks Interface 00942 virtual int WkbSize() const; 00943 virtual OGRErr importFromWkb( unsigned char *, int = -1, OGRwkbVariant=wkbVariantOldOgc ); 00944 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char *, OGRwkbVariant=wkbVariantOldOgc ) const; 00945 virtual OGRErr importFromWkt( char ** ); 00946 virtual OGRErr exportToWkt( char ** ppszDstText, OGRwkbVariant=wkbVariantOldOgc ) const; 00947 00948 // ICurvePolygon 00949 virtual OGRPolygon* CurvePolyToPoly(double dfMaxAngleStepSizeDegrees = 0, 00950 const char* const* papszOptions = NULL) const; 00951 00952 OGRLinearRing *getExteriorRing(); 00953 const OGRLinearRing *getExteriorRing() const; 00954 OGRLinearRing *getInteriorRing( int ); 00955 const OGRLinearRing *getInteriorRing( int ) const; 00956 00957 OGRLinearRing *stealExteriorRing(); 00958 OGRLinearRing *stealInteriorRing(int); 00959 00960 OGRBoolean IsPointOnSurface( const OGRPoint * ) const; 00961 00962 virtual void closeRings(); 00963 }; 00964 00965 /************************************************************************/ 00966 /* OGRGeometryCollection */ 00967 /************************************************************************/ 00968 00976 class CPL_DLL OGRGeometryCollection : public OGRGeometry 00977 { 00978 OGRErr importFromWkbInternal( unsigned char * pabyData, int nSize, int nRecLevel, 00979 OGRwkbVariant ); 00980 OGRErr importFromWktInternal( char **ppszInput, int nRecLevel ); 00981 00982 protected: 00983 int nGeomCount; 00984 OGRGeometry **papoGeoms; 00985 00986 OGRErr exportToWktInternal( char ** ppszDstText, 00987 OGRwkbVariant eWkbVariant, 00988 const char* pszSkipPrefix ) const; 00989 virtual OGRBoolean isCompatibleSubType( OGRwkbGeometryType ) const; 00990 00991 static OGRGeometryCollection* TransferMembersAndDestroy(OGRGeometryCollection* poSrc, 00992 OGRGeometryCollection* poDst); 00993 00994 public: 00995 OGRGeometryCollection(); 00996 virtual ~OGRGeometryCollection(); 00997 00998 // Non standard (OGRGeometry). 00999 virtual const char *getGeometryName() const; 01000 virtual OGRwkbGeometryType getGeometryType() const; 01001 virtual OGRGeometry *clone() const; 01002 virtual void empty(); 01003 virtual OGRErr transform( OGRCoordinateTransformation *poCT ); 01004 virtual void flattenTo2D(); 01005 virtual OGRBoolean IsEmpty() const; 01006 virtual void segmentize(double dfMaxLength); 01007 virtual OGRBoolean hasCurveGeometry(int bLookForNonLinear = FALSE) const; 01008 virtual OGRGeometry* getCurveGeometry(const char* const* papszOptions = NULL) const; 01009 virtual OGRGeometry* getLinearGeometry(double dfMaxAngleStepSizeDegrees = 0, const char* const* papszOptions = NULL) const; 01010 01011 // IWks Interface 01012 virtual int WkbSize() const; 01013 virtual OGRErr importFromWkb( unsigned char *, int = -1, OGRwkbVariant=wkbVariantOldOgc ); 01014 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char *, OGRwkbVariant=wkbVariantOldOgc ) const; 01015 virtual OGRErr importFromWkt( char ** ); 01016 virtual OGRErr exportToWkt( char ** ppszDstText, OGRwkbVariant=wkbVariantOldOgc ) const; 01017 01018 virtual double get_Length() const; 01019 virtual double get_Area() const; 01020 01021 // IGeometry methods 01022 virtual int getDimension() const; 01023 virtual void getEnvelope( OGREnvelope * psEnvelope ) const; 01024 virtual void getEnvelope( OGREnvelope3D * psEnvelope ) const; 01025 01026 // IGeometryCollection 01027 int getNumGeometries() const; 01028 OGRGeometry *getGeometryRef( int ); 01029 const OGRGeometry *getGeometryRef( int ) const; 01030 01031 // ISpatialRelation 01032 virtual OGRBoolean Equals( OGRGeometry * ) const; 01033 01034 // Non standard 01035 virtual void setCoordinateDimension( int nDimension ); 01036 virtual OGRErr addGeometry( const OGRGeometry * ); 01037 virtual OGRErr addGeometryDirectly( OGRGeometry * ); 01038 virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE ); 01039 01040 void closeRings(); 01041 01042 virtual void swapXY(); 01043 }; 01044 01045 /************************************************************************/ 01046 /* OGRMultiSurface */ 01047 /************************************************************************/ 01048 01055 class CPL_DLL OGRMultiSurface : public OGRGeometryCollection 01056 { 01057 protected: 01058 virtual OGRBoolean isCompatibleSubType( OGRwkbGeometryType ) const; 01059 01060 public: 01061 OGRMultiSurface(); 01062 virtual ~OGRMultiSurface(); 01063 01064 // Non standard (OGRGeometry). 01065 virtual const char *getGeometryName() const; 01066 virtual OGRwkbGeometryType getGeometryType() const; 01067 virtual OGRErr importFromWkt( char ** ); 01068 virtual OGRErr exportToWkt( char **, OGRwkbVariant=wkbVariantOldOgc ) const; 01069 01070 // IMultiSurface methods 01071 virtual OGRErr PointOnSurface( OGRPoint * poPoint ) const; 01072 01073 // IGeometry methods 01074 virtual int getDimension() const; 01075 01076 // Non standard 01077 virtual OGRBoolean hasCurveGeometry(int bLookForNonLinear = FALSE) const; 01078 01079 static OGRMultiPolygon* CastToMultiPolygon(OGRMultiSurface* poMS); 01080 }; 01081 01082 /************************************************************************/ 01083 /* OGRMultiPolygon */ 01084 /************************************************************************/ 01085 01090 class CPL_DLL OGRMultiPolygon : public OGRMultiSurface 01091 { 01092 protected: 01093 virtual OGRBoolean isCompatibleSubType( OGRwkbGeometryType ) const; 01094 01095 public: 01096 OGRMultiPolygon(); 01097 virtual ~OGRMultiPolygon(); 01098 01099 // Non standard (OGRGeometry). 01100 virtual const char *getGeometryName() const; 01101 virtual OGRwkbGeometryType getGeometryType() const; 01102 virtual OGRErr exportToWkt( char **, OGRwkbVariant=wkbVariantOldOgc ) const; 01103 01104 // IMultiSurface methods 01105 virtual OGRErr PointOnSurface( OGRPoint * poPoint ) const; 01106 01107 // Non standard 01108 virtual OGRBoolean hasCurveGeometry(int bLookForNonLinear = FALSE) const; 01109 01110 static OGRMultiSurface* CastToMultiSurface(OGRMultiPolygon* poMP); 01111 }; 01112 01113 /************************************************************************/ 01114 /* OGRMultiPoint */ 01115 /************************************************************************/ 01116 01121 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection 01122 { 01123 private: 01124 OGRErr importFromWkt_Bracketed( char **, int bHasM, int bHasZ ); 01125 01126 protected: 01127 virtual OGRBoolean isCompatibleSubType( OGRwkbGeometryType ) const; 01128 01129 public: 01130 OGRMultiPoint(); 01131 virtual ~OGRMultiPoint(); 01132 01133 // Non standard (OGRGeometry). 01134 virtual const char *getGeometryName() const; 01135 virtual OGRwkbGeometryType getGeometryType() const; 01136 virtual OGRErr importFromWkt( char ** ); 01137 virtual OGRErr exportToWkt( char **, OGRwkbVariant=wkbVariantOldOgc ) const; 01138 01139 // IGeometry methods 01140 virtual int getDimension() const; 01141 01142 // Non standard 01143 virtual OGRBoolean hasCurveGeometry(int bLookForNonLinear = FALSE) const; 01144 }; 01145 01146 /************************************************************************/ 01147 /* OGRMultiCurve */ 01148 /************************************************************************/ 01149 01156 class CPL_DLL OGRMultiCurve : public OGRGeometryCollection 01157 { 01158 protected: 01159 static OGRErr addCurveDirectlyFromWkt( OGRGeometry* poSelf, OGRCurve* poCurve ); 01160 virtual OGRBoolean isCompatibleSubType( OGRwkbGeometryType ) const; 01161 01162 public: 01163 OGRMultiCurve(); 01164 virtual ~OGRMultiCurve(); 01165 01166 // Non standard (OGRGeometry). 01167 virtual const char *getGeometryName() const; 01168 virtual OGRwkbGeometryType getGeometryType() const; 01169 virtual OGRErr importFromWkt( char ** ); 01170 virtual OGRErr exportToWkt( char **, OGRwkbVariant=wkbVariantOldOgc ) const; 01171 01172 // IGeometry methods 01173 virtual int getDimension() const; 01174 01175 // Non standard 01176 virtual OGRBoolean hasCurveGeometry(int bLookForNonLinear = FALSE) const; 01177 01178 static OGRMultiLineString* CastToMultiLineString(OGRMultiCurve* poMC); 01179 }; 01180 01181 /************************************************************************/ 01182 /* OGRMultiLineString */ 01183 /************************************************************************/ 01184 01189 class CPL_DLL OGRMultiLineString : public OGRMultiCurve 01190 { 01191 protected: 01192 virtual OGRBoolean isCompatibleSubType( OGRwkbGeometryType ) const; 01193 01194 public: 01195 OGRMultiLineString(); 01196 virtual ~OGRMultiLineString(); 01197 01198 // Non standard (OGRGeometry). 01199 virtual const char *getGeometryName() const; 01200 virtual OGRwkbGeometryType getGeometryType() const; 01201 virtual OGRErr exportToWkt( char **, OGRwkbVariant=wkbVariantOldOgc ) const; 01202 01203 // Non standard 01204 virtual OGRBoolean hasCurveGeometry(int bLookForNonLinear = FALSE) const; 01205 01206 static OGRMultiCurve* CastToMultiCurve(OGRMultiLineString* poMLS); 01207 }; 01208 01209 01210 /************************************************************************/ 01211 /* OGRGeometryFactory */ 01212 /************************************************************************/ 01213 01218 class CPL_DLL OGRGeometryFactory 01219 { 01220 static OGRErr createFromFgfInternal( unsigned char *pabyData, 01221 OGRSpatialReference * poSR, 01222 OGRGeometry **ppoReturn, 01223 int nBytes, 01224 int *pnBytesConsumed, 01225 int nRecLevel ); 01226 public: 01227 static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *, 01228 OGRGeometry **, int = -1, OGRwkbVariant=wkbVariantOldOgc ); 01229 static OGRErr createFromWkt( char **, OGRSpatialReference *, 01230 OGRGeometry ** ); 01231 static OGRErr createFromFgf( unsigned char *, OGRSpatialReference *, 01232 OGRGeometry **, int = -1, int * = NULL ); 01233 static OGRGeometry *createFromGML( const char * ); 01234 static OGRGeometry *createFromGEOS( GEOSContextHandle_t hGEOSCtxt, GEOSGeom ); 01235 01236 static void destroyGeometry( OGRGeometry * ); 01237 static OGRGeometry *createGeometry( OGRwkbGeometryType ); 01238 01239 static OGRGeometry * forceToPolygon( OGRGeometry * ); 01240 static OGRGeometry * forceToLineString( OGRGeometry *, bool bOnlyInOrder = true ); 01241 static OGRGeometry * forceToMultiPolygon( OGRGeometry * ); 01242 static OGRGeometry * forceToMultiPoint( OGRGeometry * ); 01243 static OGRGeometry * forceToMultiLineString( OGRGeometry * ); 01244 01245 static OGRGeometry * forceTo( OGRGeometry* poGeom, 01246 OGRwkbGeometryType eTargetType, 01247 const char*const* papszOptions = NULL ); 01248 01249 static OGRGeometry * organizePolygons( OGRGeometry **papoPolygons, 01250 int nPolygonCount, 01251 int *pbResultValidGeometry, 01252 const char **papszOptions = NULL); 01253 static int haveGEOS(); 01254 01255 static OGRGeometry* transformWithOptions( const OGRGeometry* poSrcGeom, 01256 OGRCoordinateTransformation *poCT, 01257 char** papszOptions ); 01258 01259 static OGRGeometry* 01260 approximateArcAngles( double dfX, double dfY, double dfZ, 01261 double dfPrimaryRadius, double dfSecondaryAxis, 01262 double dfRotation, 01263 double dfStartAngle, double dfEndAngle, 01264 double dfMaxAngleStepSizeDegrees ); 01265 01266 static int GetCurveParmeters(double x0, double y0, 01267 double x1, double y1, 01268 double x2, double y2, 01269 double& R, double& cx, double& cy, 01270 double& alpha0, double& alpha1, double& alpha2 ); 01271 static OGRLineString* curveToLineString( double x0, double y0, double z0, 01272 double x1, double y1, double z1, 01273 double x2, double y2, double z2, 01274 int bHasZ, 01275 double dfMaxAngleStepSizeDegrees, 01276 const char*const* papszOptions = NULL ); 01277 static OGRCurve* curveFromLineString(const OGRLineString* poLS, 01278 const char*const* papszOptions = NULL); 01279 }; 01280 01281 OGRwkbGeometryType CPL_DLL OGRFromOGCGeomType( const char *pszGeomType ); 01282 const char CPL_DLL * OGRToOGCGeomType( OGRwkbGeometryType eGeomType ); 01283 01284 /* Prepared geometry API (needs GEOS >= 3.1.0) */ 01285 typedef struct _OGRPreparedGeometry OGRPreparedGeometry; 01286 int OGRHasPreparedGeometrySupport(); 01287 OGRPreparedGeometry* OGRCreatePreparedGeometry( const OGRGeometry* poGeom ); 01288 void OGRDestroyPreparedGeometry( OGRPreparedGeometry* poPreparedGeom ); 01289 int OGRPreparedGeometryIntersects( const OGRPreparedGeometry* poPreparedGeom, 01290 const OGRGeometry* poOtherGeom ); 01291 01292 #endif /* ndef _OGR_GEOMETRY_H_INCLUDED */