GEOS
3.6.2
|
00001 /********************************************************************** 00002 * 00003 * GEOS - Geometry Engine Open Source 00004 * http://geos.osgeo.org 00005 * 00006 * Copyright (C) 2010 Sandro Santilli <strk@keybit.net> 00007 * Copyright (C) 2005-2006 Refractions Research Inc. 00008 * Copyright (C) 2001-2002 Vivid Solutions Inc. 00009 * 00010 * This is free software; you can redistribute and/or modify it under 00011 * the terms of the GNU Lesser General Public Licence as published 00012 * by the Free Software Foundation. 00013 * See the COPYING file for more information. 00014 * 00015 ********************************************************************** 00016 * 00017 * Last port: operation/valid/IsValidOp.java r335 (JTS-1.12) 00018 * 00019 **********************************************************************/ 00020 00021 #ifndef GEOS_OP_ISVALIDOP_H 00022 #define GEOS_OP_ISVALIDOP_H 00023 00024 #include <geos/export.h> 00025 00026 #include <geos/operation/valid/TopologyValidationError.h> // for inlined destructor 00027 00028 // Forward declarations 00029 namespace geos { 00030 namespace util { 00031 class TopologyValidationError; 00032 } 00033 namespace geom { 00034 class CoordinateSequence; 00035 class GeometryFactory; 00036 class Geometry; 00037 class Point; 00038 class LinearRing; 00039 class LineString; 00040 class Polygon; 00041 class GeometryCollection; 00042 class MultiPolygon; 00043 class MultiLineString; 00044 } 00045 namespace geomgraph { 00046 class DirectedEdge; 00047 class EdgeIntersectionList; 00048 class PlanarGraph; 00049 class GeometryGraph; 00050 } 00051 } 00052 00053 namespace geos { 00054 namespace operation { // geos::operation 00055 namespace valid { // geos::operation::valid 00056 00061 class GEOS_DLL IsValidOp { 00062 friend class Unload; 00063 private: 00065 const geom::Geometry *parentGeometry; 00066 00067 bool isChecked; 00068 00069 // CHECKME: should this really be a pointer ? 00070 TopologyValidationError* validErr; 00071 00072 // This is the version using 'isChecked' flag 00073 void checkValid(); 00074 00075 void checkValid(const geom::Geometry *g); 00076 void checkValid(const geom::Point *g); 00077 void checkValid(const geom::LinearRing *g); 00078 void checkValid(const geom::LineString *g); 00079 void checkValid(const geom::Polygon *g); 00080 void checkValid(const geom::MultiPolygon *g); 00081 void checkValid(const geom::GeometryCollection *gc); 00082 void checkConsistentArea(geomgraph::GeometryGraph *graph); 00083 00084 00093 void checkNoSelfIntersectingRings(geomgraph::GeometryGraph *graph); 00094 00101 void checkNoSelfIntersectingRing( 00102 geomgraph::EdgeIntersectionList &eiList); 00103 00104 void checkTooFewPoints(geomgraph::GeometryGraph *graph); 00105 00117 void checkHolesInShell(const geom::Polygon *p, 00118 geomgraph::GeometryGraph *graph); 00119 00132 void checkHolesNotNested(const geom::Polygon *p, 00133 geomgraph::GeometryGraph *graph); 00134 00149 void checkShellsNotNested(const geom::MultiPolygon *mp, 00150 geomgraph::GeometryGraph *graph); 00151 00163 void checkShellNotNested(const geom::LinearRing *shell, 00164 const geom::Polygon *p, 00165 geomgraph::GeometryGraph *graph); 00166 00177 const geom::Coordinate *checkShellInsideHole( 00178 const geom::LinearRing *shell, 00179 const geom::LinearRing *hole, 00180 geomgraph::GeometryGraph *graph); 00181 00182 void checkConnectedInteriors(geomgraph::GeometryGraph &graph); 00183 00184 void checkInvalidCoordinates(const geom::CoordinateSequence *cs); 00185 00186 void checkInvalidCoordinates(const geom::Polygon *poly); 00187 00188 void checkClosedRings(const geom::Polygon *poly); 00189 00190 void checkClosedRing(const geom::LinearRing *ring); 00191 00192 bool isSelfTouchingRingFormingHoleValid; 00193 00194 public: 00201 static const geom::Coordinate *findPtNotNode( 00202 const geom::CoordinateSequence *testCoords, 00203 const geom::LinearRing *searchRing, 00204 geomgraph::GeometryGraph *graph); 00205 00214 static bool isValid(const geom::Coordinate &coord); 00215 00222 static bool isValid(const geom::Geometry &geom); 00223 00224 IsValidOp(const geom::Geometry *geom) 00225 : 00226 parentGeometry(geom), 00227 isChecked(false), 00228 validErr(NULL), 00229 isSelfTouchingRingFormingHoleValid(false) 00230 {} 00231 00233 virtual ~IsValidOp() { 00234 delete validErr; 00235 } 00236 00237 bool isValid(); 00238 00239 TopologyValidationError* getValidationError(); 00240 00267 void setSelfTouchingRingFormingHoleValid(bool isValid) 00268 { 00269 isSelfTouchingRingFormingHoleValid = isValid; 00270 } 00271 00272 }; 00273 00274 } // namespace geos.operation.valid 00275 } // namespace geos.operation 00276 } // namespace geos 00277 00278 #endif // GEOS_OP_ISVALIDOP_H