@@ -62,9 +62,33 @@ def _broadcast_time_and_space(times: np.ndarray, lons: np.ndarray) -> tuple[np.n
62
62
63
63
return np .broadcast_arrays (times [..., None ], lons )
64
64
65
+ def extract_lat_lon (geometry : Union [SpatialGeometry , GeoSeries ]) -> SpatialGeometry :
66
+ """
67
+ Extract the SpatialGeometry from a RasterGeometry or GeoSeries.
68
+
69
+ Parameters
70
+ ----------
71
+ geometry : SpatialGeometry or GeoSeries
72
+ The geometry object to extract from.
73
+
74
+ Returns
75
+ -------
76
+ SpatialGeometry
77
+ The extracted SpatialGeometry.
78
+ """
79
+ if isinstance (geometry , SpatialGeometry ):
80
+ lat = geometry .lat
81
+ lon = geometry .lon
82
+ elif isinstance (geometry , GeoSeries ):
83
+ lat = geometry .y
84
+ lon = geometry .x
85
+ else :
86
+ raise ValueError ("geometry must be SpatialGeometry or GeoSeries" )
87
+ return lat , lon
88
+
65
89
def calculate_solar_hour_of_day (
66
90
time_UTC : Union [datetime , str , list , np .ndarray ],
67
- geometry : SpatialGeometry = None ,
91
+ geometry : Union [ SpatialGeometry , GeoSeries ] = None ,
68
92
lat : Union [np .ndarray , float ] = None ,
69
93
lon : Union [np .ndarray , float ] = None
70
94
) -> np .ndarray :
@@ -93,17 +117,17 @@ def calculate_solar_hour_of_day(
93
117
"""
94
118
times = _parse_time (time_UTC )
95
119
96
- if geometry is not None :
97
- lon = geometry .lon
98
- elif lon is not None :
99
- lon = np .asarray (lon )
120
+ if lat is None or lon is None and geometry is not None :
121
+ lat , lon = extract_lat_lon (geometry )
122
+
123
+ times = np .asarray (times )
124
+ lon = np .asarray (lon )
125
+ if times .ndim == 1 and lon .ndim == 1 and times .shape == lon .shape :
126
+ times_b = times
127
+ lons_b = lon
100
128
else :
101
- raise ValueError ('Must provide either spatial or lon.' )
102
-
103
- # Broadcast times and lons
104
- times_b , lons_b = _broadcast_time_and_space (times , lon )
129
+ times_b , lons_b = _broadcast_time_and_space (times , lon )
105
130
106
- # Calculate hour_UTC
107
131
hour_UTC = (
108
132
times_b .astype ('datetime64[h]' ).astype (int ) % 24
109
133
+ (times_b .astype ('datetime64[m]' ).astype (int ) % 60 ) / 60
@@ -119,7 +143,7 @@ def calculate_solar_hour_of_day(
119
143
120
144
def calculate_solar_day_of_year (
121
145
time_UTC : Union [datetime , str , list , np .ndarray ],
122
- geometry : SpatialGeometry = None ,
146
+ geometry : Union [ SpatialGeometry , GeoSeries ] = None ,
123
147
lat : Union [np .ndarray , float ] = None ,
124
148
lon : Union [np .ndarray , float ] = None
125
149
) -> np .ndarray :
@@ -148,20 +172,23 @@ def calculate_solar_day_of_year(
148
172
"""
149
173
times = _parse_time (time_UTC )
150
174
151
- # If latitude is not provided, try to extract from geometry
152
- if lat is None and isinstance (geometry , SpatialGeometry ):
153
- lat = geometry .lat
154
- elif lat is None and isinstance (geometry , GeoSeries ):
155
- lat = geometry .y
156
- elif lat is None :
157
- raise ValueError ("no latitude provided" )
158
-
159
- if lon is None and isinstance (geometry , SpatialGeometry ):
160
- lon = geometry .lon
161
- elif lon is None and isinstance (geometry , GeoSeries ):
162
- lon = geometry .x
163
- elif lon is None :
164
- raise ValueError ("no longitude provided" )
175
+ # # If latitude is not provided, try to extract from geometry
176
+ # if lat is None and isinstance(geometry, SpatialGeometry):
177
+ # lat = geometry.lat
178
+ # elif lat is None and isinstance(geometry, GeoSeries):
179
+ # lat = geometry.y
180
+ # elif lat is None:
181
+ # raise ValueError("no latitude provided")
182
+
183
+ # if lon is None and isinstance(geometry, SpatialGeometry):
184
+ # lon = geometry.lon
185
+ # elif lon is None and isinstance(geometry, GeoSeries):
186
+ # lon = geometry.x
187
+ # elif lon is None:
188
+ # raise ValueError("no longitude provided")
189
+
190
+ if lat is None or lon is None and geometry is not None :
191
+ lat , lon = extract_lat_lon (geometry )
165
192
166
193
# Handle 1D time and lon inputs of the same length: pair element-wise
167
194
times = np .asarray (times )
0 commit comments