Changeset 31


Ignore:
Timestamp:
19/10/05 14:03:26 (14 years ago)
Author:
domlowe
Message:

Fixed recursive files/directory handling
gml:name, metadataproperty and description derived from name of directory and ndg namespace

fixed mappingrule & scanorder-

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CSML/trunk/Coapec/Coapec2csml.py

    r30 r31  
    2222 
    2323    -d directory: All netcdf files in the directory are marked up in a single CSML file 
    24                  
     24                         
    2525                 
    2626    -c csmlfeaturetype: The csmlFeatureType of the data. Only GridSeriesProfile is  
     
    8383 
    8484 
    85 def createCSML(): 
    86 #Open first file (this assumes all files are the same structure!  
     85def createCSMLGridSeriesFeature(): 
     86         
     87#this creates a csml document containing a collection of grid series features 
     88#this may be broken down somewhat so the code is a bit more reuseable for 
     89#other feature types (not yet implemented) 
     90 
     91 
     92#Some metadata strings we need to get from somewhere... 
     93#For now use last directory names as identifier (see dataentity) 
     94        strMetaDataProperty = 'xlink:href="http://ndg.nerc.ac.uk/Metadata/' + dataentity + '"' 
     95        strCodespace = 'http://ndg/nerc/ac/uk/NDGData' 
     96        strGmlDescription = 'Dataset for directory ' + dataentity 
     97        strGmlName = dataentity 
     98 
     99         
     100         
     101#Open first file (note this assumes all files are the same structure! which is probably the case..)  
    87102#TO DO add structure checking                    
    88         ncfile = NetCDFFile ( args[1], 'r' )                     
     103        ncfile = NetCDFFile ( args[0], 'r' )                     
    89104        #Number of CSML features corresponds to number of variables 
    90105        numFeatures=len(ncfile.variables.keys()) 
     
    109124        #gml:MetaDataProperty element 
    110125        gml_MetaDataProperty_element = csmldoc.createElement("gml:MetaDataProperty") 
    111         gml_MetaDataProperty_element.appendChild(csmldoc.createTextNode('some metadata here')) 
     126        gml_MetaDataProperty_element.appendChild(csmldoc.createTextNode(strMetaDataProperty)) 
    112127        dataset_element.appendChild(gml_MetaDataProperty_element) 
    113128         
    114129        #gml:description 
    115130        gml_description_element = csmldoc.createElement("gml:description") 
    116         gml_description_element.appendChild(csmldoc.createTextNode('Test Dataset')) 
     131        gml_description_element.appendChild(csmldoc.createTextNode(strGmlDescription)) 
    117132        dataset_element.appendChild(gml_description_element) 
    118133         
    119134        #gml:name 
    120135        gml_name_element = csmldoc.createElement("gml:name") 
    121         gml_name_element.appendChild(csmldoc.createTextNode('Test Dataset')) 
     136        gml_name_element.setAttribute('codespace',strCodespace) 
     137        gml_name_element.appendChild(csmldoc.createTextNode(strGmlName)) 
    122138        dataset_element.appendChild(gml_name_element) 
    123139         
     
    125141        allFileNames = [] 
    126142        for i in range(0, len(args)): 
    127                 allFileNames.append(args[i]) 
    128         print str(allFileNames) 
     143                allFileNames.append(shortfilename(args[i])) 
     144 
    129145         
    130146        #NetCDF extracts == domains. 
     
    141157                fileName_element=csmldoc.createElement("fileName") 
    142158                NetCDFExtract_element.appendChild(fileName_element) 
    143                 fileName_element.appendChild(csmldoc.createTextNode(args[1])) 
     159                fileName_element.appendChild(csmldoc.createTextNode(shortfilename(args[0]))) 
    144160                 
    145161                variableName_element=csmldoc.createElement("variableName") 
     
    170186                #need to get the attribute called? 
    171187                desc =getattr(var,'long_name') 
    172                 gml_description_element.appendChild(csmldoc.createTextNode(str(desc)+' count: ' +str(i)))        
     188                gml_description_element.appendChild(csmldoc.createTextNode(str(desc)))   
    173189                GridSeriesFeature_element.appendChild(gml_description_element) 
    174190                gml_featureMember_element.appendChild(GridSeriesFeature_element) 
     
    179195                GridSeriesDomain_element=csmldoc.createElement("GridSeriesDomain") 
    180196                 
     197                #*********************************************************************** 
     198                # gml:coverageFunction element (and sub-element MappingRule)             
     199                #*********************************************************************** 
    181200                gml_coverageFunction_element=csmldoc.createElement("gml:coverageFunction") 
    182                  
    183                 #This is the gml_rangeSet: 
     201                MappingRule_element=csmldoc.createElement("MappingRule") 
     202                MappingRule_element.setAttribute('scanOrder',getMappingRule(len(dimNames))) 
     203                gml_coverageFunction_element.appendChild(MappingRule_element) 
     204                 
     205                #*********************************************************************** 
     206                # gml:rangeSet element (and sub-elements)                
     207                #*********************************************************************** 
    184208                gml_rangeSet_element=csmldoc.createElement("gml:rangeSet")       
    185209                AggregatedArray_element=csmldoc.createElement("AggregatedArray") 
     
    188212                arraySize_element.appendChild(csmldoc.createTextNode(str(arrSz))) 
    189213                uom_element=csmldoc.createElement("uom") 
    190                 strUom = getattr(var, 'units') 
    191                  
     214                print getattr(var,'long_name') 
     215                try: 
     216                        strUom = getattr(var, 'units') 
     217                except AttributeError: 
     218                        #if units attribute doesn't exist: 
     219                        strUom ="dimensionless" 
    192220                 
    193221                uom_element.appendChild(csmldoc.createTextNode(strUom)) 
     
    273301                        gridAxesSpanned_element.appendChild(csmldoc.createTextNode("dim" + str(i))) 
    274302                        sequenceRule_element=csmldoc.createElement("sequenceRule") 
     303                        sequenceRule_element.appendChild(csmldoc.createTextNode(getSeqRule(len(dimNames)))) 
    275304                        definesAxis_element=csmldoc.createElement("definesAxis") 
    276305                        dimName = dimNames[len(dimNames)-i] 
     
    288317                                 
    289318                #*********************************************************************** 
    290                  
     319                                 
    291320                GridSeriesDomain_element.appendChild(domainReference_element) 
    292321                GridSeriesDomain_element.appendChild(domainComplement_element) 
     
    313342        cleanstring = messystring[1:-1] 
    314343        cleanstring = cleanstring.replace("'",'') 
    315                                          
    316344        return cleanstring 
    317345 
     
    320348        tpl ="" 
    321349        #grab any (first) file           
    322         ncfile = NetCDFFile ( args[1], 'r' )                     
     350        ncfile = NetCDFFile ( args[0], 'r')                      
    323351        #get the reference date for the time reference system. 
    324352        var = ncfile.variables[timedimension] 
     
    329357        for i in range(0, len(args)):    
    330358                ncfile = NetCDFFile (args[i], 'r' )                      
    331                 var= ncfile.variables['t'] 
     359                var= ncfile.variables[timedimension] 
    332360                data = var.getValue() 
    333361                timevalue = udunitsTime(data[0], refTime) 
     
    336364 
    337365def udunitsTime(daysSince, referenceDate): 
     366         
     367        #TODO needs to be able to handle 'hours since' 
     368        try: 
    338369        #takes days since & reference date and returns time in 1991-09-01 00:00:00 format 
    339         refYear =int(referenceDate[0:4]) 
    340         refMonth =int( referenceDate[5:7]) 
    341         refDay = int(referenceDate[8:10]) 
    342         refTime = referenceDate [-8:] 
    343         now = datetime.date(refYear,refMonth, refDay) 
    344         difference = datetime.timedelta(days=daysSince) 
    345          
    346         newDateTime = now+difference 
     370                refYear =int(referenceDate[0:4]) 
     371                refMonth =int( referenceDate[5:7]) 
     372                refDay = int(referenceDate[8:10]) 
     373                refTime = referenceDate [-8:] 
     374                now = datetime.date(refYear,refMonth, refDay) 
     375                difference = datetime.timedelta(days=daysSince) 
     376         
     377                newDateTime = now+difference 
    347378        #add the hrs mins seconds back in. 
    348         newDateTime = str(newDateTime) + 'T' + refTime 
     379                newDateTime = str(newDateTime) + 'T' + refTime 
     380        except ValueError: 
     381                newDateTime = "unable to handle time!" 
    349382        return newDateTime 
    350383 
     
    382415         
    383416def index(directory,recurse): 
    384         # traverses directory trees, returns list of netcdf fils. 
     417        # traverses directory trees, returns list of netcdf files with full path. 
    385418        stack = [directory] 
    386419        files = [] 
     
    391424                        fullname = os.path.join(directory, file) 
    392425                        if fullname.endswith('.nc'): 
    393                                 files.append(os.path.basename(fullname)) 
     426                                #files.append(os.path.basename(fullname)) 
     427                                files.append(fullname) 
    394428                        if recursive == 1: 
    395429                                if os.path.isdir(fullname) and not os.path.islink(fullname): 
     
    397431        return files 
    398432                 
    399  
     433def shortfilename(fullname): 
     434        #returns the file name only from a full path 
     435        filename=os.path.basename(fullname) 
     436        return filename 
     437 
     438def getSeqRule(nDims): 
     439        #returns a sequenceRule  
     440        #*****************very simplified version***************** 
     441        #This really needs more work to see if the +s and -s are correct. and the x/y/z s in right order 
     442        #nDims = spatial dimensions + time dimension 
     443        if nDims == 2: 
     444                seq = "Linear" 
     445        elif nDims ==3: 
     446                seq = "+x+y" 
     447        elif nDims ==4: 
     448                seq = "+x+y+z" 
     449        else: 
     450                seq="not sure" 
     451        return seq 
     452         
     453         
     454def getMappingRule(nDims): 
     455        #again, this needs a lot of work. 
     456        if nDims == 2: 
     457                mr = "+ gridI + series" 
     458        elif nDims ==3: 
     459                mr = "+ gridI + gridJ +series" 
     460        elif nDims ==4: 
     461                mr = "+ gridI + gridJ +gridK +series" 
     462        else: 
     463                mr="not sure" 
     464        return mr 
     465         
    400466 
    401467#Main program: 
     
    405471opts, args = getopt.getopt(sys.argv[1:], "d:c:t:ro:h", ["directory=", "csmlfeaturetype=", "timedimension=", "recursive", "outputfile=", "help"]) 
    406472 
     473 
    407474# process options 
    408475directory = None 
    409 csmlfeaturetype = None 
     476csmlfeaturetype = 'GridSeriesFeature'   #default feature type 
    410477timedimension  = 't' 
    411478recursive = 0 
     
    426493                break            
    427494 
     495if directory != None: 
     496        #get the last two directories in the path and use as the gml:name dataentity id. 
     497        #On the other hand this method isn't good for deep directories. 
     498        #pathparts = directory.split("/") 
     499        #dataentity = '' 
     500        #dataentity = pathparts[len(pathparts)-3] +'/' +pathparts[len(pathparts)-2]  
     501         
     502        #instead use full path  
     503        if directory[:1] == '/': 
     504                dataentity = directory[1:] 
     505                         
     506else: 
     507        dataentity="Edit this to provide the data entity name -  eg Coapec/directoryA" 
     508         
    428509#if directory is supplied, then file args list should be contents of the directory: 
    429510if directory != None: 
    430511        for netcdffile in index(directory,recursive): 
    431512                args = index(directory, recursive) 
    432          
    433  
    434 csml = createCSML() 
     513 
     514                 
     515if csmlfeaturetype == "PointFeature": 
     516        csml=createCSMLPointFeature()            
     517elif csmlfeaturetype == "ProfileFeature": 
     518        csml=createCSMLProfileFeature() 
     519elif csmlfeaturetype == "GridFeature": 
     520        csml=createCSMLGridFeature() 
     521elif csmlfeaturetype == "PointSeriesFeature": 
     522        csml=createCSMLPointSeriesFeature()              
     523elif csmlfeaturetype == "ProfileSeriesFeature": 
     524        csml=createCSMLProfileSeriesFeature()    
     525elif csmlfeaturetype == "GridSeriesFeature": 
     526        csml = createCSMLGridSeriesFeature() 
     527 
     528 
     529#output csml to terminal 
     530#xml.dom.ext.PrettyPrint(csml) 
    435531 
    436532#output csml to file 
    437  
    438533file_object = open(outputfile, "w") 
    439534xml.dom.ext.PrettyPrint(csml, file_object) 
    440535file_object.close() 
     536 
     537currentdir = os.path.abspath 
    441538 
    442539print '' 
     
    446543print '' 
    447544 
    448 #output csml to terminal 
    449 xml.dom.ext.PrettyPrint(csml) 
    450  
    451  
    452  
     545 
     546 
     547 
Note: See TracChangeset for help on using the changeset viewer.