@@ -138,15 +138,20 @@ def ecef2geodetic(
138
138
# eqn. 4a
139
139
u = sqrt (0.5 * (r ** 2 - E ** 2 ) + 0.5 * hypot (r ** 2 - E ** 2 , 2 * E * z ))
140
140
141
- Q = hypot (x , y )
141
+ hxy = hypot (x , y )
142
142
143
143
huE = hypot (u , E )
144
144
145
145
# eqn. 4b
146
146
try :
147
147
Beta = empty_like (r )
148
- ibad = isclose (u , 0 ) | isclose (Q , 0 )
149
- Beta [~ ibad ] = atan (huE [~ ibad ] / u [~ ibad ] * z [~ ibad ] / Q [~ ibad ])
148
+ ibad = isclose (u , 0 ) | isclose (hxy , 0 )
149
+ Beta [~ ibad ] = atan (huE [~ ibad ] / u [~ ibad ] * z [~ ibad ] / hxy [~ ibad ])
150
+ # eqn. 13
151
+ Beta [~ ibad ] += (
152
+ (ell .semiminor_axis * u [~ ibad ] - ell .semimajor_axis * huE [~ ibad ] + E ** 2 )
153
+ * sin (Beta [~ ibad ])
154
+ ) / (ell .semimajor_axis * huE [~ ibad ] * 1 / cos (Beta [~ ibad ]) - E ** 2 * cos (Beta [~ ibad ]))
150
155
iz = ibad & isclose (z , 0 )
151
156
i1 = ibad & ~ iz & (z > 0 )
152
157
i2 = ibad & ~ iz & ~ i1
@@ -158,7 +163,14 @@ def ecef2geodetic(
158
163
try :
159
164
with warnings .catch_warnings (record = True ):
160
165
warnings .simplefilter ("error" )
161
- Beta = atan (huE / u * z / Q )
166
+ Beta = atan (huE / u * z / hxy )
167
+ # eqn. 13
168
+ Beta += (
169
+ (ell .semiminor_axis * u - ell .semimajor_axis * huE + E ** 2 ) * sin (Beta )
170
+ ) / (
171
+ ell .semimajor_axis * huE * 1 / cos (Beta )
172
+ - E ** 2 * cos (Beta )
173
+ )
162
174
except (ArithmeticError , RuntimeWarning ):
163
175
if isclose (z , 0 ):
164
176
Beta = 0
@@ -167,20 +179,13 @@ def ecef2geodetic(
167
179
else :
168
180
Beta = - pi / 2
169
181
170
- # eqn. 13
171
- dBeta = ((ell .semiminor_axis * u - ell .semimajor_axis * huE + E ** 2 ) * sin (Beta )) / (
172
- ell .semimajor_axis * huE * 1 / cos (Beta ) - E ** 2 * cos (Beta )
173
- )
174
-
175
- Beta += dBeta
176
-
177
182
# eqn. 4c
178
183
# %% final output
179
184
lat = atan (ell .semimajor_axis / ell .semiminor_axis * tan (Beta ))
180
185
181
186
try :
182
187
# patch latitude for float32 precision loss
183
- lim_pi2 = pi / 2 - finfo (dBeta .dtype ).eps
188
+ lim_pi2 = pi / 2 - finfo (Beta .dtype ).eps
184
189
lat = where (Beta >= lim_pi2 , pi / 2 , lat )
185
190
lat = where (Beta <= - lim_pi2 , - pi / 2 , lat )
186
191
except NameError :
@@ -197,7 +202,7 @@ def ecef2geodetic(
197
202
except NameError :
198
203
pass
199
204
200
- alt = hypot (z - ell .semiminor_axis * sin (Beta ), Q - ell .semimajor_axis * cosBeta )
205
+ alt = hypot (z - ell .semiminor_axis * sin (Beta ), hxy - ell .semimajor_axis * cosBeta )
201
206
202
207
# inside ellipsoid?
203
208
inside = (
0 commit comments