Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import folium
- import sys
- from geopy.distance import geodesic
- from xml.etree import ElementTree as ET
- from math import atan, degrees
- def parse_gpx(file_path):
- ns = {'default': 'http://www.topografix.com/GPX/1/1'}
- tree = ET.parse(file_path)
- root = tree.getroot()
- trkpts = root.findall('.//default:trkpt', ns)
- data = []
- for pt in trkpts:
- lat = float(pt.attrib['lat'])
- lon = float(pt.attrib['lon'])
- ele = float(pt.find('default:ele', ns).text)
- data.append((lat, lon, ele))
- return data
- def calculate_gradients(data):
- segments = []
- for i in range(1, len(data)):
- segment = {
- 'start': data[i-1][:2],
- 'end': data[i][:2],
- 'gradient': degrees(atan((data[i][2] - data[i-1][2]) / geodesic(data[i-1][:2], data[i][:2]).meters))
- }
- segments.append(segment)
- return segments
- def add_segments_to_map(segments, map_obj):
- for segment in segments:
- color = 'red' if abs(segment['gradient']) > 30 else ('yellow' if abs(segment['gradient']) > 15 else 'green')
- folium.PolyLine([segment['start'], segment['end']], color=color, weight=5).add_to(map_obj)
- if __name__ == "__main__":
- if len(sys.argv) < 2:
- print("Usage: python main.py <path_to_gpx_file>")
- sys.exit(1)
- gpx_file_path = sys.argv[1]
- data = parse_gpx(gpx_file_path)
- segments = calculate_gradients(data)
- # 地図の中心を最初のポイントに設定
- map_center = data[0][:2]
- map_obj = folium.Map(location=map_center, zoom_start=14)
- add_segments_to_map(segments, map_obj)
- # 地図をHTMLファイルとして保存
- map_obj.save('map_with_gradients.html')
- print("Map with gradients saved to map_with_gradients.html")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement