ogr2ogronesidebuffer.py

Joseph Liam, 2016-07-26 04:22 AM

Download (7.08 KB)

 
1
# -*- coding: utf-8 -*-
2

    
3
"""
4
***************************************************************************
5
    ogr2ogronesidebuffer.py
6
    ---------------------
7
    Date                 : Janaury 2015
8
    Copyright            : (C) 2015 by Giovanni Manghi
9
    Email                : giovanni dot manghi at naturalgis dot pt
10
***************************************************************************
11
*                                                                         *
12
*   This program is free software; you can redistribute it and/or modify  *
13
*   it under the terms of the GNU General Public License as published by  *
14
*   the Free Software Foundation; either version 2 of the License, or     *
15
*   (at your option) any later version.                                   *
16
*                                                                         *
17
***************************************************************************
18
"""
19

    
20
__author__ = 'Giovanni Manghi'
21
__date__ = 'January 2015'
22
__copyright__ = '(C) 2015, Giovanni Manghi'
23

    
24
# This will get replaced with a git SHA1 when you do a git archive
25

    
26
__revision__ = '$Format:%H$'
27

    
28
from processing.core.parameters import ParameterVector
29
from processing.core.parameters import ParameterString
30
from processing.core.parameters import ParameterNumber
31
from processing.core.parameters import ParameterBoolean
32
from processing.core.parameters import ParameterTableField
33
from processing.core.parameters import ParameterSelection
34
from processing.core.outputs import OutputVector
35

    
36
from processing.tools.system import isWindows
37

    
38
from processing.algs.gdal.OgrAlgorithm import OgrAlgorithm
39
from processing.algs.gdal.GdalUtils import GdalUtils
40

    
41

    
42
class Ogr2OgrOneSideBuffer(OgrAlgorithm):
43

    
44
    OUTPUT_LAYER = 'OUTPUT_LAYER'
45
    INPUT_LAYER = 'INPUT_LAYER'
46
    OPERATION = 'OPERATION'
47
    OPERATIONLIST = ['Single Side Buffer', 'Offset Curve']
48
    GEOMETRY = 'GEOMETRY'
49
    RADIUS = 'RADIUS'
50
    LEFTRIGHT = 'LEFTRIGHT'
51
    LEFTRIGHTLIST = ['Right', 'Left']
52
    DISSOLVEALL = 'DISSOLVEALL'
53
    FIELD = 'FIELD'
54
    MULTI = 'MULTI'
55
    OPTIONS = 'OPTIONS'
56

    
57
    def defineCharacteristics(self):
58
        self.name, self.i18n_name = self.trAlgorithm('Single sided buffers (and offset lines) for lines')
59
        self.group, self.i18n_group = self.trAlgorithm('[OGR] Geoprocessing')
60

    
61
        self.addParameter(ParameterVector(self.INPUT_LAYER,
62
                                          self.tr('Input layer'), [ParameterVector.VECTOR_TYPE_LINE], False))
63
        self.addParameter(ParameterSelection(self.OPERATION,
64
                                             self.tr('Operation'), self.OPERATIONLIST, 0))
65
        self.addParameter(ParameterString(self.GEOMETRY,
66
                                          self.tr('Geometry column name ("geometry" for Shapefiles, may be different for other formats)'),
67
                                          'geometry', optional=False))
68
        self.addParameter(ParameterString(self.RADIUS,
69
                                          self.tr('Buffer distance'), '1000', optional=False))
70
        self.addParameter(ParameterSelection(self.LEFTRIGHT,
71
                                             self.tr('Buffer side'), self.LEFTRIGHTLIST, 0))
72
        self.addParameter(ParameterBoolean(self.DISSOLVEALL,
73
                                           self.tr('Dissolve all results'), False))
74
        self.addParameter(ParameterTableField(self.FIELD,
75
                                              self.tr('Dissolve by attribute'), self.INPUT_LAYER, optional=True))
76
        self.addParameter(ParameterBoolean(self.MULTI,
77
                                           self.tr('Output as singlepart geometries (only used when dissolving by attribute)'), False))
78
        self.addParameter(ParameterString(self.OPTIONS,
79
                                          self.tr('Additional creation options (see ogr2ogr manual)'),
80
                                          '', optional=True))
81

    
82
        self.addOutput(OutputVector(self.OUTPUT_LAYER, self.tr('Single sided buffer')))
83

    
84
    def getConsoleCommands(self):
85
        inLayer = self.getParameterValue(self.INPUT_LAYER)
86
        ogrLayer = self.ogrConnectionString(inLayer)[1:-1]
87
        layername = "'" + self.ogrLayerName(inLayer) + "'"
88
        operation = self.OPERATIONLIST[self.getParameterValue(self.OPERATION)]
89
        geometry = unicode(self.getParameterValue(self.GEOMETRY))
90
        distance = unicode(self.getParameterValue(self.RADIUS))
91
        leftright = self.LEFTRIGHTLIST[self.getParameterValue(self.LEFTRIGHT)]
92
        dissolveall = self.getParameterValue(self.DISSOLVEALL)
93
        field = unicode(self.getParameterValue(self.FIELD))
94
        multi = self.getParameterValue(self.MULTI)
95

    
96
        output = self.getOutputFromName(self.OUTPUT_LAYER)
97
        outFile = output.value
98

    
99
        output = self.ogrConnectionString(outFile)
100
        options = unicode(self.getParameterValue(self.OPTIONS))
101

    
102
        arguments = []
103
        arguments.append(output)
104
        arguments.append(ogrLayer)
105
        arguments.append(self.ogrLayerName(inLayer))
106
        if dissolveall or field != 'None':
107
            if operation == 'Single Side Buffer':
108
                arguments.append('-dialect sqlite -sql "SELECT ST_Union(ST_SingleSidedBuffer(')
109
            else:
110
                arguments.append('-dialect sqlite -sql "SELECT ST_Union(ST_OffsetCurve(')
111
        else:
112
            if operation == 'Single Side Buffer':
113
                arguments.append('-dialect sqlite -sql "SELECT ST_SingleSidedBuffer(')
114
            else:
115
                arguments.append('-dialect sqlite -sql "SELECT ST_OffsetCurve(')
116
        arguments.append(geometry)
117
        arguments.append(',')
118
        arguments.append(distance)
119
        if dissolveall or field != 'None':
120
            if leftright == 'Left':
121
                if operation == 'Single Side Buffer':
122
                    arguments.append(',0)),*')
123
                else:
124
                    arguments.append(')),*')
125
            else:
126
                if operation == 'Single Side Buffer':
127
                    arguments.append(',1)),*')
128
                else:
129
                    arguments.append(')),*')
130
        else:
131
            if leftright == 'Left':
132
                if operation == 'Single Side Buffer':
133
                    arguments.append(',0),*')
134
                else:
135
                    arguments.append('),*')
136
            else:
137
                if operation == 'Single Side Buffer':
138
                    arguments.append(',1),*')
139
                else:
140
                    arguments.append('),*')
141
        arguments.append('FROM')
142
        arguments.append(layername)
143
        if field != 'None':
144
            arguments.append('GROUP')
145
            arguments.append('BY')
146
            arguments.append(field)
147
        arguments.append('"')
148
        if field != 'None' and multi:
149
            arguments.append('-explodecollections')
150

    
151
        if len(options) > 0:
152
            arguments.append(options)
153

    
154
        commands = []
155
        if isWindows():
156
            commands = ['cmd.exe', '/C ', 'ogr2ogr.exe',
157
                        GdalUtils.escapeAndJoin(arguments)]
158
        else:
159
            commands = ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)]
160

    
161
        return commands
162

    
163
    def commandName(self):
164
        return "ogr2ogr"