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/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
00038 namespace geos {
00039 namespace geom {
00040
00060 class CoordinateSequence {
00061
00062 protected:
00063
00064 CoordinateSequence() {}
00065
00066 CoordinateSequence(const CoordinateSequence&) {}
00067
00068 public:
00069
00070 typedef std::auto_ptr<CoordinateSequence> AutoPtr;
00071
00072 friend std::ostream& operator<< (std::ostream& os,
00073 const CoordinateSequence& cs);
00074
00075 friend bool operator== (
00076 const CoordinateSequence& seq1,
00077 const CoordinateSequence& seq2);
00078
00079 friend bool operator!= (
00080 const CoordinateSequence& seq1,
00081 const CoordinateSequence& seq2);
00082
00083 virtual ~CoordinateSequence() {}
00084
00088 virtual CoordinateSequence *clone() const=0;
00089
00096
00097 virtual const Coordinate& getAt(size_t i) const=0;
00098
00100 const Coordinate& back() const {
00101 return getAt(size()-1);
00102 }
00103
00105 const Coordinate& front() const {
00106 return getAt(0);
00107 }
00108
00109 const Coordinate& operator[] (size_t i) const {
00110 return getAt(i);
00111 }
00112
00116 virtual void getAt(size_t i, Coordinate& c) const=0;
00117
00122
00123 virtual size_t getSize() const=0;
00124
00125 size_t size() const { return getSize(); }
00126
00145 virtual const std::vector<Coordinate>* toVector() const=0;
00146
00154 void add(const std::vector<Coordinate>* vc, bool allowRepeated);
00155
00156
00157
00158
00171 void add(const CoordinateSequence *cl, bool allowRepeated,
00172 bool direction);
00173
00181 virtual void add(const Coordinate& c, bool allowRepeated);
00182
00184 virtual bool isEmpty() const=0;
00185
00187 virtual void add(const Coordinate& c)=0;
00188
00189
00190
00191
00193
00194
00196 virtual void setAt(const Coordinate& c, size_t pos)=0;
00197
00199 virtual void deleteAt(size_t pos)=0;
00200
00202 virtual std::string toString() const=0;
00203
00205 virtual void setPoints(const std::vector<Coordinate> &v)=0;
00206
00208 bool hasRepeatedPoints() const;
00209
00211 const Coordinate* minCoordinate() const;
00212
00213
00220 static CoordinateSequence* removeRepeatedPoints(
00221 const CoordinateSequence *cl);
00222
00224
00227 virtual CoordinateSequence& removeRepeatedPoints()=0;
00228
00233 static bool hasRepeatedPoints(const CoordinateSequence *cl);
00234
00239 static CoordinateSequence* atLeastNCoordinatesOrNothing(size_t n,
00240 CoordinateSequence *c);
00241
00247 static const Coordinate* minCoordinate(CoordinateSequence *cl);
00248
00250
00254 static int indexOf(const Coordinate *coordinate,
00255 const CoordinateSequence *cl);
00256
00262 static bool equals(const CoordinateSequence *cl1,
00263 const CoordinateSequence *cl2);
00264
00266 static void scroll(CoordinateSequence *cl, const Coordinate *firstCoordinate);
00267
00269 static void reverse(CoordinateSequence *cl);
00270
00272 enum { X,Y,Z,M };
00273
00280 virtual size_t getDimension() const=0;
00281
00292 virtual double getOrdinate(size_t index, size_t ordinateIndex) const=0;
00293
00300 virtual double getX(size_t index) const { return getOrdinate(index, X); }
00301
00308 virtual double getY(size_t index) const { return getOrdinate(index, Y); }
00309
00310
00319 virtual void setOrdinate(size_t index, size_t ordinateIndex, double value)=0;
00320
00328 virtual void expandEnvelope(Envelope &env) const;
00329
00330 virtual void apply_rw(const CoordinateFilter *filter)=0;
00331 virtual void apply_ro(CoordinateFilter *filter) const=0;
00332
00341 template <class T>
00342 void applyCoordinateFilter(T& f)
00343 {
00344 Coordinate c;
00345 for(size_t i=0, n=size(); i<n; ++i)
00346 {
00347 getAt(i, c);
00348 f.filter(c);
00349 setAt(c, i);
00350 }
00351 }
00352
00353 };
00354
00355 std::ostream& operator<< (std::ostream& os, const CoordinateSequence& cs);
00356
00357 bool operator== (const CoordinateSequence& s1, const CoordinateSequence& s2);
00358
00359 bool operator!= (const CoordinateSequence& s1, const CoordinateSequence& s2);
00360
00361 }
00362 }
00363
00364
00365
00366
00367
00368 #endif // ndef GEOS_GEOM_COORDINATESEQUENCE_H
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408