Skip to content

Commit

Permalink
[processing][feature] Enhance gdal:ogrinfo - Add gdal:ogrinfojson
Browse files Browse the repository at this point in the history
  • Loading branch information
agiudiceandrea authored and nyalldawson committed Jul 10, 2024
1 parent 18edfc1 commit 3d8a7a7
Show file tree
Hide file tree
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
Expand Up @@ -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
Expand Down Expand Up @@ -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)

Expand Down
77 changes: 67 additions & 10 deletions python/plugins/processing/algs/gdal/ogrinfo.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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'
Expand All @@ -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())
Expand All @@ -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 3d8a7a7

Please sign in to comment.