예제 #1
0
    def calcularArea(
        self, clasesMuestras
    ):  #Calcula el area de la superficie del mapa de covertura del suelo (Raster o Vector)
        error = True
        self.reultados.append("Inicia proceso de cálculo de áreas")
        idLayerQg = self.itemSuperficie.currentData()
        if (idLayerQg == 1):
            if str(os.path.splitext(
                    self.rutaCSVSuperficie)[1]) == ".tif" or str(
                        os.path.splitext(self.rutaCSVSuperficie)[1]) == ".TIF":
                layerArea = QgsRasterLayer(self.rutaCSVSuperficie,
                                           "aleatorios", "gdal")
            else:
                layerArea = QgsVectorLayer(self.rutaCSVSuperficie,
                                           "aleatorios", "ogr")
        else:
            layerArea = QgsProject.instance().mapLayer(str(idLayerQg))
        if str(layerArea.type()) == "QgsMapLayerType.VectorLayer":
            features = layerArea.getFeatures()
            clases = self.columClase.currentText()
            features = layerArea.getFeatures()
            field = [f[clases] for f in features]
            Clasesunicas = np.unique(np.array(field))
            matrizAreaClass = np.empty((len(Clasesunicas), 2)).astype(str)
            if (len(clasesMuestras) == len(Clasesunicas)):
                #print(sorted(np.array(clasesMuestras).astype(str)))
                #print(sorted(np.array(Clasesunicas).astype(str)))
                classMapa = sorted(np.array(Clasesunicas).astype(str))
                classMuestras = sorted(np.array(clasesMuestras).astype(str))
                x = np.array_equal(classMuestras, classMapa)
                if (x):
                    i = 0
                    self.reultados.append("Áreas por clase:")
                    for clase in Clasesunicas:
                        expr = QgsExpression("\"{}\"='{}'".format(
                            clases, clase))
                        clasesArea = layerArea.getFeatures(
                            QgsFeatureRequest(expr))
                        suma = 0
                        for areas in clasesArea:
                            ha = areas.geometry().area() / 10000
                            suma = suma + ha

                        matrizAreaClass[i][0] = str(clase)
                        matrizAreaClass[i][1] = str(round(float(str(suma)), 0))
                        self.reultados.append(
                            str(matrizAreaClass[i][0]) + ": \t" +
                            str(matrizAreaClass[i][1]))
                        i += 1
                else:
                    QMessageBox.information(
                        self, "Error",
                        "Hay clases que no coinciden en vector de muestras y mapa temático",
                        QMessageBox.Ok)
                    error = False
                    matrizAreaClass = 0
            else:
                QMessageBox.information(
                    self, "Error",
                    "Las clases del vector de muestras no tiene la misma cantidad de clases que el mapa temático",
                    QMessageBox.Ok)
                error = False
                matrizAreaClass = 0

        else:
            pathRaster = layerArea.dataProvider().dataSourceUri()
            data = gdal.Open(pathRaster, gdal.GA_ReadOnly)
            getProjec = data.GetProjection()
            encontrarMetros = getProjec.find("metre")

            if encontrarMetros != -1:
                clasesNew = []
                geotr = data.GetGeoTransform()
                pixel_area = abs(geotr[1] * geotr[5])
                band = data.GetRasterBand(1).ReadAsArray().astype(int)
                unicos = np.unique(band)
                clasesMuestras = clasesMuestras.astype(str)
                unicos = unicos.astype(str)
                for clase in clasesMuestras:
                    if clase in unicos:
                        clasesNew.append(clase)
                if (len(clasesMuestras) == len(clasesNew)):
                    classMapa = sorted(np.array(clasesNew).astype(str))
                    classMuestras = sorted(
                        np.array(clasesMuestras).astype(str))
                    if (np.array_equal(classMuestras, classMapa)):
                        i = 0
                        self.reultados.append("Áreas por clase:")
                        matrizAreaClass = np.empty(
                            (len(classMapa), 2)).astype(str)
                        for clase in clasesNew:
                            condition = np.bitwise_not(band != int(clase))
                            totalClase = np.extract(condition, band)
                            total = len(totalClase)
                            matrizAreaClass[i][0] = str(clase)
                            matrizAreaClass[i][1] = str(
                                round(float(str((total * pixel_area) / 10000)),
                                      0))
                            self.reultados.append(
                                str(matrizAreaClass[i][0]) + ": \t" +
                                str(matrizAreaClass[i][1]))
                            i += 1
                    else:
                        QMessageBox.information(
                            self, "Error",
                            "Hay clases que no coinciden en vector de muestras y mapa temático",
                            QMessageBox.Ok)
                        error = False
                        matrizAreaClass = 0
                else:
                    QMessageBox.information(
                        self, "Error",
                        "Las clases del vector de muestras no tiene la misma cantidad de clases que el mapa temático",
                        QMessageBox.Ok)
                    error = False
                    matrizAreaClass = 0
            else:
                QMessageBox.information(
                    self, "Error",
                    "El Raster debe de estar en unidades Metricas",
                    QMessageBox.Ok)
                error = False
                matrizAreaClass = 0

        return matrizAreaClass, error