def load_zonal_layer(self, zonal_layer_path): self.added_zonal_layer = zonal_layer = None zonal_layer_basename, zonal_layer_ext = os.path.splitext( os.path.basename(zonal_layer_path)) if zonal_layer_ext == '.gpkg': dlg = QgsSublayersDialog(QgsSublayersDialog.Ogr, 'Select zonal layer') conn = ogr.Open(zonal_layer_path) layer_defs = [] for idx, c in enumerate(conn): ld = QgsSublayersDialog.LayerDefinition() ld.layerId = idx ld.layerName = c.GetDescription() ld.count = c.GetFeatureCount() ld.type = ogr.GeometryTypeToName(c.GetGeomType()) layer_defs.append(ld) dlg.populateLayerTable(layer_defs) dlg.exec_() if not dlg.selection(): return None for sel in dlg.selection(): # NOTE: the last one will be chosen as zonal layer zonal_layer = QgsVectorLayer( zonal_layer_path + "|layername=" + sel.layerName, sel.layerName, 'ogr') if zonal_layer.isValid(): root = QgsProject.instance().layerTreeRoot() QgsProject.instance().addMapLayer(zonal_layer, False) root.insertLayer(0, zonal_layer) else: msg = 'Invalid layer' log_msg(msg, level='C', message_bar=self.iface.messageBar()) return None else: zonal_layer = QgsVectorLayer(zonal_layer_path, zonal_layer_basename, 'ogr') if not zonal_layer.geometryType() == QgsWkbTypes.PolygonGeometry: msg = 'Zonal layer must contain zone polygons' log_msg(msg, level='C', message_bar=self.iface.messageBar()) return None if zonal_layer_ext != '.gpkg': # Add zonal layer to registry if zonal_layer.isValid(): root = QgsProject.instance().layerTreeRoot() QgsProject.instance().addMapLayer(zonal_layer, False) root.insertLayer(0, zonal_layer) else: msg = 'Invalid zonal layer' log_msg(msg, level='C', message_bar=self.iface.messageBar()) return None self.added_zonal_layer = zonal_layer self.pre_populate_zonal_layer_cbx() return zonal_layer
def loadSubLayers(self, rl): tableContent = [] subLayers = [] subLayerNum = 0 layerName = rl.name() # simplify raster sublayer name for subLayer in rl.subLayers(): subLayer = re.sub("^.*where=", "", subLayer) subLayer.replace("'", "") subLayer.replace('"', "") tableContent.append(str(subLayerNum) + "|" + subLayer) subLayers.append(subLayer) subLayerNum = subLayerNum + 1 # Use QgsSublayersDialog to select sublayers to load chooseSublayersDialog = QgsSublayersDialog(QgsSublayersDialog.Gdal, "gdal") chooseSublayersDialog.populateLayerTable(tableContent, "|") chooseSublayersDialog.resize(500, chooseSublayersDialog.height()) if chooseSublayersDialog.exec_(): baseSourceStr = rl.source() # Enclose where statement in appropriate quotes for i in chooseSublayersDialog.selectionIndexes(): subLayer = subLayers[i] subLayer = re.sub("= ", "= \\'", subLayer) subLayer = re.sub("'$", "\\''", subLayer) gdalStr = baseSourceStr + " where=" + subLayer rl = QgsRasterLayer(gdalStr, layerName + '_' + subLayers[i]) QgsMapLayerRegistry.instance().addMapLayer(rl)
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
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