00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef GEOS_GEOM_COORDINATESEQUENCE_H
00017 #define GEOS_GEOM_COORDINATESEQUENCE_H
00018
00019 #include <geos/export.h>
00020 #include <geos/platform.h>
00021 #include <geos/inline.h>
00022
00023 #include <geos/geom/Coordinate.h>
00024
00025 #include <vector>
00026 #include <iosfwd>
00027 #include <memory>
00028
00029
00030 namespace geos {
00031 namespace geom {
00032 class Envelope;
00033 class CoordinateFilter;
00034 class Coordinate;
00035 }
00036 }
00037
00038
00039 namespace geos {
00040 namespace geom {
00041
00061 class GEOS_DLL CoordinateSequence {
00062
00063 protected:
00064
00065 CoordinateSequence() {}
00066
00067 CoordinateSequence(const CoordinateSequence&) {}
00068
00069 public:
00070
00071 typedef std::auto_ptr<CoordinateSequence> AutoPtr;
00072
00073 friend std::ostream& operator<< (std::ostream& os,
00074 const CoordinateSequence& cs);
00075
00076 friend bool operator== (
00077 const CoordinateSequence& seq1,
00078 const CoordinateSequence& seq2);
00079
00080 friend bool operator!= (
00081 const CoordinateSequence& seq1,
00082 const CoordinateSequence& seq2);
00083
00084 virtual ~CoordinateSequence() {}
00085
00089 virtual CoordinateSequence *clone() const=0;
00090
00097
00098 virtual const Coordinate& getAt(size_t i) const=0;
00099
00101 const Coordinate& back() const {
00102 return getAt(size()-1);
00103 }
00104
00106 const Coordinate& front() const {
00107 return getAt(0);
00108 }
00109
00110 const Coordinate& operator[] (size_t i) const {
00111 return getAt(i);
00112 }
00113
00117 virtual void getAt(size_t i, Coordinate& c) const=0;
00118
00123
00124 virtual size_t getSize() const=0;
00125
00126 size_t size() const { return getSize(); }
00127
00148 virtual const std::vector<Coordinate>* toVector() const=0;
00149
00151
00154 virtual void toVector(std::vector<Coordinate>& coords) const=0;
00155
00163 void add(const std::vector<Coordinate>* vc, bool allowRepeated);
00164
00165
00166
00167
00180 void add(const CoordinateSequence *cl, bool allowRepeated,
00181 bool direction);
00182
00190 virtual void add(const Coordinate& c, bool allowRepeated);
00191
00203 virtual void add(size_t i, const Coordinate& coord, bool allowRepeated)=0;
00204
00206 virtual bool isEmpty() const=0;
00207
00209 virtual void add(const Coordinate& c)=0;
00210
00211
00212
00213
00215
00216
00218 virtual void setAt(const Coordinate& c, size_t pos)=0;
00219
00221 virtual void deleteAt(size_t pos)=0;
00222
00224 virtual std::string toString() const=0;
00225
00227 virtual void setPoints(const std::vector<Coordinate> &v)=0;
00228
00230 bool hasRepeatedPoints() const;
00231
00233 const Coordinate* minCoordinate() const;
00234
00235
00244 static CoordinateSequence* removeRepeatedPoints(
00245 const CoordinateSequence *cl);
00246
00248
00251 virtual CoordinateSequence& removeRepeatedPoints()=0;
00252
00257 static bool hasRepeatedPoints(const CoordinateSequence *cl);
00258
00263 static CoordinateSequence* atLeastNCoordinatesOrNothing(size_t n,
00264 CoordinateSequence *c);
00265
00271 static const Coordinate* minCoordinate(CoordinateSequence *cl);
00272
00274
00278 static int indexOf(const Coordinate *coordinate,
00279 const CoordinateSequence *cl);
00280
00286 static bool equals(const CoordinateSequence *cl1,
00287 const CoordinateSequence *cl2);
00288
00290 static void scroll(CoordinateSequence *cl, const Coordinate *firstCoordinate);
00291
00309 static int increasingDirection(const CoordinateSequence& pts);
00310
00312 static void reverse(CoordinateSequence *cl);
00313
00315 enum { X,Y,Z,M };
00316
00323 virtual size_t getDimension() const=0;
00324
00335 virtual double getOrdinate(size_t index, size_t ordinateIndex) const=0;
00336
00343 virtual double getX(size_t index) const { return getOrdinate(index, X); }
00344
00351 virtual double getY(size_t index) const { return getOrdinate(index, Y); }
00352
00353
00362 virtual void setOrdinate(size_t index, size_t ordinateIndex, double value)=0;
00363
00371 virtual void expandEnvelope(Envelope &env) const;
00372
00373 virtual void apply_rw(const CoordinateFilter *filter)=0;
00374 virtual void apply_ro(CoordinateFilter *filter) const=0;
00375
00384 template <class T>
00385 void applyCoordinateFilter(T& f)
00386 {
00387 Coordinate c;
00388 for(size_t i=0, n=size(); i<n; ++i)
00389 {
00390 getAt(i, c);
00391 f.filter(c);
00392 setAt(c, i);
00393 }
00394 }
00395
00396 };
00397
00398 std::ostream& operator<< (std::ostream& os, const CoordinateSequence& cs);
00399
00400 bool operator== (const CoordinateSequence& s1, const CoordinateSequence& s2);
00401
00402 bool operator!= (const CoordinateSequence& s1, const CoordinateSequence& s2);
00403
00404 }
00405 }
00406
00407
00408
00409
00410
00411 #endif // ndef GEOS_GEOM_COORDINATESEQUENCE_H
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451