00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef GEOS_GEOM_COORDINATESEQUENCE_H
00016 #define GEOS_GEOM_COORDINATESEQUENCE_H
00017
00018 #include <geos/export.h>
00019 #include <geos/platform.h>
00020 #include <geos/inline.h>
00021
00022 #include <geos/geom/Coordinate.h>
00023
00024 #include <vector>
00025 #include <iosfwd>
00026 #include <memory>
00027
00028
00029 namespace geos {
00030 namespace geom {
00031 class Envelope;
00032 class CoordinateFilter;
00033 class Coordinate;
00034 }
00035 }
00036
00037 namespace geos {
00038 namespace geom {
00039
00059 class GEOS_DLL CoordinateSequence {
00060
00061 protected:
00062
00063 CoordinateSequence() {}
00064
00065 CoordinateSequence(const CoordinateSequence&) {}
00066
00067 public:
00068
00069 typedef std::auto_ptr<CoordinateSequence> AutoPtr;
00070
00071 virtual ~CoordinateSequence() {}
00072
00076 virtual CoordinateSequence *clone() const=0;
00077
00084
00085 virtual const Coordinate& getAt(std::size_t i) const=0;
00086
00088 const Coordinate& back() const {
00089 return getAt(size()-1);
00090 }
00091
00093 const Coordinate& front() const {
00094 return getAt(0);
00095 }
00096
00097 const Coordinate& operator[] (std::size_t i) const {
00098 return getAt(i);
00099 }
00100
00104 virtual void getAt(std::size_t i, Coordinate& c) const=0;
00105
00110
00111 virtual std::size_t getSize() const=0;
00112
00113 size_t size() const { return getSize(); }
00114
00135 virtual const std::vector<Coordinate>* toVector() const=0;
00136
00138
00141 virtual void toVector(std::vector<Coordinate>& coords) const=0;
00142
00150 void add(const std::vector<Coordinate>* vc, bool allowRepeated);
00151
00152
00153
00154
00167 void add(const CoordinateSequence *cl, bool allowRepeated,
00168 bool direction);
00169
00177 virtual void add(const Coordinate& c, bool allowRepeated);
00178
00190 virtual void add(std::size_t i, const Coordinate& coord, bool allowRepeated)=0;
00191
00193 virtual bool isEmpty() const=0;
00194
00196 virtual void add(const Coordinate& c)=0;
00197
00198
00199
00200
00202
00203
00205 virtual void setAt(const Coordinate& c, std::size_t pos)=0;
00206
00208 virtual void deleteAt(std::size_t pos)=0;
00209
00211 virtual std::string toString() const=0;
00212
00214 virtual void setPoints(const std::vector<Coordinate> &v)=0;
00215
00217 bool hasRepeatedPoints() const;
00218
00220 const Coordinate* minCoordinate() const;
00221
00222
00231 static CoordinateSequence* removeRepeatedPoints(
00232 const CoordinateSequence *cl);
00233
00235
00238 virtual CoordinateSequence& removeRepeatedPoints()=0;
00239
00244 static bool hasRepeatedPoints(const CoordinateSequence *cl);
00245
00250 static CoordinateSequence* atLeastNCoordinatesOrNothing(std::size_t n,
00251 CoordinateSequence *c);
00252
00258 static const Coordinate* minCoordinate(CoordinateSequence *cl);
00259
00261
00265 static int indexOf(const Coordinate *coordinate,
00266 const CoordinateSequence *cl);
00267
00273 static bool equals(const CoordinateSequence *cl1,
00274 const CoordinateSequence *cl2);
00275
00277 static void scroll(CoordinateSequence *cl, const Coordinate *firstCoordinate);
00278
00296 static int increasingDirection(const CoordinateSequence& pts);
00297
00299 static void reverse(CoordinateSequence *cl);
00300
00302 enum { X,Y,Z,M };
00303
00310 virtual std::size_t getDimension() const=0;
00311
00322 virtual double getOrdinate(std::size_t index, std::size_t ordinateIndex) const=0;
00323
00330 virtual double getX(std::size_t index) const { return getOrdinate(index, X); }
00331
00338 virtual double getY(std::size_t index) const { return getOrdinate(index, Y); }
00339
00340
00349 virtual void setOrdinate(std::size_t index, std::size_t ordinateIndex, double value)=0;
00350
00358 virtual void expandEnvelope(Envelope &env) const;
00359
00360 virtual void apply_rw(const CoordinateFilter *filter)=0;
00361 virtual void apply_ro(CoordinateFilter *filter) const=0;
00362
00371 template <class T>
00372 void applyCoordinateFilter(T& f)
00373 {
00374 Coordinate c;
00375 for(std::size_t i=0, n=size(); i<n; ++i)
00376 {
00377 getAt(i, c);
00378 f.filter(c);
00379 setAt(c, i);
00380 }
00381 }
00382
00383 };
00384
00385 GEOS_DLL std::ostream& operator<< (std::ostream& os, const CoordinateSequence& cs);
00386
00387 GEOS_DLL bool operator== (const CoordinateSequence& s1, const CoordinateSequence& s2);
00388
00389 GEOS_DLL bool operator!= (const CoordinateSequence& s1, const CoordinateSequence& s2);
00390
00391 }
00392 }
00393
00394
00395
00396
00397
00398 #endif // ndef GEOS_GEOM_COORDINATESEQUENCE_H