diff --git a/python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py b/python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py index b372fcb13ab5..7b1baea846e2 100644 --- a/python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py +++ b/python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py @@ -82,7 +82,7 @@ from .ExecuteSql import ExecuteSql from .OffsetCurve import OffsetCurve from .ogr2ogr import ogr2ogr -from .ogrinfo import ogrinfo +from .ogrinfo import ogrinfo, ogrinfojson from .OgrToPostGis import OgrToPostGis from .ogr2ogrtopostgislist import Ogr2OgrToPostGisList from .OneSideBuffer import OneSideBuffer @@ -205,6 +205,9 @@ def loadAlgorithms(self): if int(gdal.VersionInfo()) > 3010000: self.algs.append(viewshed()) + if int(gdal.VersionInfo()) >= 3070000: + self.algs.append(ogrinfojson()) + for a in self.algs: self.addAlgorithm(a) diff --git a/python/plugins/processing/algs/gdal/ogrinfo.py b/python/plugins/processing/algs/gdal/ogrinfo.py index e0ea1568f5be..9fcb4e650c91 100644 --- a/python/plugins/processing/algs/gdal/ogrinfo.py +++ b/python/plugins/processing/algs/gdal/ogrinfo.py @@ -22,6 +22,8 @@ from qgis.core import (QgsProcessingException, QgsProcessingParameterVectorLayer, QgsProcessingParameterBoolean, + QgsProcessingParameterDefinition, + QgsProcessingParameterString, QgsProcessingParameterFileDestination) from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm from processing.algs.gdal.GdalUtils import GdalUtils @@ -29,8 +31,10 @@ class ogrinfo(GdalAlgorithm): INPUT = 'INPUT' + ALL_LAYERS = 'ALL_LAYERS' SUMMARY_ONLY = 'SUMMARY_ONLY' NO_METADATA = 'NO_METADATA' + EXTRA = 'EXTRA' OUTPUT = 'OUTPUT' def __init__(self): @@ -39,16 +43,37 @@ def __init__(self): def initAlgorithm(self, config=None): self.addParameter(QgsProcessingParameterVectorLayer(self.INPUT, self.tr('Input layer'))) - self.addParameter(QgsProcessingParameterBoolean(self.SUMMARY_ONLY, - self.tr('Summary output only'), - defaultValue=True)) + self.addParameter(QgsProcessingParameterBoolean(self.ALL_LAYERS, + self.tr('Enable listing of all layers in the dataset'), + defaultValue=False)) + if self.name() == 'ogrinfo': + self.addParameter(QgsProcessingParameterBoolean(self.SUMMARY_ONLY, + self.tr('Summary output only'), + defaultValue=True)) + else: + self.addParameter(QgsProcessingParameterBoolean(self.FEATURES, + self.tr('Enable listing of features'), + defaultValue=False)) + self.addParameter(QgsProcessingParameterBoolean(self.NO_METADATA, self.tr('Suppress metadata info'), defaultValue=False)) - self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT, - self.tr('Layer information'), - self.tr('HTML files (*.html)'))) + extra_param = QgsProcessingParameterString(self.EXTRA, + self.tr('Additional command-line parameters'), + defaultValue=None, + optional=True) + extra_param.setFlags(extra_param.flags() | QgsProcessingParameterDefinition.Flag.FlagAdvanced) + self.addParameter(extra_param) + + if self.name() == 'ogrinfo': + self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT, + self.tr('Layer information'), + self.tr('HTML files (*.html)'))) + else: + self.addParameter(QgsProcessingParameterFileDestination(self.OUTPUT, + self.tr('Layer information'), + self.tr('JSON files (*.json)'))) def name(self): return 'ogrinfo' @@ -66,20 +91,33 @@ def commandName(self): return 'ogrinfo' def getConsoleCommands(self, parameters, context, feedback, executing=True): - arguments = ['-al'] + if self.name() == 'ogrinfo': + arguments = ['-al'] + else: + arguments = ['-json'] + + if self.name() == 'ogrinfo': + if self.parameterAsBoolean(parameters, self.SUMMARY_ONLY, context): + arguments.append('-so') + else: + if self.parameterAsBoolean(parameters, self.FEATURES, context): + arguments.append('-features') - if self.parameterAsBoolean(parameters, self.SUMMARY_ONLY, context): - arguments.append('-so') if self.parameterAsBoolean(parameters, self.NO_METADATA, context): arguments.append('-nomd') + if self.EXTRA in parameters and parameters[self.EXTRA] not in (None, ''): + extra = self.parameterAsString(parameters, self.EXTRA, context) + arguments.append(extra) + inLayer = self.parameterAsVectorLayer(parameters, self.INPUT, context) if inLayer is None: raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT)) input_details = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback, executing) arguments.append(input_details.connection_string) - arguments.append(input_details.layer_name) + if not self.parameterAsBoolean(parameters, self.ALL_LAYERS, context): + arguments.append(input_details.layer_name) if input_details.open_options: arguments.extend(input_details.open_options_as_arguments()) @@ -99,3 +137,22 @@ def processAlgorithm(self, parameters, context, feedback): f.write('') return {self.OUTPUT: output} + + +class ogrinfojson(ogrinfo): + FEATURES = 'FEATURES' + + def name(self): + return 'ogrinfojson' + + def displayName(self): + return self.tr('Vector information (JSON)') + + def processAlgorithm(self, parameters, context, feedback): + console_output = GdalUtils.runGdal(self.getConsoleCommands(parameters, context, feedback)) + output = self.parameterAsFileOutput(parameters, self.OUTPUT, context) + with open(output, 'w', newline='') as f: + for s in console_output[1:]: + f.write(str(s)) + + return {self.OUTPUT: output}