192
192
if( !EQUAL(szToken,getGeometryName()) )
193
193
return OGRERR_CORRUPT_DATA;
195
/* -------------------------------------------------------------------- */
196
/* Skip past first bracket for checking purposes, but don't */
197
/* alter pszInput. */
198
/* -------------------------------------------------------------------- */
199
const char *pszPreScan = pszInput;
202
while( *pszPreScan == ' ' || *pszPreScan == '\t' )
205
// Handle the proper EMPTY syntax.
206
if( EQUALN(pszPreScan,"EMPTY",5) )
208
*ppszInput = (char *) pszPreScan+5;
212
// Skip outer bracket.
213
if( *pszPreScan != '(' )
214
return OGRERR_CORRUPT_DATA;
218
/* -------------------------------------------------------------------- */
219
/* If the next token is EMPTY, then verify that we have proper */
220
/* EMPTY format will a trailing closing bracket. */
221
/* -------------------------------------------------------------------- */
222
OGRWktReadToken( pszPreScan, szToken );
196
/* -------------------------------------------------------------------- */
197
/* Check for EMPTY ... */
198
/* -------------------------------------------------------------------- */
199
const char *pszPreScan;
200
int bHasZ = FALSE, bHasM = FALSE;
202
pszPreScan = OGRWktReadToken( pszInput, szToken );
223
203
if( EQUAL(szToken,"EMPTY") )
225
pszInput = OGRWktReadToken( pszPreScan, szToken );
226
pszInput = OGRWktReadToken( pszInput, szToken );
228
*ppszInput = (char *) pszInput;
230
if( !EQUAL(szToken,")") )
231
return OGRERR_CORRUPT_DATA;
205
*ppszInput = (char *) pszPreScan;
210
/* -------------------------------------------------------------------- */
211
/* Check for Z, M or ZM. Will ignore the Measure */
212
/* -------------------------------------------------------------------- */
213
else if( EQUAL(szToken,"Z") )
217
else if( EQUAL(szToken,"M") )
221
else if( EQUAL(szToken,"ZM") )
229
pszInput = pszPreScan;
230
pszPreScan = OGRWktReadToken( pszInput, szToken );
231
if( EQUAL(szToken,"EMPTY") )
233
*ppszInput = (char *) pszPreScan;
235
/* FIXME?: In theory we should store the dimension and M presence */
236
/* if we want to allow round-trip with ExportToWKT v1.2 */
233
237
return OGRERR_NONE;
236
/* -------------------------------------------------------------------- */
237
/* Check for inner bracket indicating the improper bracketed */
238
/* format which we still want to support. */
239
/* -------------------------------------------------------------------- */
241
while( *pszPreScan == ' ' || *pszPreScan == '\t' )
241
if( !EQUAL(szToken,"(") )
242
return OGRERR_CORRUPT_DATA;
244
if ( !bHasZ && !bHasM )
246
/* Test for old-style MULTIPOINT(EMPTY) */
247
pszPreScan = OGRWktReadToken( pszPreScan, szToken );
248
if( EQUAL(szToken,"EMPTY") )
250
pszPreScan = OGRWktReadToken( pszPreScan, szToken );
252
if( EQUAL(szToken,",") )
254
/* This is OK according to SFSQL SPEC. */
256
else if( !EQUAL(szToken,")") )
257
return OGRERR_CORRUPT_DATA;
260
*ppszInput = (char *) pszPreScan;
267
pszPreScan = OGRWktReadToken( pszInput, szToken );
268
OGRWktReadToken( pszPreScan, szToken );
244
270
// Do we have an inner bracket?
245
if( *pszPreScan == '(' )
246
return importFromWkt_Bracketed( ppszInput );
271
if (EQUAL(szToken,"(") || EQUAL(szToken, "EMPTY") )
272
return importFromWkt_Bracketed( ppszInput, bHasM, bHasZ );
276
return OGRERR_CORRUPT_DATA;
248
279
/* -------------------------------------------------------------------- */
249
280
/* Read the point list which should consist of exactly one point. */
250
281
/* -------------------------------------------------------------------- */
318
359
OGRRawPoint *paoPoints = NULL;
319
360
double *padfZ = NULL;
321
while( (pszInput = OGRWktReadToken( pszInput, szToken ))
362
while( (pszInput = OGRWktReadToken( pszInput, szToken )) != NULL
322
363
&& (EQUAL(szToken,"(") || EQUAL(szToken,",")) )
324
365
OGRGeometry *poGeom;
367
const char* pszNext = OGRWktReadToken( pszInput, szToken );
368
if (EQUAL(szToken,"EMPTY"))
370
poGeom = new OGRPoint(0,0);
372
eErr = addGeometryDirectly( poGeom );
373
if( eErr != OGRERR_NONE )
326
381
pszInput = OGRWktReadPoints( pszInput, &paoPoints, &padfZ, &nMaxPoint,
329
384
if( pszInput == NULL || nPointCount != 1 )
386
OGRFree( paoPoints );
330
388
return OGRERR_CORRUPT_DATA;
391
/* Ignore Z array when we have a MULTIPOINT M */
392
if( padfZ && !(bHasM && !bHasZ))
333
393
poGeom = new OGRPoint( paoPoints[0].x,