Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[processing][feature] Enhance gdal:ogrinfo - Add gdal:ogrinfojson
Browse files Browse the repository at this point in the history
agiudiceandrea authored Jul 3, 2024
1 parent e3c085a commit 0eda6f2
Showing 2 changed files with 71 additions and 11 deletions.
5 changes: 4 additions & 1 deletion python/plugins/processing/algs/gdal/GdalAlgorithmProvider.py
Original file line number Diff line number Diff line change
@@ -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)

77 changes: 67 additions & 10 deletions python/plugins/processing/algs/gdal/ogrinfo.py
Original file line number Diff line number Diff line change
@@ -22,15 +22,19 @@
from qgis.core import (QgsProcessingException,
QgsProcessingParameterVectorLayer,
QgsProcessingParameterBoolean,
QgsProcessingParameterDefinition,
QgsProcessingParameterString,
QgsProcessingParameterFileDestination)
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
from processing.algs.gdal.GdalUtils import GdalUtils


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 all 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('</pre>')

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}

0 comments on commit 0eda6f2

Please sign in to comment.