Skip to content

Commit 90d6197

Browse files
committed
Move logic inside main(), add argparsing, improve some variable names
1 parent bd4e25b commit 90d6197

2 files changed

Lines changed: 115 additions & 90 deletions

File tree

‎personal_heatmap.py‎

Lines changed: 114 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import argparse
12
import glob
23
import os
34

@@ -8,119 +9,143 @@
89
from geopy.geocoders import Nominatim
910

1011
geolocator = Nominatim(user_agent="heatmap_app")
11-
location = geolocator.geocode("Montreal Quebec")
12-
lat_check = float(location.raw["lat"])
13-
lon_check = float(location.raw["lon"])
1412

15-
data = glob.glob("*.gpx")
16-
fitdata = glob.glob("*.fit")
1713

18-
if len(fitdata) != 0:
19-
print("Converting Garmin FIT files")
20-
os.system("python fit_to_csv.py")
21-
os.system("mkdir fit_files")
22-
os.system("mv *.fit ./fit_files")
14+
def parse_args() -> argparse.Namespace:
15+
args = argparse.ArgumentParser()
16+
args.add_argument(
17+
"--dir",
18+
help="Path to direcotry with .fit, .gpx files to process for the heatmap",
19+
default=os.getcwd(),
20+
)
21+
args.add_argument(
22+
"--output_path",
23+
help="Path to write the heatmap .html to",
24+
default="heatmap.html",
25+
)
2326

24-
csvdata = glob.glob("*.csv")
27+
return args.parse_args()
2528

26-
lat = []
27-
lon = []
2829

29-
all_lat = []
30-
all_long = []
30+
def main():
31+
args = parse_args()
32+
location = geolocator.geocode("Montreal Quebec")
33+
lat_check = float(location.raw["lat"])
34+
lon_check = float(location.raw["lon"])
3135

32-
print("Loading data")
36+
gpx_files = glob.glob(args.dir + "/*.gpx")
37+
fit_files = glob.glob(args.dir + "/*.fit")
3338

34-
for activity in data:
35-
gpx_filename = activity
36-
with open(gpx_filename, "r") as gpx_file:
37-
gpx = gpxpy.parse(gpx_file)
39+
if len(fit_files) != 0:
40+
print("Converting Garmin FIT files")
41+
os.system("python fit_to_csv.py")
42+
os.system("mkdir fit_files")
43+
os.system("mv *.fit ./fit_files")
3844

39-
for track in gpx.tracks:
40-
for segment in track.segments:
41-
for point in segment.points:
42-
lat.append(point.latitude)
43-
lon.append(point.longitude)
45+
csvdata = glob.glob("*.csv")
4446

45-
check1 = np.any(np.isclose(lat, lat_check, atol=0.5))
46-
check2 = np.any(np.isclose(lon, lon_check, atol=0.5))
47+
lat = []
48+
lon = []
4749

48-
if check1 and check2:
49-
all_lat.append(lat)
50-
all_long.append(lon)
50+
all_lat = []
51+
all_long = []
5152

52-
lon = []
53-
lat = []
53+
print("Loading data")
5454

55-
for activity in csvdata:
56-
csv_filename = activity
57-
csv_file = pd.read_csv(csv_filename)
55+
for activity in gpx_files:
56+
gpx_filename = activity
57+
with open(gpx_filename, "r") as gpx_file:
58+
gpx = gpxpy.parse(gpx_file)
5859

59-
for i in range(len(csv_file)):
60-
lat.append(csv_file["position_lat"][i])
61-
lon.append(csv_file["position_long"][i])
60+
for track in gpx.tracks:
61+
for segment in track.segments:
62+
for point in segment.points:
63+
lat.append(point.latitude)
64+
lon.append(point.longitude)
6265

63-
check1 = np.any(np.isclose(lat, lat_check, atol=0.5))
64-
check2 = np.any(np.isclose(lon, lon_check, atol=0.5))
66+
check1 = np.any(np.isclose(lat, lat_check, atol=0.5))
67+
check2 = np.any(np.isclose(lon, lon_check, atol=0.5))
6568

66-
if check1 and check2:
67-
all_lat.append(lat)
68-
all_long.append(lon)
69+
if check1 and check2:
70+
all_lat.append(lat)
71+
all_long.append(lon)
6972

70-
lon = []
71-
lat = []
73+
lon = []
74+
lat = []
7275

73-
if not all_lat or not all_long:
74-
raise ValueError(
75-
"No activities found within the specified location. Check lat_check/lon_check."
76-
)
76+
for activity in csvdata:
77+
csv_filename = activity
78+
csv_file = pd.read_csv(csv_filename)
7779

78-
all_lat = all_lat[0]
79-
all_long = all_long[0]
80+
for i in range(len(csv_file)):
81+
lat.append(csv_file["position_lat"][i])
82+
lon.append(csv_file["position_long"][i])
8083

81-
central_long = sum(all_long) / len(all_long)
82-
central_lat = sum(all_lat) / len(all_lat)
84+
check1 = np.any(np.isclose(lat, lat_check, atol=0.5))
85+
check2 = np.any(np.isclose(lon, lon_check, atol=0.5))
8386

84-
print("Initializing map")
85-
m = folium.Map(
86-
location=[central_lat, central_long], tiles="Stamen Toner", zoom_start=14.2
87-
)
87+
if check1 and check2:
88+
all_lat.append(lat)
89+
all_long.append(lon)
8890

89-
print("Plotting gpx data")
91+
lon = []
92+
lat = []
9093

91-
for activity in data:
92-
gpx_filename = activity
93-
with open(gpx_filename, "r") as gpx_file:
94-
gpx = gpxpy.parse(gpx_file)
94+
if not all_lat or not all_long:
95+
raise ValueError(
96+
"No activities found within the specified location. Check lat_check/lon_check."
97+
)
9598

96-
for track in gpx.tracks:
97-
for segment in track.segments:
98-
for point in segment.points:
99-
lat.append(point.latitude)
100-
lon.append(point.longitude)
99+
all_lat = all_lat[0]
100+
all_long = all_long[0]
101101

102-
points = list(zip(lat, lon))
102+
central_long = sum(all_long) / len(all_long)
103+
central_lat = sum(all_lat) / len(all_lat)
103104

104-
folium.PolyLine(points, color="red", weight=2.5, opacity=0.5).add_to(m)
105-
lat = []
106-
lon = []
105+
print("Initializing map")
106+
m = folium.Map(
107+
location=[central_lat, central_long], tiles="Stamen Toner", zoom_start=14.2
108+
)
107109

108-
print("Plotting csv data")
109-
color = "red"
110-
hr = []
111-
for activity in csvdata:
112-
csv_filename = activity
113-
csv_file = pd.read_csv(csv_filename)
114-
for i in range(len(csv_file)):
115-
lat.append(csv_file["position_lat"][i])
116-
lon.append(csv_file["position_long"][i])
117-
if "heart_rate" in csv_file.columns:
118-
hr.append(csv_file["heart_rate"][i])
119-
points = list(zip(lat, lon))
120-
121-
folium.PolyLine(points, color=color, weight=2.5, opacity=0.5).add_to(m)
122-
lat = []
123-
lon = []
124-
hr = []
110+
print("Plotting gpx data")
125111

126-
m.save("heatmap.html")
112+
for activity in gpx_files:
113+
gpx_filename = activity
114+
with open(gpx_filename, "r") as gpx_file:
115+
gpx = gpxpy.parse(gpx_file)
116+
117+
for track in gpx.tracks:
118+
for segment in track.segments:
119+
for point in segment.points:
120+
lat.append(point.latitude)
121+
lon.append(point.longitude)
122+
123+
points = list(zip(lat, lon))
124+
125+
folium.PolyLine(points, color="red", weight=2.5, opacity=0.5).add_to(m)
126+
lat = []
127+
lon = []
128+
129+
print("Plotting csv data")
130+
color = "red"
131+
hr = []
132+
for activity in csvdata:
133+
csv_filename = activity
134+
csv_file = pd.read_csv(csv_filename)
135+
for i in range(len(csv_file)):
136+
lat.append(csv_file["position_lat"][i])
137+
lon.append(csv_file["position_long"][i])
138+
if "heart_rate" in csv_file.columns:
139+
hr.append(csv_file["heart_rate"][i])
140+
points = list(zip(lat, lon))
141+
142+
folium.PolyLine(points, color=color, weight=2.5, opacity=0.5).add_to(m)
143+
lat = []
144+
lon = []
145+
hr = []
146+
147+
m.save("heatmap.html")
148+
149+
150+
if __name__ == "__main__":
151+
main()

‎simple_heatmap.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def parse_args() -> argparse.Namespace:
2525

2626
def main():
2727
args = parse_args()
28-
28+
2929
gpx_list = glob.glob(args.dir + "/*.gpx")
3030

3131
fig = plt.figure(facecolor="0.05")

0 commit comments

Comments
 (0)