~sharpie/geos/3.3.2

« back to all changes in this revision

Viewing changes to source/io/WKTReader.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Fabio Tranchitella
  • Date: 2006-11-06 21:35:52 UTC
  • mfrom: (3.1.3 feisty)
  • Revision ID: james.westby@ubuntu.com-20061106213552-m03o92ggj1na737b
Tags: 2.2.3-3
debian/control: move doxygen from build-depends-indep to build-depends.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/**********************************************************************
2
 
 * $Id: WKTReader.cpp,v 1.30 2004/12/08 13:54:43 strk Exp $
 
2
 * $Id: WKTReader.cpp,v 1.30.4.1 2006/04/26 16:29:43 strk Exp $
3
3
 *
4
4
 * GEOS - Geometry Engine Open Source
5
5
 * http://geos.refractions.net
16
16
 
17
17
#include <geos/io.h>
18
18
#include <geos/util.h>
 
19
#include <sstream>
19
20
 
20
21
namespace geos {
21
22
 
213
214
        return ret;
214
215
}
215
216
 
 
217
#if 0
216
218
MultiPoint* WKTReader::readMultiPointText(StringTokenizer *tokenizer) {
217
219
        CoordinateSequence *coords = getCoordinates(tokenizer);
218
220
        MultiPoint *ret = geometryFactory->createMultiPoint(*coords);
219
221
        delete coords;
220
222
        return ret;
221
223
}
 
224
#endif
 
225
 
 
226
MultiPoint*
 
227
WKTReader::readMultiPointText(StringTokenizer *tokenizer)
 
228
{
 
229
        string nextToken=getNextEmptyOrOpener(tokenizer);
 
230
        if (nextToken=="EMPTY") {
 
231
                return geometryFactory->createMultiPoint();
 
232
        }
 
233
 
 
234
        int tok = tokenizer->peekNextToken();
 
235
 
 
236
        if ( tok == StringTokenizer::TT_NUMBER )
 
237
        {
 
238
                // Try to parse deprecated form "MULTIPOINT(0 0, 1 1)"
 
239
                const CoordinateSequenceFactory* csf = \
 
240
                        geometryFactory->getCoordinateSequenceFactory();
 
241
                CoordinateSequence *coords = csf->create(NULL);
 
242
                try {
 
243
                        do {
 
244
                                Coordinate* coord=getPreciseCoordinate(tokenizer);
 
245
                                coords->add(*coord);
 
246
                                delete coord;
 
247
                                nextToken=getNextCloserOrComma(tokenizer);
 
248
                        } while(nextToken == ",");
 
249
 
 
250
                        MultiPoint *ret = geometryFactory->createMultiPoint(*coords);
 
251
                        delete coords;
 
252
                        return ret;
 
253
                } catch (...) {
 
254
                        delete coords;
 
255
                        throw;
 
256
                }
 
257
        }
 
258
 
 
259
        else if ( tok == '(' )
 
260
        {
 
261
                // Try to parse correct form "MULTIPOINT((0 0), (1 1))"
 
262
                vector<Geometry *> *points=new vector<Geometry *>();
 
263
                try {
 
264
                        do {
 
265
                                Point *point=readPointText(tokenizer);
 
266
                                points->push_back(point);
 
267
                                nextToken=getNextCloserOrComma(tokenizer);
 
268
                        } while(nextToken == ",");
 
269
                        return geometryFactory->createMultiPoint(points);
 
270
                } catch (...) {
 
271
                        // clean up 
 
272
                        for (size_t i=0; i<points->size(); i++)
 
273
                        {
 
274
                                delete (*points)[i];
 
275
                        }
 
276
                        delete points;
 
277
                        throw;
 
278
                }
 
279
        }
 
280
 
 
281
        else 
 
282
        {
 
283
                stringstream err;
 
284
                err << "Unexpected token: ";
 
285
                switch (tok)
 
286
                {
 
287
                        case StringTokenizer::TT_WORD:
 
288
                                err << "WORD " << tokenizer->getSVal();
 
289
                                break;
 
290
                        case StringTokenizer::TT_NUMBER:
 
291
                                err << "NUMBER " << tokenizer->getNVal();
 
292
                                break;
 
293
                        case StringTokenizer::TT_EOF:
 
294
                        case StringTokenizer::TT_EOL:
 
295
                                err << "EOF or EOL";
 
296
                                break;
 
297
                        case '(':
 
298
                                err << "(";
 
299
                                break;
 
300
                        case ')':
 
301
                                err << ")";
 
302
                                break;
 
303
                        case ',':
 
304
                                err << ",";
 
305
                                break;
 
306
                        default:
 
307
                                err << "??";
 
308
                                break;
 
309
                }
 
310
                err << endl;
 
311
                throw new ParseException(err.str());
 
312
                return NULL;
 
313
        }
 
314
}
222
315
 
223
316
Polygon*
224
317
WKTReader::readPolygonText(StringTokenizer *tokenizer)
314
407
 
315
408
/**********************************************************************
316
409
 * $Log: WKTReader.cpp,v $
 
410
 * Revision 1.30.4.1  2006/04/26 16:29:43  strk
 
411
 * Fixed WKTReader to accept the correct WKT for MultiPoints
 
412
 *
317
413
 * Revision 1.30  2004/12/08 13:54:43  strk
318
414
 * gcc warnings checked and fixed, general cleanups.
319
415
 *