def getRasterSublayer(path, param): layer = QgsRasterLayer(path) try: # If the layer is a raster layer and has multiple sublayers, let the user chose one. # Based on QgisApp::askUserForGDALSublayers if layer and param.showSublayersDialog and layer.dataProvider().name( ) == "gdal" and len(layer.subLayers()) > 1: layers = [] subLayerNum = 0 # simplify raster sublayer name for subLayer in layer.subLayers(): # if netcdf/hdf use all text after filename if bool(re.match('netcdf', subLayer, re.I)) or bool( re.match('hdf', subLayer, re.I)): subLayer = subLayer.split(path)[1] subLayer = subLayer[1:] else: # remove driver name and file name subLayer.replace(subLayer.split(":")[0], "") subLayer.replace(path, "") # remove any : or " left over if subLayer.startswith(":"): subLayer = subLayer[1:] if subLayer.startswith("\""): subLayer = subLayer[1:] if subLayer.endswith(":"): subLayer = subLayer[:-1] if subLayer.endswith("\""): subLayer = subLayer[:-1] ld = QgsSublayersDialog.LayerDefinition() ld.layerId = subLayerNum ld.layerName = subLayer layers.append(ld) subLayerNum = subLayerNum + 1 # Use QgsSublayersDialog # Would be good if QgsSublayersDialog had an option to allow only one sublayer to be selected chooseSublayersDialog = QgsSublayersDialog(QgsSublayersDialog.Gdal, "gdal") chooseSublayersDialog.populateLayerTable(layers) if chooseSublayersDialog.exec_(): return layer.subLayers()[ chooseSublayersDialog.selectionIndexes()[0]] else: # If user pressed cancel then just return the input path return path else: # If the sublayers selection dialog is not to be shown then just return the input path return path except: # If the layer is not a raster layer, then just return the input path return path
def getRasterSublayer(path, param): layer = QgsRasterLayer(path) try: # If the layer is a raster layer and has multiple sublayers, let the user chose one. # Based on QgisApp::askUserForGDALSublayers if layer and param.showSublayersDialog and layer.dataProvider().name() == "gdal" and len(layer.subLayers()) > 1: layers = [] subLayerNum = 0 # simplify raster sublayer name for subLayer in layer.subLayers(): # if netcdf/hdf use all text after filename if bool(re.match('netcdf', subLayer, re.I)) or bool(re.match('hdf', subLayer, re.I)): subLayer = subLayer.split(path)[1] subLayer = subLayer[1:] else: # remove driver name and file name subLayer.replace(subLayer.split(QgsDataProvider.SUBLAYER_SEPARATOR)[0], "") subLayer.replace(path, "") # remove any : or " left over if subLayer.startswith(":"): subLayer = subLayer[1:] if subLayer.startswith("\""): subLayer = subLayer[1:] if subLayer.endswith(":"): subLayer = subLayer[:-1] if subLayer.endswith("\""): subLayer = subLayer[:-1] ld = QgsSublayersDialog.LayerDefinition() ld.layerId = subLayerNum ld.layerName = subLayer layers.append(ld) subLayerNum = subLayerNum + 1 # Use QgsSublayersDialog # Would be good if QgsSublayersDialog had an option to allow only one sublayer to be selected chooseSublayersDialog = QgsSublayersDialog(QgsSublayersDialog.Gdal, "gdal") chooseSublayersDialog.populateLayerTable(layers) if chooseSublayersDialog.exec_(): return layer.subLayers()[chooseSublayersDialog.selectionIndexes()[0]] else: # If user pressed cancel then just return the input path return path else: # If the sublayers selection dialog is not to be shown then just return the input path return path except: # If the layer is not a raster layer, then just return the input path return path
# coding: utf-8 from qgis.core import (QgsLayerTreeLayer, QgsMapLayerRegistry, QgsProject, QgsVectorLayer) from qgis.gui import QgsSublayersDialog sublayers_dialog = QgsSublayersDialog( QgsSublayersDialog.Ogr, 'Title') # Try with QgsSublayersDialog.Gdal or QgsSublayersDialog.Vsifile root = QgsProject.instance().layerTreeRoot() layers = [] for child in root.children(): if isinstance(child, QgsLayerTreeLayer): layer = QgsMapLayerRegistry.instance().mapLayer(child.layerId()) if isinstance(layer, QgsVectorLayer): print("- layer: " + child.layerName() + " ID: " + child.layerId()) layers.append('%s|%s|%s|%s' % (layer.id(), layer.name(), layer.featureCount(), layer.geometryType())) sublayers_dialog.populateLayerTable(layers, delim="|") sublayers_dialog.show() # Then type after some line selection, below code sublayers_dialog.selectionNames() # Seems buggy here because when 2nd always return 0 > Confirm if bug sublayers_dialog.selectionIndexes()
# coding: utf-8 from qgis.core import (QgsLayerTreeLayer, QgsMapLayerRegistry, QgsProject, QgsVectorLayer) from qgis.gui import QgsSublayersDialog sublayers_dialog = QgsSublayersDialog(QgsSublayersDialog.Ogr, 'Title') # Try with QgsSublayersDialog.Gdal or QgsSublayersDialog.Vsifile root = QgsProject.instance().layerTreeRoot() layers = [] for child in root.children(): if isinstance(child, QgsLayerTreeLayer): layer = QgsMapLayerRegistry.instance().mapLayer(child.layerId()) if isinstance(layer, QgsVectorLayer): print("- layer: " + child.layerName() + " ID: " + child.layerId()) layers.append( '%s|%s|%s|%s' % (layer.id(), layer.name(), layer.featureCount(), layer.geometryType()) ) sublayers_dialog.populateLayerTable(layers, delim="|") sublayers_dialog.show() # Then type after some line selection, below code sublayers_dialog.selectionNames() # Seems buggy here because when 2nd always return 0 > Confirm if bug sublayers_dialog.selectionIndexes()