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
00146 virtual const std::vector<Coordinate>* toVector() const=0;
00147
00155 void add(const std::vector<Coordinate>* vc, bool allowRepeated);
00156
00157
00158
00159
00172 void add(const CoordinateSequence *cl, bool allowRepeated,
00173 bool direction);
00174
00182 virtual void add(const Coordinate& c, bool allowRepeated);
00183
00195 virtual void add(size_t i, const Coordinate& coord, bool allowRepeated)=0;
00196
00198 virtual bool isEmpty() const=0;
00199
00201 virtual void add(const Coordinate& c)=0;
00202
00203
00204
00205
00207
00208
00210 virtual void setAt(const Coordinate& c, size_t pos)=0;
00211
00213 virtual void deleteAt(size_t pos)=0;
00214
00216 virtual std::string toString() const=0;
00217
00219 virtual void setPoints(const std::vector<Coordinate> &v)=0;
00220
00222 bool hasRepeatedPoints() const;
00223
00225 const Coordinate* minCoordinate() const;
00226
00227
00236 static CoordinateSequence* removeRepeatedPoints(
00237 const CoordinateSequence *cl);
00238
00240
00243 virtual CoordinateSequence& removeRepeatedPoints()=0;
00244
00249 static bool hasRepeatedPoints(const CoordinateSequence *cl);
00250
00255 static CoordinateSequence* atLeastNCoordinatesOrNothing(size_t n,
00256 CoordinateSequence *c);
00257
00263 static const Coordinate* minCoordinate(CoordinateSequence *cl);
00264
00266
00270 static int indexOf(const Coordinate *coordinate,
00271 const CoordinateSequence *cl);
00272
00278 static bool equals(const CoordinateSequence *cl1,
00279 const CoordinateSequence *cl2);
00280
00282 static void scroll(CoordinateSequence *cl, const Coordinate *firstCoordinate);
00283
00301 static int increasingDirection(const CoordinateSequence& pts);
00302
00304 static void reverse(CoordinateSequence *cl);
00305
00307 enum { X,Y,Z,M };
00308
00315 virtual size_t getDimension() const=0;
00316
00327 virtual double getOrdinate(size_t index, size_t ordinateIndex) const=0;
00328
00335 virtual double getX(size_t index) const { return getOrdinate(index, X); }
00336
00343 virtual double getY(size_t index) const { return getOrdinate(index, Y); }
00344
00345
00354 virtual void setOrdinate(size_t index, size_t ordinateIndex, double value)=0;
00355
00363 virtual void expandEnvelope(Envelope &env) const;
00364
00365 virtual void apply_rw(const CoordinateFilter *filter)=0;
00366 virtual void apply_ro(CoordinateFilter *filter) const=0;
00367
00376 template <class T>
00377 void applyCoordinateFilter(T& f)
00378 {
00379 Coordinate c;
00380 for(size_t i=0, n=size(); i<n; ++i)
00381 {
00382 getAt(i, c);
00383 f.filter(c);
00384 setAt(c, i);
00385 }
00386 }
00387
00388 };
00389
00390 std::ostream& operator<< (std::ostream& os, const CoordinateSequence& cs);
00391
00392 bool operator== (const CoordinateSequence& s1, const CoordinateSequence& s2);
00393
00394 bool operator!= (const CoordinateSequence& s1, const CoordinateSequence& s2);
00395
00396 }
00397 }
00398
00399
00400
00401
00402
00403 #endif // ndef GEOS_GEOM_COORDINATESEQUENCE_H
00404
00405
00406
00407
00408
00409
00410
00411
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