Skip to content

Commit f59e3a3

Browse files
committed
[processing] homogenize and improve Points along lines
1 parent 98dfda3 commit f59e3a3

File tree

1 file changed

+40
-51
lines changed

1 file changed

+40
-51
lines changed

python/plugins/processing/algs/gdal/PointsAlongLines.py

Lines changed: 40 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
QgsProcessingParameterNumber,
3131
QgsProcessingParameterVectorDestination,
3232
QgsProcessingOutputVectorLayer,
33+
QgsProcessingParameterDefinition,
3334
QgsProcessing)
3435

3536
from processing.algs.gdal.GdalAlgorithm import GdalAlgorithm
@@ -40,87 +41,75 @@
4041

4142
class PointsAlongLines(GdalAlgorithm):
4243

43-
OUTPUT = 'OUTPUT'
4444
INPUT = 'INPUT'
45-
DISTANCE = 'DISTANCE'
4645
GEOMETRY = 'GEOMETRY'
46+
DISTANCE = 'DISTANCE'
4747
OPTIONS = 'OPTIONS'
48+
OUTPUT = 'OUTPUT'
4849

4950
def __init__(self):
5051
super().__init__()
5152

5253
def initAlgorithm(self, config=None):
5354
self.addParameter(QgsProcessingParameterFeatureSource(self.INPUT,
54-
self.tr('Input layer'), [QgsProcessing.TypeVectorLine], optional=False))
55+
self.tr('Input layer'),
56+
[QgsProcessing.TypeVectorLine]))
5557
self.addParameter(QgsProcessingParameterString(self.GEOMETRY,
56-
self.tr('Geometry column name ("geometry" for Shapefiles, may be different for other formats)'),
57-
defaultValue='geometry', optional=False))
58+
self.tr('Geometry column name'),
59+
defaultValue='geometry'))
5860
self.addParameter(QgsProcessingParameterNumber(self.DISTANCE,
59-
self.tr('Distance from line start represented as fraction of line length'), type=QgsProcessingParameterNumber.Double, minValue=0, maxValue=1, defaultValue=0.5))
60-
self.addParameter(QgsProcessingParameterString(self.OPTIONS,
61-
self.tr('Additional creation options (see ogr2ogr manual)'),
62-
defaultValue='', optional=True))
63-
64-
self.addParameter(QgsProcessingParameterVectorDestination(self.OUTPUT, self.tr('Points along lines'), QgsProcessing.TypeVectorPoint))
61+
self.tr('Distance from line start represented as fraction of line length'),
62+
type=QgsProcessingParameterNumber.Double,
63+
minValue=0,
64+
maxValue=1,
65+
defaultValue=0.5))
66+
67+
options_param = QgsProcessingParameterString(self.OPTIONS,
68+
self.tr('Additional creation options'),
69+
defaultValue='',
70+
optional=True)
71+
options_param.setFlags(options_param.flags() | QgsProcessingParameterDefinition.FlagAdvanced)
72+
self.addParameter(options_param)
73+
74+
self.addParameter(QgsProcessingParameterVectorDestination(self.OUTPUT,
75+
self.tr('Points along lines'),
76+
QgsProcessing.TypeVectorPoint))
6577

6678
def name(self):
6779
return 'pointsalonglines'
6880

6981
def displayName(self):
70-
return self.tr('Create points along lines')
82+
return self.tr('Points along lines')
7183

7284
def group(self):
7385
return self.tr('Vector geoprocessing')
7486

75-
def getConsoleCommands(self, parameters, context, feedback):
76-
fields = self.parameterAsSource(parameters, self.INPUT, context).fields()
77-
ogrLayer, layername = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback)
87+
def commandName(self):
88+
return 'ogr2ogr'
7889

79-
distance = str(self.parameterAsDouble(parameters, self.DISTANCE, context))
90+
def getConsoleCommands(self, parameters, context, feedback):
91+
ogrLayer, layerName = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback)
92+
distance = self.parameterAsDouble(parameters, self.DISTANCE, context)
8093
geometry = self.parameterAsString(parameters, self.GEOMETRY, context)
81-
8294
outFile = self.parameterAsOutputLayer(parameters, self.OUTPUT, context)
83-
84-
output, format = GdalUtils.ogrConnectionStringAndFormat(outFile, context)
8595
options = self.parameterAsString(parameters, self.OPTIONS, context)
8696

87-
other_fields = []
88-
for f in fields:
89-
if f.name() == geometry:
90-
continue
91-
92-
other_fields.append(f.name())
97+
output, outputFormat = GdalUtils.ogrConnectionStringAndFormat(outFile, context)
9398

9499
arguments = []
95-
if format:
96-
arguments.append('-f {}'.format(format))
97100
arguments.append(output)
98101
arguments.append(ogrLayer)
102+
arguments.append('-dialect')
103+
arguments.append('sqlite')
104+
arguments.append('-sql')
99105

100-
arguments.append('-dialect sqlite -sql "SELECT ST_Line_Interpolate_Point(')
101-
arguments.append(geometry)
102-
arguments.append(',')
103-
arguments.append(distance)
104-
arguments.append(')')
105-
arguments.append('AS')
106-
arguments.append(geometry)
107-
arguments.append(',')
108-
arguments.append(','.join(other_fields))
109-
arguments.append('FROM')
110-
arguments.append(layername)
111-
arguments.append('"')
112-
113-
if options is not None and len(options.strip()) > 0:
114-
arguments.append(options)
106+
sql = "SELECT ST_Line_Interpolate_Point({}, {}), * FROM '{}'".format(geometry, distance, layerName)
107+
arguments.append(sql)
115108

116-
commands = []
117-
if isWindows():
118-
commands = ['cmd.exe', '/C ', 'ogr2ogr.exe',
119-
GdalUtils.escapeAndJoin(arguments)]
120-
else:
121-
commands = ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)]
109+
if options:
110+
arguments.append(options)
122111

123-
return commands
112+
if outputFormat:
113+
arguments.append('-f {}'.format(outputFormat))
124114

125-
def commandName(self):
126-
return 'ogr2ogr'
115+
return ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)]

0 commit comments

Comments
 (0)