nakas commited on
Commit
5e7a2cb
·
1 Parent(s): 06d238a
Files changed (3) hide show
  1. .DS_Store +0 -0
  2. __pycache__/app.cpython-313.pyc +0 -0
  3. app.py +58 -77
.DS_Store ADDED
Binary file (6.15 kB). View file
 
__pycache__/app.cpython-313.pyc ADDED
Binary file (22 kB). View file
 
app.py CHANGED
@@ -28,91 +28,72 @@ class RainViewerMap:
28
  active_storms = []
29
  error_messages = []
30
 
31
- # Try multiple approaches to get hurricane data
32
  try:
33
- # Approach 1: Try the simplified hurricane data endpoint
34
- simple_url = "https://www.nhc.noaa.gov/CurrentStorms.json"
35
- try:
36
- response = requests.get(simple_url, timeout=10)
37
- if response.status_code == 200:
38
- storms_data = response.json()
39
- for storm in storms_data.get('activeStorms', []):
40
- active_storms.append({
41
- 'source': 'NHC CurrentStorms',
42
- 'data': storm,
43
- 'type': 'current_storms'
44
- })
45
- except Exception as e:
46
- error_messages.append(f"CurrentStorms.json failed: {e}")
47
 
48
- # Approach 2: Try NOAA GIS layers for specific storm data
49
- if not active_storms:
50
- layers_url = f"{self.nhc_api_base}/layers?f=json"
 
 
 
51
  try:
52
- layers_response = requests.get(layers_url, timeout=15)
53
- if layers_response.status_code == 200:
54
- layers_data = layers_response.json()
55
-
56
- # Look for Atlantic storms (AT1-AT5) forecast points
57
- for layer in layers_data.get('layers', []):
58
- layer_name = layer.get('name', '').lower()
59
- layer_id = layer.get('id')
 
 
 
 
 
 
 
 
 
 
 
60
 
61
- if ('at1' in layer_name or 'at2' in layer_name or 'at3' in layer_name) and 'forecast points' in layer_name:
62
- query_url = f"{self.nhc_api_base}/{layer_id}/query"
63
- params = {
64
- 'where': '1=1',
65
- 'outFields': '*',
66
- 'f': 'geojson',
67
- 'returnGeometry': 'true'
68
- }
69
-
70
- try:
71
- query_response = requests.get(query_url, params=params, timeout=15)
72
- if query_response.status_code == 200:
73
- geojson_data = query_response.json()
74
- if geojson_data.get('features'):
75
- active_storms.append({
76
- 'source': 'NOAA GIS',
77
- 'layer_name': layer.get('name', ''),
78
- 'layer_id': layer_id,
79
- 'geojson': geojson_data,
80
- 'type': 'gis_layer'
81
- })
82
- except Exception as e:
83
- error_messages.append(f"Layer {layer_id} query failed: {e}")
84
  except Exception as e:
85
- error_messages.append(f"Layers API failed: {e}")
86
 
87
- # Approach 3: Add sample data if no real data available (for testing)
88
  if not active_storms:
89
- sample_storm = {
90
- 'source': 'Sample Data',
91
- 'type': 'sample',
92
- 'geojson': {
93
- 'type': 'FeatureCollection',
94
- 'features': [
95
- {
96
- 'type': 'Feature',
97
- 'geometry': {
98
- 'type': 'Point',
99
- 'coordinates': [-80.0, 26.0]
100
- },
101
- 'properties': {
102
- 'STORMNAME': 'Sample Hurricane',
103
- 'STORMTYPE': 'Hurricane',
104
- 'MAXWIND': '75',
105
- 'MSLP': '980',
106
- 'FHOUR': 'Current'
107
- }
108
- }
109
- ]
110
- }
111
- }
112
- active_storms.append(sample_storm)
113
- error_messages.append("No real storm data available, showing sample data")
114
 
115
- # Store error messages for debugging
116
  self.storm_cache['errors'] = error_messages
117
  self.storm_cache['last_update'] = datetime.now().isoformat()
118
 
 
28
  active_storms = []
29
  error_messages = []
30
 
 
31
  try:
32
+ # Get specific Eastern Pacific storms (EP1-EP5) and Atlantic storms (AT1-AT5)
33
+ storm_layers = [
34
+ {'name': 'EP1', 'forecast_points_id': 136, 'forecast_track_id': 137, 'forecast_cone_id': 138},
35
+ {'name': 'EP2', 'forecast_points_id': 154, 'forecast_track_id': 155, 'forecast_cone_id': 156},
36
+ {'name': 'AT1', 'forecast_points_id': 6, 'forecast_track_id': 7, 'forecast_cone_id': 8},
37
+ {'name': 'AT2', 'forecast_points_id': 24, 'forecast_track_id': 25, 'forecast_cone_id': 26},
38
+ {'name': 'AT3', 'forecast_points_id': 42, 'forecast_track_id': 43, 'forecast_cone_id': 44}
39
+ ]
 
 
 
 
 
 
40
 
41
+ for storm_info in storm_layers:
42
+ storm_name = storm_info['name']
43
+ points_id = storm_info['forecast_points_id']
44
+ track_id = storm_info['forecast_track_id']
45
+ cone_id = storm_info['forecast_cone_id']
46
+
47
  try:
48
+ # Get forecast points
49
+ points_url = f"{self.nhc_api_base}/{points_id}/query"
50
+ points_params = {
51
+ 'where': '1=1',
52
+ 'outFields': '*',
53
+ 'f': 'geojson',
54
+ 'returnGeometry': 'true'
55
+ }
56
+
57
+ points_response = requests.get(points_url, params=points_params, timeout=15)
58
+ if points_response.status_code == 200:
59
+ points_data = points_response.json()
60
+ if points_data.get('features'):
61
+ # Get track data
62
+ track_url = f"{self.nhc_api_base}/{track_id}/query"
63
+ track_response = requests.get(track_url, params=points_params, timeout=15)
64
+ track_data = None
65
+ if track_response.status_code == 200:
66
+ track_data = track_response.json()
67
 
68
+ # Get cone data
69
+ cone_url = f"{self.nhc_api_base}/{cone_id}/query"
70
+ cone_response = requests.get(cone_url, params=points_params, timeout=15)
71
+ cone_data = None
72
+ if cone_response.status_code == 200:
73
+ cone_data = cone_response.json()
74
+
75
+ active_storms.append({
76
+ 'source': f'NOAA NHC {storm_name}',
77
+ 'storm_id': storm_name,
78
+ 'forecast_points': points_data,
79
+ 'forecast_track': track_data,
80
+ 'forecast_cone': cone_data,
81
+ 'type': 'nhc_storm'
82
+ })
83
+
84
+ # Get storm name from first feature for logging
85
+ first_feature = points_data['features'][0]
86
+ storm_actual_name = first_feature['properties'].get('stormname', storm_name)
87
+ error_messages.append(f"Successfully loaded {storm_actual_name} ({storm_name})")
88
+
 
 
89
  except Exception as e:
90
+ error_messages.append(f"Error fetching {storm_name}: {e}")
91
 
92
+ # If no real storms found, add informational message
93
  if not active_storms:
94
+ error_messages.append("No active storms found - this could mean no storms are currently active")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
95
 
96
+ # Store debug info
97
  self.storm_cache['errors'] = error_messages
98
  self.storm_cache['last_update'] = datetime.now().isoformat()
99