Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
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 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
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
# 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()