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