domingo, 27 de agosto de 2017

Plugin para dividir líneas por puntos o por partes iguales

En diferentes posts anteriores (1, 2, 3) se exploró la posibilidad de dividir líneas por puntos o en partes iguales. En este se va a condensar la información que permite la creación de un plugin que divide líneas por puntos o en partes iguales.

Como en el último caso se imprime la magnitud del intervalo se puede obtener un espaciamiento aproximado a alguno deseado mediante la técnica de ensayo y error.

Por otra parte, la nueva versión de plugin builder exige que la programación de los botones y objetos, en lugar de '__init__', estén ahora en el método 'add_action'; tal como se incluye a continuación en el código siguiente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
.
.
.
    def add_action(
.
.
.
        self.actions.append(action)

        okBtn = self.dlg.okButton
        okBtn.connect(okBtn, SIGNAL("clicked()"), self.split_lines)
        
        #line
        self.wcb1 = QgsMapLayerComboBox(self.dlg)
        self.wcb1.setFixedWidth(193)
        self.wcb1.move(150,17)
        self.wcb1.setFilters( QgsMapLayerProxyModel.LineLayer )
        self.wcb1.enabledChange(True)
        
        #point
        self.wcb2 = QgsMapLayerComboBox(self.dlg)
        self.wcb2.setFixedWidth(193)
        self.wcb2.move(150,55)
        self.wcb2.setFilters( QgsMapLayerProxyModel.PointLayer )
        self.wcb2.enabledChange(True)
        
        chkBox1 = self.dlg.checkBox
        chkBox1.connect(chkBox1, SIGNAL("stateChanged(int)"), self.change_status)
        
        sBox = self.dlg.spinBox
        sBox.setEnabled(False)
        sBox.setValue(2)
        sBox.setMinimum(2)
        sBox.setMaximum(1000)
        
        self.dlg.lineEdit.setEnabled(False)

        return action
.
.
.
    def change_status(self):
        if self.dlg.checkBox.isChecked():
            self.dlg.spinBox.setEnabled(True)
            self.wcb2.setEnabled(False)
            self.dlg.lineEdit.setEnabled(True)
       
        else:
            self.dlg.spinBox.setEnabled(False)
            self.wcb2.setEnabled(True)
            self.dlg.lineEdit.setEnabled(False)

    def split_lines(self):
        
        llayer = self.wcb1.currentLayer()
        provider = llayer.dataProvider()
        
        epsg = llayer.crs().postgisSrid()
        
        crs = from_epsg(epsg)

        path = provider.dataSourceUri().split('|')[0]

        line = fiona.open(path)
.
.
.

En la imagen siguiente se tiene la operación del plugin para dividir el shapefile de línea por la capa de puntos que se visualiza:


Después de hacer click en OK, la imagen siguiente presenta la capa resultante donde se ha seleccionado el segundo rasgo en su tabla de atributos:


La imagen a continuación refleja la división de la capa tipo línea en 25 partes iguales. En este caso se ha seleccionado el rasgo 3 cuya longitud es de alrededor de 130 m.


Para finalizar, en la imagen siguiente se observa el primer rasgo seleccionado luego de dividir la línea en 1000 partes iguales. La dimensión del intervalo corresponde a alrededor de 3.25 m.


No hay comentarios: