OGRErr OGRMultiPoint::importFromWkt_Bracketed( char ** ppszInput, int bHasM, int bHasZ ) { char szToken[OGR_WKT_TOKEN_MAX]; const char *pszInput = *ppszInput; OGRErr eErr = OGRERR_NONE; /* -------------------------------------------------------------------- */ /* Skip MULTIPOINT keyword. */ /* -------------------------------------------------------------------- */ pszInput = OGRWktReadToken( pszInput, szToken ); if (bHasZ || bHasM) { /* Skip Z, M or ZM */ pszInput = OGRWktReadToken( pszInput, szToken ); } /* -------------------------------------------------------------------- */ /* Read points till we get to the closing bracket. */ /* -------------------------------------------------------------------- */ int nMaxPoint = 0; int nPointCount = 0; OGRRawPoint *paoPoints = NULL; double *padfZ = NULL; while( (pszInput = OGRWktReadToken( pszInput, szToken )) != NULL && (EQUAL(szToken,"(") || EQUAL(szToken,",")) ) { OGRGeometry *poGeom; const char* pszNext = OGRWktReadToken( pszInput, szToken ); if (EQUAL(szToken,"EMPTY")) { poGeom = new OGRPoint(0,0); poGeom->empty(); eErr = addGeometryDirectly( poGeom ); if( eErr != OGRERR_NONE ) return eErr; pszInput = pszNext; continue; } pszInput = OGRWktReadPoints( pszInput, &paoPoints, &padfZ, &nMaxPoint, &nPointCount ); if( pszInput == NULL || nPointCount != 1 ) { OGRFree( paoPoints ); OGRFree( padfZ ); return OGRERR_CORRUPT_DATA; } /* Ignore Z array when we have a MULTIPOINT M */ if( padfZ && !(bHasM && !bHasZ)) poGeom = new OGRPoint( paoPoints[0].x, paoPoints[0].y, padfZ[0] ); else poGeom = new OGRPoint( paoPoints[0].x, paoPoints[0].y ); eErr = addGeometryDirectly( poGeom ); if( eErr != OGRERR_NONE ) return eErr; } /* -------------------------------------------------------------------- */ /* Cleanup. */ /* -------------------------------------------------------------------- */ OGRFree( paoPoints ); if( padfZ ) OGRFree( padfZ ); if( !EQUAL(szToken,")") ) return OGRERR_CORRUPT_DATA; *ppszInput = (char *) pszInput; return OGRERR_NONE; }