00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef GEOS_GEOM_POLYGON_H
00022 #define GEOS_GEOM_POLYGON_H
00023
00024 #include <geos/export.h>
00025 #include <string>
00026 #include <vector>
00027 #include <geos/platform.h>
00028 #include <geos/geom/Geometry.h>
00029 #include <geos/geom/Polygonal.h>
00030 #include <geos/geom/Envelope.h>
00031 #include <geos/geom/Dimension.h>
00032
00033 #include <geos/inline.h>
00034
00035 #include <memory>
00036
00037
00038 namespace geos {
00039 namespace geom {
00040 class Coordinate;
00041 class CoordinateArraySequence;
00042 class CoordinateSequenceFilter;
00043 class LinearRing;
00044 class LineString;
00045 }
00046 }
00047
00048 namespace geos {
00049 namespace geom {
00050
00066 class GEOS_DLL Polygon: public virtual Geometry, public Polygonal
00067 {
00068
00069 public:
00070
00071 friend class GeometryFactory;
00072
00074 typedef std::vector<const Polygon *> ConstVect;
00075
00076 virtual ~Polygon();
00077
00084 virtual Geometry *clone() const { return new Polygon(*this); }
00085
00086 CoordinateSequence* getCoordinates() const;
00087
00088 size_t getNumPoints() const;
00089
00091 Dimension::DimensionType getDimension() const;
00092
00094 virtual int getCoordinateDimension() const;
00095
00097 int getBoundaryDimension() const;
00098
00105 Geometry* getBoundary() const;
00106
00107 bool isEmpty() const;
00108
00115 bool isSimple() const;
00116
00118 const LineString* getExteriorRing() const;
00119
00121 size_t getNumInteriorRing() const;
00122
00124 const LineString* getInteriorRingN(std::size_t n) const;
00125
00126 std::string getGeometryType() const;
00127 virtual GeometryTypeId getGeometryTypeId() const;
00128 bool equalsExact(const Geometry *other, double tolerance=0) const;
00129 void apply_rw(const CoordinateFilter *filter);
00130 void apply_ro(CoordinateFilter *filter) const;
00131 void apply_rw(GeometryFilter *filter);
00132 void apply_ro(GeometryFilter *filter) const;
00133 void apply_rw(CoordinateSequenceFilter& filter);
00134 void apply_ro(CoordinateSequenceFilter& filter) const;
00135
00136 Geometry* convexHull() const;
00137
00138 void normalize();
00139
00140 int compareToSameClass(const Geometry *p) const;
00141
00142 const Coordinate* getCoordinate() const;
00143
00144 double getArea() const;
00145
00147 double getLength() const;
00148
00149 void apply_rw(GeometryComponentFilter *filter);
00150
00151 void apply_ro(GeometryComponentFilter *filter) const;
00152
00153 bool isRectangle() const;
00154
00155 protected:
00156
00157
00158 Polygon(const Polygon &p);
00159
00178 Polygon(LinearRing *newShell, std::vector<Geometry *> *newHoles,
00179 const GeometryFactory *newFactory);
00180
00181 LinearRing *shell;
00182
00183 std::vector<Geometry *> *holes;
00184
00185 Envelope::AutoPtr computeEnvelopeInternal() const;
00186
00187 private:
00188
00189 void normalize(LinearRing *ring, bool clockwise);
00190 };
00191
00192 }
00193 }
00194
00195 #endif // ndef GEOS_GEOM_POLYGON_H