예제 #1
0
    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."
            )
예제 #2
0
 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.")
예제 #3
0
 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.")
예제 #4
0
    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())
예제 #5
0
    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.")
예제 #6
0
    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.")
예제 #7
0
    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."
            )