def loadGeoJSON(self): if len(self.data) > 0: geojson = QtWidgets.QFileDialog.getOpenFileName( self, "Select GeoJSON format", QtCore.QDir.rootPath(), "*.geojson") self.gj_loaded = ((os.path.basename(geojson[0])).split("."))[0] if os.path.isfile(Control.dirname + "/Output_data/GeoJSON/coords.csv"): csv_coords = open( Control.dirname + "/Output_data/GeoJSON/coords.csv", "r") else: Control.errorMessage("Cannot find coords.csv table.") return lines = csv_coords.readlines() for line in lines: if line.startswith(self.gj_loaded + ";"): line_str = line.split(";")[1] coords = ast.literal_eval(line_str) points = [] for coord in coords: point = QtCore.QPoint( self.raster.index(coord[0], coord[1])[1], self.raster.index(coord[0], coord[1])[0]) points.append(point) self.roi.setPoints(points, True) self.roi_coords = points csv_coords.close() else: Control.errorMessage( "No satellite image is loaded. Please select vegetation index and area to display." )
def updateGraph(self): self.setCursor(QtCore.Qt.BusyCursor) self.clearGraph() try: if self.x != {}: self.drawGraph() self.setCursor(QtCore.Qt.ArrowCursor) except OSError: Control.errorMessage("This graph cannot be loaded.")
def loadClicked(self): if not self.data_in_table: if self.lineEdit.text() == "": Control.errorMessage("Please insert your data directory path.") return else: Control.createInstances() if len(S2.images) == 0: Control.errorMessage( "No satellite images of Sentinel 2 were found.") else: self.data_in_table = True self.createTable() else: Control.infoMessage( "Data from the input directory have already been loaded.")
def okClicked(self): if self.data_in_table == False: Control.errorMessage( "Please upload satellite imagery from your data folder.") return self.OK.setCursor(QtGui.QCursor(QtCore.Qt.BusyCursor)) attrs = ["ndvi", "rsr", "rvsi", "reip"] attrs_values = [] for image in S2.images: for attr in attrs: attrs_values.append(getattr(image, attr)) if True not in attrs_values: Control.errorMessage( "Please select at least one vegetation index to calculate.") else: self.getResults() Control.closeWindow(self, SecondPage())
def countZonalStats(self, geojson): try: self.plotWidget.clearGraph() self.plotWidget.x = {} self.plotWidget.y = [] dates = [] names = [] for i in self.dates_sort: date = str(i[0]) date_format = date[0:4] + "-" + date[4:6] + "-" + date[6:8] dates.append("") dates.append(date_format) names.append(i[1]) self.plotWidget.x = dict(enumerate(dates)) id_zs = 1 for name in names: with rasterio.open(Control.dirname + "/Output_data/" + name) as src: affine = src.transform r = src.read(1) zs = zonal_stats( geojson, r, stats=["min", "mean", "median", "std", "max", "count"], affine=affine, nodata=-999, all_touched=True) zs[0]['id'] = id_zs zs[0]['date'] = dates[id_zs] zs[0]['name'] = name if zs[0]['mean'] is None: self.plotWidget.y.append(0) self.plotWidget.y.append(0) else: self.plotWidget.y.append(zs[0]['mean']) self.plotWidget.y.append(zs[0]['mean']) self.zss.append(zs[0]) id_zs = id_zs + 2 self.plotWidget.drawGraph() self.showStatValues(0) except OSError: Control.errorMessage("Cannot count raster statistics.")
def openImage(self, pos, dates_sort): try: QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) QtCore.QCoreApplication.addLibraryPath( "/virtualenv/Lib/site-packages/PyQt5/Qt/plugins/imageformats") self.removeImageItem() self.setLinkButtonsUnchecked() link = getattr(self, "linkButton" + str(pos)) link.setChecked(True) link.setFont(QtGui.QFont("Segoe UI", 11, 75)) link.setStyleSheet("color: rgb(5, 30, 115);") self.showStatValues(pos) with rasterio.open( Control.dirname + "/Output_data/" + dates_sort[pos][1], "r+") as infile: r = infile.read() profile = infile.profile profile["dtype"] = rasterio.float32 self.img = pyqtgraph.ImageItem(r[0].astype(rasterio.float32)) self.img.setOpts(axisOrder="row-major") self.data = r[0] self.raster = infile self.graphicsPlot.addItem(self.img, autoHistogramRange=False) self.graphicsPlot.addItem(self.roi) if dates_sort != self.dates_sort: self.getROICoords() self.dates_sort = dates_sort self.histogram.setImageItem(self.img) self.setHistRange(dates_sort[pos][1][-9:-5]) QtWidgets.QApplication.restoreOverrideCursor() except OSError: Control.errorMessage("Cannot load this image.")
def exportClicked(self): canceled = Control.questionBox() self.roi_name = canceled[1] if canceled[0]: return try: self.getROICoords() self.createGeoJSONtoExport() except OSError: Control.errorMessage("GeoJSON cannot be created.") code = "" if self.gj_loaded != "": code = self.gj_loaded else: code = str(self.roi_id) gj = fiona.open( Control.dirname + "/Output_data/GeoJSON/" + code + ".geojson", "r") str_coords = "" for ft in gj: str_coords = "".join( str(i) for i in ft["geometry"]["coordinates"][0]) content = "geometry;" + str_coords + ";\nindex;" + self.plotWidget.y_label \ + ";\narea;" + self.roi_name + ";\ngeojson;" + code + ";" stats = [["date", ""], ["min", ""], ["mean", ""], ["median", ""], ["max", ""], ["std", ""], ["count", ""]] for i in range(len(self.zss)): for j in range(len(stats)): if self.zss[i][stats[j][0]] is not None: if i + 1 < len(self.zss): if j == 0: stats[j][1] += ";" + self.zss[i][ stats[j][0]] + ";difference" + str(i + 1) elif j == 6: stats[j][1] += ";" + str( self.zss[i][stats[j][0]]) + ";0" else: stats[j][1] += ";"\ + ("{:.3f}".format(round(self.zss[i][stats[j][0]], 3))).replace(".", ",")\ + ";" + ("{:.3f}".format(round(self.zss[i][stats[j][0]] - self.zss[i + 1][stats[j][0]], 3))).replace(".", ",") else: if j == 0: stats[j][1] += ";" + self.zss[i][stats[j][0]] elif j == 6: stats[j][1] += ";" + str(self.zss[i][stats[j][0]]) else: stats[j][1] += ";" + ("{:.3f}".format( self.zss[i][stats[j][0]])).replace(".", ",") else: if i + 1 < len(self.zss): stats[j][1] += ";null;null" else: stats[j][1] += ";null" for i in range(len(stats)): content += "\n" + stats[i][0] + stats[i][1] content += "\n\n\n" try: mode = "w" if os.path.isfile(Control.dirname + "/Output_data/export.csv"): mode = "a" csv = open(Control.dirname + "/Output_data/export.csv", mode) csv.write(content) csv.close() mode_c = "w" header_c = "id;geometry;\n" if os.path.isfile(Control.dirname + "/Output_data/GeoJSON/coords.csv"): mode_c = "a" header_c = "" csv_coords = open( Control.dirname + "/Output_data/GeoJSON/coords.csv", mode) csv_coords.write(header_c + str(self.roi_id) + ";" + str(self.nodes_zs) + ";\n") csv_coords.close() Control.infoMessage( "Summary statistics was successfully exported.") except OSError: Control.errorMessage( "Cannot write to file 'export.csv'. Please close the file and try to export data again." )