Advertisement
Guest User

Untitled

a guest
Mar 3rd, 2024
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.79 KB | None | 0 0
  1. import folium
  2. import sys
  3. from geopy.distance import geodesic
  4. from xml.etree import ElementTree as ET
  5. from math import atan, degrees
  6.  
  7. def parse_gpx(file_path):
  8.     ns = {'default': 'http://www.topografix.com/GPX/1/1'}
  9.     tree = ET.parse(file_path)
  10.     root = tree.getroot()
  11.     trkpts = root.findall('.//default:trkpt', ns)
  12.     data = []
  13.     for pt in trkpts:
  14.         lat = float(pt.attrib['lat'])
  15.         lon = float(pt.attrib['lon'])
  16.         ele = float(pt.find('default:ele', ns).text)
  17.         data.append((lat, lon, ele))
  18.     return data
  19.  
  20. def calculate_gradients(data):
  21.     segments = []
  22.     for i in range(1, len(data)):
  23.         segment = {
  24.             'start': data[i-1][:2],
  25.             'end': data[i][:2],
  26.             'gradient': degrees(atan((data[i][2] - data[i-1][2]) / geodesic(data[i-1][:2], data[i][:2]).meters))
  27.         }
  28.         segments.append(segment)
  29.     return segments
  30.  
  31. def add_segments_to_map(segments, map_obj):
  32.     for segment in segments:
  33.         color = 'red' if abs(segment['gradient']) > 30 else ('yellow' if abs(segment['gradient']) > 15 else 'green')
  34.         folium.PolyLine([segment['start'], segment['end']], color=color, weight=5).add_to(map_obj)
  35.  
  36. if __name__ == "__main__":
  37.     if len(sys.argv) < 2:
  38.         print("Usage: python main.py <path_to_gpx_file>")
  39.         sys.exit(1)
  40.    
  41.     gpx_file_path = sys.argv[1]
  42.     data = parse_gpx(gpx_file_path)
  43.     segments = calculate_gradients(data)
  44.  
  45.     # 地図の中心を最初のポイントに設定
  46.     map_center = data[0][:2]
  47.     map_obj = folium.Map(location=map_center, zoom_start=14)
  48.  
  49.     add_segments_to_map(segments, map_obj)
  50.  
  51.     # 地図をHTMLファイルとして保存
  52.     map_obj.save('map_with_gradients.html')
  53.     print("Map with gradients saved to map_with_gradients.html")
  54.  
  55.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement