private void loadPOICategories(BitBuffer bitBuffer, int nbrFeatures, int nbrBitsFeatureIdx) {
        
        bitBuffer.alignToByte();
        // Reserved 32 bits, do not use!
        int oldNbrOfCat = (int)bitBuffer.nextInt();
        
        if(oldNbrOfCat != 0) 
            return;
        
        if(bitBuffer.getNbrBytesLeft() == 0)
            return;
        
        int hasCategories = bitBuffer.nextBit();
        
        if(LOG.isTrace()) {
            LOG.trace("TileMap.loadPOICategories()", "hasCategories= "+hasCategories);
        }
        
        if(hasCategories == 1) {
            int nbrBitsCategories = bitBuffer.nextBits(4);
            int nbrBitsCategoryID = bitBuffer.nextBits(4);
            int nbrOfCategories = bitBuffer.nextBits(nbrBitsCategories);
            
            if(LOG.isTrace()) {
                LOG.trace("TileMap.loadPOICategories()", "nbrOfCategories= "+nbrOfCategories);
            }
            
            if(nbrOfCategories > 0) {
                int featureIndex, categoryID;
                categoryIdxByFeatureIdx = new int[nbrFeatures];
                
                for(int f=0;f<categoryIdxByFeatureIdx.length;f++){
                    categoryIdxByFeatureIdx[f] = -1;
                }
                                
                for(int i=0; i<nbrOfCategories; i++) {                      
                    featureIndex = (int)bitBuffer.nextBits(nbrBitsFeatureIdx);
                    categoryID = bitBuffer.nextBits(nbrBitsCategoryID);
                    categoryIdxByFeatureIdx[featureIndex] = categoryID;
                    
                    if(LOG.isTrace()) {
                        LOG.trace("TileMap.loadPOICategories()", "feature index "+featureIndex+" has category id "+categoryID);
                    }
                }
            }
        }
    }