Exemple #1
0
class NmeaStatistic:
    def __init__(self):
        self.FileName = FILE_NAME_EXT_DATA
        self.OutputFile = None

        self.LastNavigateData = None

        self.DistanceFromLastPoint = 0
        self.TotalDistance = 0

        self.FixQuality_0 = 0;
        self.FixQuality_1 = 0;
        self.FixQuality_2 = 0;
        self.FixQuality_3 = 0;
        self.FixQuality_4 = 0;
        self.FixQuality_5 = 0;
        self.FixQuality_6 = 0;

        self.MarkColor = None

        self.PDOPList = []
        self.HDOPList = []
        self.VDOPList = []

        self.LatitudeList = []
        self.LongitudeList = []
        self.AltitudeList = []

        self.XList = []
        self.YList = []

        self.ColorList = []

        self.PDOTStatistic = Statistic()
        self.HDOTStatistic = Statistic()
        self.VDOTStatistic = Statistic()

        self.LatitudeStatistic = Statistic()
        self.LongitudeStatistic = Statistic()
        self.AltitudeStatistic = Statistic()

        self.XStatistic = Statistic()
        self.YStatistic = Statistic()

        self.Basemap = None

        self.CEP = 0
        self.CEP95 = 0
        self.CEP99 = 0

    def set_file_name(self, file_name):
        self.FileName = file_name + FILE_NAME_EXT_DATA

    def check_date_time(self, navigate_data):
        result = False

        if navigate_data is None:
            return result

        if navigate_data.LocalDateTime is None:
            return result

        if self.LastNavigateData is not None:
            last_local_date_time = self.LastNavigateData.LocalDateTime
            if last_local_date_time is not None:
                duration = navigate_data.LocalDateTime - last_local_date_time
                if duration.seconds <= 0:
                    return result

        result = True

        return result

    def add_to_data_list(self, navigate_data):
        self.DistanceFromLastPoint = 0

        if navigate_data is None:
            return

        if not self.check_date_time(navigate_data):
            return

        if len(navigate_data.PDOP) == 0 or len(navigate_data.HDOP) == 0 or len(navigate_data.VDOP) == 0:
            return

        if navigate_data.LatitudeValue == 0 or navigate_data.LongitudeValue == 0:
            return

        if self.LastNavigateData is not None:
            last_point = (self.LastNavigateData.LatitudeValue, self.LastNavigateData.LongitudeValue)
            current_point = (navigate_data.LatitudeValue, navigate_data.LongitudeValue)
            self.DistanceFromLastPoint = distance.distance(last_point, current_point).m

        self.TotalDistance += self.DistanceFromLastPoint

        try:
            self.PDOPList.append(navigate_data.PDOP)
            self.HDOPList.append(navigate_data.HDOP)
            self.VDOPList.append(navigate_data.VDOP)
            self.LatitudeList.append(navigate_data.LatitudeValue)
            self.LongitudeList.append(navigate_data.LongitudeValue)
            self.AltitudeList.append(float(navigate_data.Altitude))
        except ValueError as e:
            print("ValueError:", e)
            return

        # (55, 168, 218), (187, 249, 112), (255, 255, 0), (113, 130, 36), (113, 174, 38), (255, 255, 255)
        value = int(navigate_data.FixQuality)
        if value == 0:
            self.FixQuality_0 = self.FixQuality_0 + 1;
            self.MarkColor = (0.5, 0.5, 0.5)  # remark = "Invalid"
        elif value == 1:
            self.FixQuality_1 = self.FixQuality_1 + 1;
            self.MarkColor = (0.22, 0.67, 0.872)  # remark = "SPS"
        elif value == 2:
            self.FixQuality_2 = self.FixQuality_2 + 1;
            self.MarkColor = (0.733, 0.976, 0.439)  # remark = "Differential"
        elif value == 3:
            self.FixQuality_3 = self.FixQuality_3 + 1;
            self.MarkColor = (1.0, 1.0, 0)  # remark = "PPS"
        elif value == 4:
            self.FixQuality_4 = self.FixQuality_4 + 1;
            self.MarkColor = (0.443, 0.509, 0.141)  # remark = "RTK Fixed"
        elif value == 5:
            self.FixQuality_5 = self.FixQuality_5 + 1;
            self.MarkColor = (0.443, 0.682, 0.149)  # remark = "RTK Float"
        elif value == 6:
            self.FixQuality_6 = self.FixQuality_6 + 1;
            self.MarkColor = (1.0, 1.0, 1.0)  # remark = "Estimated"

        self.ColorList.append(self.MarkColor)

        self.LastNavigateData = navigate_data

        self.write_to_file(navigate_data)

    def convert(self):
        if not self.LongitudeStatistic.valid():
            return

        if not self.LatitudeStatistic.valid():
            return

        a = 1
        b = 0.001
        longitude_offset = a * max(abs(self.LongitudeStatistic.Mean - self.LongitudeStatistic.Min),
                                   abs(self.LongitudeStatistic.Mean - self.LongitudeStatistic.Max)) + b
        latitude_offset = a * max(abs(self.LatitudeStatistic.Mean - self.LatitudeStatistic.Min),
                                  abs(self.LatitudeStatistic.Mean - self.LatitudeStatistic.Max)) + b

        self.Basemap = Basemap(llcrnrlon=self.LongitudeStatistic.Mean - longitude_offset,
                               llcrnrlat=self.LatitudeStatistic.Mean - latitude_offset,
                               urcrnrlon=self.LongitudeStatistic.Mean + longitude_offset,
                               urcrnrlat=self.LatitudeStatistic.Mean + latitude_offset,
                               projection='lcc', suppress_ticks=False, resolution='i',
                               lat_0=self.LatitudeStatistic.Mean,
                               lon_0=self.LongitudeStatistic.Mean)

        self.XList, self.YList = self.Basemap(self.LongitudeStatistic.DataList, self.LatitudeStatistic.DataList)

    def write_to_file(self, navigate_data):
        if self.OutputFile is None:
            self.OutputFile = open(self.FileName, "w")
            text = "date_time" + SEPARATOR_T \
                   + "FixQuality" + SEPARATOR_T \
                   + "PDOP" + SEPARATOR_T \
                   + "HDOP" + SEPARATOR_T \
                   + "VDOP" + SEPARATOR_T \
                   + "Latitude" + SEPARATOR_T \
                   + "Longitude" + SEPARATOR_T \
                   + "Altitude" + SEPARATOR_T \
                   + "delt" + SEPARATOR_T \
                   + "total" + SEPARATOR_N
            self.OutputFile.write(text)

        if self.OutputFile is not None:
            text = navigate_data.local_date_time_to_string() + SEPARATOR_T \
                   + navigate_data.FixQuality + SEPARATOR_T \
                   + navigate_data.PDOP + SEPARATOR_T \
                   + navigate_data.HDOP + SEPARATOR_T \
                   + navigate_data.VDOP + SEPARATOR_T \
                   + str(navigate_data.LatitudeValue) + SEPARATOR_T \
                   + str(navigate_data.LongitudeValue) + SEPARATOR_T \
                   + str(navigate_data.Altitude) + SEPARATOR_T \
                   + str(self.DistanceFromLastPoint) + SEPARATOR_T \
                   + str(self.TotalDistance) + SEPARATOR_N
            self.OutputFile.write(text)

    def statistic(self):
        self.PDOTStatistic.statistic("PDOP", self.PDOPList)
        self.HDOTStatistic.statistic("HDOP", self.HDOPList)
        self.VDOTStatistic.statistic("VDOP", self.VDOPList)
        self.LatitudeStatistic.statistic("Latitude", self.LatitudeList)
        self.LongitudeStatistic.statistic("Longitude", self.LongitudeList)
        self.AltitudeStatistic.statistic("Altitude", self.AltitudeList)

        self.convert()

        self.XStatistic.statistic("X", self.XList)
        self.YStatistic.statistic("Y", self.YList)

        self.CEP = Statistic.cep(self.XStatistic.Std, self.YStatistic.Std)
        self.CEP95 = Statistic.cep95(self.XStatistic.Std, self.YStatistic.Std)
        self.CEP99 = Statistic.cep99(self.XStatistic.Std, self.YStatistic.Std)

        print(self.cep_to_string())
        print(self.rms_to_string())
        print(self.test_point_count_to_string())
        print(self.fix_quality_count_to_string())

        if self.OutputFile is not None:
            self.OutputFile.write(self.to_string())
            self.OutputFile.close()

    def draw(self):
        if self.Basemap is None:
            return

        self.Basemap.scatter(self.XList, self.YList, c=self.ColorList)

        x0 = self.XStatistic.Mean
        y0 = self.YStatistic.Mean

        # MAX_RADIUS = 10
        x_axis = (x0 - MAX_RADIUS, x0 + MAX_RADIUS)
        y_axis = (y0 - MAX_RADIUS, y0 + MAX_RADIUS)

        plt.plot(x_axis, (y0, y0), color='grey')
        plt.plot((x0, x0), y_axis, color='grey')

        for i in range(0, MAX_RADIUS):
            circle = Circle((x0, y0), radius=i + 1, fill=False, color='#00ffff', alpha=0.5)
            plt.gca().add_patch(circle)
            plt.text(x0 + i + 1, y0, i + 1)

        circle = Circle((x0, y0), radius=self.CEP, fill=False, color='red')
        plt.gca().add_patch(circle)
        plt.text(x0, y0 + self.CEP, ("%.4f" % self.CEP))

        circle = Circle((x0, y0), radius=self.CEP95, fill=False, color='red')
        plt.gca().add_patch(circle)
        plt.text(x0, y0 + self.CEP95, ("%.4f" % self.CEP95))

        circle = Circle((x0, y0), radius=self.CEP99, fill=False, color='red')
        plt.gca().add_patch(circle)
        plt.text(x0, y0 + self.CEP99, ("%.4f" % self.CEP99))

        plt.show()

    def test_point_count_to_string(self):
        result = ""

        result += "Test point count = " + str(len(self.XList)) + SEPARATOR_N

        return result

    def fix_quality_count_to_string(self):
        result = ""

        if self.FixQuality_0 > 0:
            result += "Invalid count = " + str(self.FixQuality_0) + SEPARATOR_N

        if self.FixQuality_1 > 0:
            result += "SPS count = " + str(self.FixQuality_1) + SEPARATOR_N

        if self.FixQuality_2 > 0:
            result += "Differential count = " + str(self.FixQuality_2) + SEPARATOR_N

        if self.FixQuality_3 > 0:
            result += "PPS count = " + str(self.FixQuality_3) + SEPARATOR_N

        if self.FixQuality_4 > 0:
            result += "RTK Fixed count = " + str(self.FixQuality_4) + SEPARATOR_N

        if self.FixQuality_5 > 0:
            result += "RTK Float count = " + str(self.FixQuality_5) + SEPARATOR_N

        if self.FixQuality_6 > 0:
            result += "Estimated count = " + str(self.FixQuality_6) + SEPARATOR_N

        return result

    def rms_to_string(self):
        result = ""

        result += "RMS_H = " + str(1.2 * self.CEP) + SEPARATOR_N \
                  + "RMS_V = " + str(self.AltitudeStatistic.Std) + SEPARATOR_N

        return result

    def cep_to_string(self):
        result = ""

        result += "CEP = " + str(self.CEP) + SEPARATOR_N \
                  + "CEP95 = " + str(self.CEP95) + SEPARATOR_N \
                  + "CEP99 = " + str(self.CEP99) + SEPARATOR_N

        return result

    def to_string(self):
        result = ""

        result += self.PDOTStatistic.to_string() + SEPARATOR_N \
                  + self.HDOTStatistic.to_string() + SEPARATOR_N \
                  + self.VDOTStatistic.to_string() + SEPARATOR_N \
                  + self.LatitudeStatistic.to_string() + SEPARATOR_N \
                  + self.LongitudeStatistic.to_string() + SEPARATOR_N \
                  + self.AltitudeStatistic.to_string() + SEPARATOR_N \
                  + self.XStatistic.to_string() + SEPARATOR_N \
                  + self.YStatistic.to_string() + SEPARATOR_N \
                  + self.cep_to_string() + SEPARATOR_N \
                  + self.rms_to_string() + SEPARATOR_N \
                  + self.test_point_count_to_string() + SEPARATOR_N\
                  + self.fix_quality_count_to_string()

        return result