diff --git a/ezgpx/gpx/gpx.py b/ezgpx/gpx/gpx.py index ea1cbbc..cc79707 100644 --- a/ezgpx/gpx/gpx.py +++ b/ezgpx/gpx/gpx.py @@ -672,25 +672,26 @@ def to_dataframe( Dataframe containing data from GPX. """ # Disable time related values if no time data available + time_related_values = ["time", "speed", "pace", "ascent_speed"] if not self._time_data: - if any([v in ["time", "speed", "pace", "ascent_speed"] for v in values]): + if any([v in time_related_values for v in values]): warnings.warn(f"Trying to create dataframe from GPX file {self.file_path} which does not contain time data" "Time related values (time, speed, pace, ascent speed) will not be present in the dataframe.", UserWarning) - values.remove("time") - values.remove("speed") - values.remove("pace") - values.remove("ascent_speed") + for v in time_related_values: + if v in values: + values.remove(v) # Disable elevation related values if no elevation data available + elevation_related_values = ["ele", "ascent_rate", "ascent_speed"] if not self._ele_data: - if any([v in ["ele", "ascent_rate", "ascent_speed"] for v in values]): + if any([v in elevation_related_values for v in values]): warnings.warn(f"Trying to create dataframe from GPX file {self.file_path} which does not contain elevation data" "Time related values (elevation, ascent rate, ascent speed) will not be present in the dataframe.", UserWarning) - values.remove("ele") - values.remove("ascent_rate") - values.remove("ascent_speed") + for v in elevation_related_values: + if v in values: + values.remove(v) return self.gpx.to_dataframe(values) @@ -907,14 +908,13 @@ def matplotlib_plot( title_fontsize: int = 20, watermark: bool = False, file_path: str = None): + dynamic_colors = ["ele", "speed", "pace", "vertical_drop", "ascent_rate", "ascent_speed"] + # Create dataframe containing data from the GPX file - self._dataframe = self.to_dataframe(elevation=True, - time=True, - speed=True, - pace=True, - ascent_rate=True, - ascent_speed=True, - distance_from_start=True) + values = ["lat", "lon"] + if color in dynamic_colors: + values.append(color) + self._dataframe = self.to_dataframe(values) # Create figure fig = plt.figure(figsize=figsize) @@ -922,18 +922,24 @@ def matplotlib_plot( # Compute track boundaries min_lat, min_lon, max_lat, max_lon = self.bounds() - # Add default offset - delta_max = max(max_lat - min_lat, max_lon - min_lon) + # Compute default offset + delta_lat = abs(max_lat - min_lat) + delta_lon = abs(max_lon - min_lon) + delta_max = max(delta_lat, delta_lon) offset = delta_max * offset_percentage - min_lat, min_lon = max(0, min_lat - offset), max(0, min_lon - offset) - max_lat, max_lon = min(max_lat + offset, 90), min(max_lon + offset, 180) + + # Add default offset + min_lat = max(-90, min_lat - offset) + max_lat = min(max_lat + offset, 90) + min_lon = max(-180, min_lon - offset) + max_lon = min(max_lon + offset, 180) # Some sort of magic to achieve the correct map aspect ratio # CREATE FUNCTION (also used in animation??) lat_offset = 1e-5 lon_offset = 1e-5 - delta_lat = max_lat - min_lat - delta_lon = max_lon - min_lon + delta_lat = abs(max_lat - min_lat) + delta_lon = abs(max_lon - min_lon) r = delta_lon / delta_lat # Current map aspect ratio r_ref = figsize[0] / figsize[1] # Target map aspect ratio, Adapt in function of the shape of the subplot... @@ -943,11 +949,11 @@ def matplotlib_plot( # not isclose(delta_lat % pos.height, 0.0, abs_tol=tolerance)): while not isclose(r, r_ref, abs_tol=tolerance): if r > r_ref: - min_lat = max(0, min_lat - lat_offset) + min_lat = max(-90, min_lat - lat_offset) max_lat = min(max_lat + lat_offset, 90) delta_lat = max_lat - min_lat if r < r_ref: - min_lon = max(0, min_lon - lon_offset) + min_lon = max(-180, min_lon - lon_offset) max_lon = min(max_lon + lon_offset, 180) delta_lon = max_lon - min_lon r = delta_lon / delta_lat @@ -980,7 +986,7 @@ def matplotlib_plot( verbose=True) # Scatter track points - if color in ["ele", "speed", "pace", "vertical_drop", "ascent_rate", "ascent_speed"]: + if color in dynamic_colors: im = map.scatter(self._dataframe["lon"], self._dataframe["lat"], s=size, @@ -994,13 +1000,13 @@ def matplotlib_plot( # Scatter start point with different color if start_point_color: - map.scatter(x[0], y[0], marker="^", - color=start_point_color) + map.scatter(self._dataframe["lon"][0], self._dataframe["lat"][0], + marker="^", color=start_point_color) # Scatter stop point with different color if stop_point_color: - map.scatter(x[-1], y[-1], marker="h", - color=stop_point_color) + map.scatter(self._dataframe["lon"].iloc[-1], self._dataframe["lat"].iloc[-1], + marker="h", color=stop_point_color) # Scatter way points with different color if way_points_color: @@ -1095,18 +1101,24 @@ def expert_map( # Compute track boundaries min_lat, min_lon, max_lat, max_lon = self.bounds() - # Add default offset - delta_max = max(max_lat - min_lat, max_lon - min_lon) + # Compute default offset + delta_lat = abs(max_lat - min_lat) + delta_lon = abs(max_lon - min_lon) + delta_max = max(delta_lat, delta_lon) offset = delta_max * offset_percentage - min_lat, min_lon = max(0, min_lat - offset), max(0, min_lon - offset) - max_lat, max_lon = min(max_lat + offset, 90), min(max_lon + offset, 180) + + # Add default offset + min_lat = max(-90, min_lat - offset) + max_lat = min(max_lat + offset, 90) + min_lon = max(-180, min_lon - offset) + max_lon = min(max_lon + offset, 180) # Some sort of magic to achieve the correct map aspect ratio # CREATE FUNCTION (also used in anmation??) lat_offset = 1e-5 lon_offset = 1e-5 - delta_lat = max_lat - min_lat - delta_lon = max_lon - min_lon + delta_lat = abs(max_lat - min_lat) + delta_lon = abs(max_lon - min_lon) r = delta_lon / delta_lat # Current map aspect ratio pos = axes.get_position() # Axes bounding box print(f"pos.width = {pos.width}") @@ -1182,13 +1194,13 @@ def expert_map( # Scatter start point with different color if start_point_color: - map.scatter(x[0], y[0], marker="^", - color=start_point_color) + map.scatter(self._dataframe["lon"][0], self._dataframe["lat"][0], + marker="^", color=start_point_color) # Scatter stop point with different color if stop_point_color: - map.scatter(x[-1], y[-1], marker="h", - color=stop_point_color) + map.scatter(self._dataframe["lon"].iloc[-1], self._dataframe["lat"].iloc[-1], + marker="h", color=stop_point_color) # Scatter way points with different color if way_points_color: diff --git a/tests/test_files/files/alltrails_1.gpx b/tests/test_files/files/alltrails_1.gpx new file mode 100644 index 0000000..0572464 --- /dev/null +++ b/tests/test_files/files/alltrails_1.gpx @@ -0,0 +1,1433 @@ + + + + + + + AllTrails, LLC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AllTrails + + + 513.34 + + + 513.95 + + + 514.02 + + + 515.75 + + + 516.54 + + + 513.81 + + + 514.04 + + + 515.17 + + + 515.17 + + + 520.73 + + + 523.78 + + + 520.15 + + + 519.94 + + + 521.4 + + + 522.48 + + + 522.48 + + + 523.08 + + + 522.66 + + + 519.95 + + + 519.95 + + + 519.52 + + + 520.28 + + + 520.83 + + + 520.01 + + + 518.2 + + + 518.51 + + + 518.51 + + + 515.54 + + + 514.47 + + + 513.7 + + + 515.12 + + + 515.84 + + + 515.12 + + + 513.57 + + + 506.52 + + + 511.65 + + + 512.4 + + + 507.82 + + + 509.78 + + + 519.93 + + + 519.93 + + + 520.74 + + + 520.74 + + + 519.71 + + + 519.71 + + + 519.52 + + + 518.35 + + + 518.35 + + + 515.49 + + + 515.07 + + + 512.66 + + + 513.27 + + + 513.27 + + + 511.78 + + + 511.78 + + + 511.6 + + + 510.2 + + + 511.61 + + + 513.02 + + + 512.27 + + + 512.27 + + + 511.94 + + + 507.13 + + + 506.21 + + + 506.21 + + + 504.16 + + + 508.8 + + + 510.46 + + + 510.39 + + + 508.2 + + + 509.29 + + + 509.29 + + + 509.76 + + + 510.27 + + + 508.71 + + + 508.71 + + + 508.93 + + + 511.96 + + + 511.76 + + + 510.32 + + + 508.68 + + + 507.98 + + + 507.98 + + + 509.14 + + + 509.54 + + + 509.54 + + + 509.04 + + + 507.51 + + + 506.13 + + + 504.18 + + + 504.18 + + + 503.08 + + + 503.36 + + + 503.41 + + + 504.03 + + + 504.56 + + + 504.56 + + + 505.66 + + + 506.0 + + + 506.12 + + + 506.12 + + + 506.22 + + + 506.93 + + + 506.93 + + + 506.74 + + + 505.81 + + + 505.81 + + + 508.11 + + + 508.11 + + + 507.61 + + + 506.96 + + + 506.96 + + + 506.6 + + + 506.92 + + + 506.92 + + + 506.43 + + + 504.19 + + + 505.73 + + + 505.73 + + + 506.35 + + + 507.37 + + + 507.28 + + + 507.12 + + + 506.35 + + + 506.34 + + + 505.66 + + + 505.66 + + + 503.92 + + + 505.11 + + + 505.11 + + + 504.73 + + + 504.03 + + + 504.03 + + + 505.04 + + + 505.09 + + + 505.34 + + + 505.86 + + + 507.64 + + + 507.58 + + + 507.63 + + + 507.86 + + + 506.12 + + + 506.12 + + + 505.94 + + + 503.62 + + + 503.08 + + + 505.02 + + + 506.07 + + + 502.64 + + + 502.88 + + + 501.49 + + + 502.21 + + + 502.21 + + + 503.34 + + + 504.05 + + + 504.05 + + + 503.69 + + + 503.57 + + + 507.73 + + + 507.55 + + + 505.98 + + + 505.98 + + + 505.98 + + + 505.94 + + + 508.19 + + + 508.6 + + + 508.6 + + + 510.78 + + + 507.83 + + + 507.51 + + + 507.76 + + + 507.76 + + + 511.18 + + + 511.14 + + + 507.42 + + + 507.42 + + + 507.47 + + + 508.31 + + + 507.08 + + + 506.86 + + + 507.87 + + + 507.87 + + + 508.7 + + + 503.36 + + + 501.24 + + + 501.67 + + + 501.67 + + + 503.71 + + + 506.2 + + + 508.1 + + + 510.55 + + + 513.08 + + + 508.68 + + + 508.68 + + + 510.2 + + + 512.0 + + + 510.97 + + + 510.09 + + + 509.48 + + + 509.48 + + + 508.98 + + + 504.56 + + + 503.46 + + + 503.46 + + + 503.44 + + + 503.93 + + + 505.08 + + + 508.32 + + + 508.32 + + + 506.0 + + + 509.18 + + + 509.18 + + + 508.37 + + + 506.44 + + + 504.82 + + + 508.32 + + + 509.37 + + + 510.7 + + + 510.7 + + + 511.33 + + + 513.22 + + + 513.43 + + + 511.94 + + + 511.94 + + + 511.87 + + + 511.26 + + + 511.97 + + + 512.72 + + + 512.72 + + + 512.7 + + + 512.29 + + + 515.12 + + + 518.1 + + + 517.35 + + + 517.35 + + + 513.44 + + + 514.08 + + + 514.85 + + + 515.71 + + + 514.09 + + + 514.09 + + + 513.35 + + + 514.93 + + + 518.12 + + + 517.47 + + + 517.47 + + + 514.08 + + + 513.5 + + + 513.88 + + + 514.27 + + + 514.27 + + + 514.56 + + + 515.28 + + + 516.39 + + + 517.09 + + + 516.99 + + + 515.63 + + + 515.63 + + + 515.04 + + + 515.04 + + + 515.07 + + + 515.03 + + + 514.96 + + + 515.54 + + + 517.61 + + + 518.38 + + + 518.38 + + + 512.76 + + + 512.96 + + + 514.64 + + + 515.0 + + + 515.0 + + + 514.85 + + + 516.1 + + + 516.72 + + + 515.82 + + + 515.82 + + + 514.54 + + + 514.9 + + + 513.33 + + + 513.33 + + + 513.11 + + + 514.47 + + + 516.35 + + + 516.06 + + + 513.58 + + + 513.5 + + + 513.53 + + + 513.53 + + + 513.57 + + + 514.6 + + + 517.58 + + + 519.02 + + + 520.62 + + + 520.62 + + + 520.98 + + + 520.74 + + + 519.88 + + + 519.1 + + + 522.99 + + + 522.21 + + + 522.21 + + + 521.87 + + + 518.47 + + + 518.98 + + + 519.65 + + + 519.65 + + + 518.06 + + + 517.06 + + + 516.16 + + + 516.02 + + + 517.18 + + + 517.18 + + + 518.18 + + + 524.08 + + + 526.2 + + + 527.38 + + + 527.38 + + + 527.55 + + + 528.73 + + + 533.05 + + + 539.74 + + + 540.51 + + + 540.51 + + + 545.22 + + + 532.54 + + + 532.23 + + + 532.23 + + + 529.93 + + + 520.15 + + + 516.63 + + + 514.98 + + + 515.5 + + + 515.58 + + + 515.58 + + + 518.85 + + + 518.85 + + + 519.3 + + + 522.32 + + + 527.82 + + + 527.82 + + + 528.1 + + + 528.31 + + + 526.78 + + + 526.29 + + + 524.7 + + + 523.13 + + + 523.29 + + + 522.24 + + + 521.16 + + + 522.13 + + + 522.61 + + + 522.99 + + + 522.99 + + + 527.65 + + + 527.65 + + + 522.99 + + + 522.61 + + + 522.13 + + + 521.16 + + + 522.24 + + + 523.29 + + + 523.13 + + + 524.7 + + + 526.29 + + + 526.78 + + + 528.31 + + + 528.1 + + + 527.82 + + + 527.75 + + + 527.42 + + + 528.01 + + + 530.49 + + + 531.79 + + + 532.58 + + + 532.17 + + + 535.83 + + + 538.5 + + + 531.24 + + + 531.24 + + + 528.43 + + + 524.35 + + + 540.78 + + + 540.78 + + + 550.53 + + + 533.12 + + + 529.56 + + + 527.87 + + + 528.12 + + + 523.83 + + + 523.87 + + + 523.87 + + + 523.9 + + + 522.62 + + + 516.97 + + + 516.26 + + + 516.51 + + + 516.51 + + + 516.64 + + + 517.67 + + + 517.76 + + + 517.76 + + + 519.49 + + + 517.08 + + + 516.98 + + + 515.18 + + + 516.3 + + + 517.09 + + + 517.09 + + + 519.09 + + + 521.66 + + + 521.42 + + + 527.46 + + + 524.88 + + + 519.98 + + + 517.7 + + + 517.7 + + + 518.46 + + + 516.0 + + + 516.0 + + + 515.4 + + + 511.95 + + + 511.53 + + + 511.53 + + + 511.29 + + + 516.34 + + + 517.43 + + + 519.67 + + + 519.67 + + + 519.27 + + + 518.12 + + + 518.83 + + + 521.82 + + + 521.62 + + + 524.72 + + + 527.75 + + + 527.75 + + + 524.4 + + + 522.39 + + + 522.49 + + + 517.83 + + + 516.29 + + + 518.1 + + + 519.84 + + + 519.57 + + + 518.3 + + + 518.31 + + + 518.31 + + + 517.31 + + + 514.55 + + + 513.33 + + + 518.34 + + + 510.65 + + + 522.22 + + + 523.45 + + + 520.17 + + + 516.79 + + + 516.7 + + + 518.22 + + + 522.81 + + + 518.8 + + + 517.35 + + + 514.28 + + + 513.34 + + + + diff --git a/tests/test_files/files/alltrails_2.gpx b/tests/test_files/files/alltrails_2.gpx new file mode 100644 index 0000000..7821fe5 --- /dev/null +++ b/tests/test_files/files/alltrails_2.gpx @@ -0,0 +1,1184 @@ + + + + + + + AllTrails, LLC + + + + + + AllTrails + + + 2068.62 + + + 2068.16 + + + 2069.02 + + + 2069.04 + + + 2075.06 + + + 2085.06 + + + 2075.09 + + + 2069.8 + + + 2069.02 + + + 2068.34 + + + 2068.48 + + + 2069.6 + + + 2071.96 + + + 2072.76 + + + 2071.38 + + + 2068.83 + + + 2069.16 + + + 2083.37 + + + 2082.27 + + + 2080.13 + + + 2078.95 + + + 2078.17 + + + 2077.22 + + + 2076.8 + + + 2075.94 + + + 2072.27 + + + 2069.65 + + + 2065.49 + + + 2066.93 + + + 2069.92 + + + 2080.26 + + + 2084.72 + + + 2083.91 + + + 2080.56 + + + 2076.52 + + + 2067.52 + + + 2060.8 + + + 2055.22 + + + 2057.14 + + + 2056.75 + + + 2048.69 + + + 2043.7 + + + 2041.76 + + + 2045.19 + + + 2047.43 + + + 2047.5 + + + 2047.82 + + + 2047.48 + + + 2046.63 + + + 2046.42 + + + 2046.06 + + + 2045.56 + + + 2051.09 + + + 2050.61 + + + 2047.21 + + + 2045.01 + + + 2042.66 + + + 2040.18 + + + 2040.66 + + + 2036.92 + + + 2036.39 + + + 2035.41 + + + 2031.08 + + + 2026.92 + + + 2026.86 + + + 2023.74 + + + 2023.42 + + + 2024.16 + + + 2022.89 + + + 2023.33 + + + 2021.98 + + + 2020.77 + + + 2021.43 + + + 2012.78 + + + 2013.97 + + + 2000.41 + + + 1989.01 + + + 1988.25 + + + 1987.5 + + + 1988.15 + + + 1989.72 + + + 1994.08 + + + 1997.67 + + + 2001.77 + + + 2003.52 + + + 2004.43 + + + 2004.1 + + + 2003.81 + + + 2003.81 + + + 2002.1 + + + 1996.06 + + + 2002.88 + + + 2003.53 + + + 2017.95 + + + 2019.19 + + + 2020.76 + + + 2023.24 + + + 2026.79 + + + 2033.56 + + + 2034.58 + + + 2035.13 + + + 2040.66 + + + 2047.63 + + + 2059.8 + + + 2070.38 + + + 2078.94 + + + 2089.48 + + + 2096.68 + + + 2114.22 + + + 2131.4 + + + 2145.24 + + + 2161.61 + + + 2172.65 + + + 2185.85 + + + 2198.05 + + + 2208.94 + + + 2221.6 + + + 2230.91 + + + 2240.32 + + + 2246.43 + + + 2249.63 + + + 2251.57 + + + 2252.94 + + + 2254.72 + + + 2255.78 + + + 2256.34 + + + 2256.64 + + + 2257.13 + + + 2257.77 + + + 2259.16 + + + 2260.22 + + + 2261.24 + + + 2261.66 + + + 2262.01 + + + 2261.8 + + + 2261.33 + + + 2258.59 + + + 2257.37 + + + 2257.06 + + + 2257.6 + + + 2260.27 + + + 2258.45 + + + 2260.38 + + + 2264.67 + + + 2267.05 + + + 2263.71 + + + 2271.49 + + + 2272.62 + + + 2272.62 + + + 2273.65 + + + 2279.71 + + + 2290.94 + + + 2293.98 + + + 2297.79 + + + 2301.53 + + + 2303.98 + + + 2310.22 + + + 2319.38 + + + 2321.32 + + + 2321.13 + + + 2322.98 + + + 2325.45 + + + 2329.22 + + + 2331.69 + + + 2335.44 + + + 2338.59 + + + 2341.12 + + + 2342.58 + + + 2343.58 + + + 2344.81 + + + 2352.49 + + + 2354.27 + + + 2356.35 + + + 2358.07 + + + 2360.33 + + + 2362.15 + + + 2363.12 + + + 2365.05 + + + 2372.66 + + + 2382.98 + + + 2387.48 + + + 2389.24 + + + 2389.12 + + + 2389.12 + + + 2390.12 + + + 2392.1 + + + 2392.1 + + + 2392.1 + + + 2393.1 + + + 2394.09 + + + 2394.09 + + + 2394.09 + + + 2398.02 + + + 2399.05 + + + 2400.04 + + + 2401.08 + + + 2401.08 + + + 2402.01 + + + 2402.01 + + + 2403.0 + + + 2401.91 + + + 2401.91 + + + 2402.88 + + + 2402.88 + + + 2403.85 + + + 2402.73 + + + 2402.73 + + + 2401.42 + + + 2401.42 + + + 2400.28 + + + 2400.04 + + + 2399.77 + + + 2399.77 + + + 2399.77 + + + 2399.77 + + + 2399.47 + + + 2399.47 + + + 2399.47 + + + 2399.47 + + + 2398.29 + + + 2397.11 + + + 2397.94 + + + 2396.74 + + + 2400.77 + + + 2401.38 + + + 2402.57 + + + 2403.76 + + + 2403.21 + + + 2404.43 + + + 2405.65 + + + 2406.87 + + + 2408.08 + + + 2409.3 + + + 2409.3 + + + 2410.52 + + + 2411.74 + + + 2412.96 + + + 2415.39 + + + 2416.88 + + + 2416.88 + + + 2418.07 + + + 2418.07 + + + 2419.26 + + + 2419.26 + + + 2419.48 + + + 2419.7 + + + 2419.7 + + + 2420.27 + + + 2421.56 + + + 2422.14 + + + 2422.5 + + + 2422.35 + + + 2422.11 + + + 2421.93 + + + 2421.81 + + + 2422.46 + + + 2422.46 + + + 2423.18 + + + 2423.87 + + + 2424.56 + + + 2424.56 + + + 2425.22 + + + 2425.22 + + + 2427.15 + + + 2427.13 + + + 2426.19 + + + 2425.82 + + + 2425.25 + + + 2425.46 + + + 2424.89 + + + 2425.09 + + + 2425.09 + + + 2424.53 + + + 2424.73 + + + 2423.6 + + + 2423.25 + + + 2422.68 + + + 2422.68 + + + 2422.33 + + + 2421.77 + + + 2421.42 + + + 2419.83 + + + 2419.83 + + + 2419.21 + + + 2419.8 + + + 2418.97 + + + 2419.29 + + + 2420.97 + + + 2421.43 + + + 2422.18 + + + 2423.49 + + + 2423.83 + + + 2424.38 + + + 2424.38 + + + 2424.93 + + + 2424.93 + + + 2425.49 + + + 2426.04 + + + 2426.04 + + + 2426.6 + + + 2426.94 + + + 2427.5 + + + 2427.5 + + + 2428.05 + + + 2428.61 + + + 2429.16 + + + 2429.16 + + + 2429.72 + + + 2430.08 + + + 2430.63 + + + 2430.63 + + + 2431.19 + + + 2431.19 + + + 2431.74 + + + 2431.74 + + + 2431.74 + + + 2431.74 + + + 2432.3 + + + 2432.3 + + + 2432.67 + + + 2433.22 + + + 2433.03 + + + 2433.96 + + + 2433.96 + + + 2434.34 + + + 2434.34 + + + 2435.28 + + + 2436.22 + + + 2436.53 + + + 2436.35 + + + 2435.99 + + + 2437.36 + + + 2440.16 + + + 2440.36 + + + 2440.59 + + + 2440.81 + + + 2440.81 + + + 2440.61 + + + 2440.86 + + + 2440.86 + + + 2440.65 + + + 2440.88 + + + 2440.67 + + + 2440.46 + + + 2440.89 + + + 2440.89 + + + 2441.31 + + + 2441.53 + + + 2441.74 + + + 2442.18 + + + 2442.18 + + + 2442.18 + + + 2442.42 + + + 2442.65 + + + 2442.65 + + + 2442.88 + + + 2442.88 + + + 2442.89 + + + 2443.34 + + + 2443.56 + + + 2444.01 + + + 2444.01 + + + 2444.46 + + + 2444.46 + + + 2444.92 + + + 2445.37 + + + 2445.83 + + + 2446.06 + + + 2446.52 + + + 2446.99 + + + 2446.99 + + + 2447.22 + + + 2447.22 + + + 2447.46 + + + 2447.22 + + + 2446.75 + + + 2446.98 + + + 2446.98 + + + 2447.68 + + + 2447.68 + + + 2449.1 + + + 2449.09 + + + 2449.57 + + + 2449.82 + + + 2449.82 + + + 2450.3 + + + 2450.55 + + + 2451.53 + + + 2452.72 + + + +