def readKeywordsFromFile(theLayerPath, theKeyword=None): """Get metadata from the keywords file associated with a local file in the file system. .. note:: Requires a str representing a file path instance as parameter As opposed to readKeywordsFromLayer which takes a inasafe file object as parameter. .. seealso:: readKeywordsFromLayer Args: * theLayerPath - a string representing a path to a layer (e.g. '/tmp/foo.shp', '/tmp/foo.tif') * theKeyword - optional - the metadata keyword to retrieve e.g. 'title' Returns: A string containing the retrieved value for the keyword if the keyword argument is specified, otherwise the complete keywords dictionary is returned. Raises: KeywordNotFoundException if the keyword is not recognised. """ # check the source layer path is valid if not os.path.isfile(theLayerPath): myMessage = tr('Cannot get keywords from a non-existant file.' '%s does not exist.' % theLayerPath) raise InvalidParameterException(myMessage) # check there really is a keywords file for this layer myKeywordFilePath = os.path.splitext(theLayerPath)[0] myKeywordFilePath += '.keywords' if not os.path.isfile(myKeywordFilePath): myMessage = tr('No keywords file found for %s' % theLayerPath) raise InvalidParameterException(myMessage) #now get the requested keyword using the inasafe library myDictionary = None try: myDictionary = read_keywords(myKeywordFilePath) except Exception, e: myMessage = tr('Keyword retrieval failed for %s (%s) \n %s' % ( myKeywordFilePath, theKeyword, str(e))) raise KeywordNotFoundException(myMessage)
def loadLayer(theLayerFile, DIR=TESTDATA): """Helper to load and return a single QGIS layer Input theLayerFile: Pathname to raster or vector file DIR: Optional parameter stating the parent dir. If None, pathname is assumed to be absolute """ # Extract basename and absolute path myFileName = os.path.split(theLayerFile)[-1] # In case path was absolute myBaseName, myExt = os.path.splitext(myFileName) if DIR is None: myPath = theLayerFile else: myPath = os.path.join(DIR, theLayerFile) myKeywordPath = myPath[:-4] + '.keywords' # Determine if layer is hazard or exposure myKeywords = read_keywords(myKeywordPath) myType = 'undefined' if 'category' in myKeywords: myType = myKeywords['category'] msg = 'Could not read %s' % myKeywordPath assert myKeywords is not None, msg # Create QGis Layer Instance if myExt in ['.asc', '.tif']: myLayer = QgsRasterLayer(myPath, myBaseName) elif myExt in ['.shp']: myLayer = QgsVectorLayer(myPath, myBaseName, 'ogr') else: myMessage = 'File %s had illegal extension' % myPath raise Exception(myMessage) myMessage = 'Layer "%s" is not valid' % str(myLayer.source()) assert myLayer.isValid(), myMessage return myLayer, myType