-
Notifications
You must be signed in to change notification settings - Fork 251
geo
Malik Doole edited this page Sep 26, 2019
·
5 revisions
The geo.py module is a BlueSky tool that defines a set of standard geographic functions and constants for coding in BlueSky.
Some standard geographic functions available include:
- Calculating the earths radius with the WGS'84 geoid definition.
...
def rwgs84(latd):
""" Calculate the earths radius with WGS'84 geoid definition
In: lat [deg] (latitude)
Out: R [m] (earth radius) """
lat = np.radians(latd)
a = 6378137.0 # [m] Major semi-axis WGS-84
b = 6356752.314245 # [m] Minor semi-axis WGS-84
coslat = np.cos(lat)
sinlat = np.sin(lat)
an = a * a * coslat
bn = b * b * sinlat
ad = a * coslat
bd = b * sinlat
# Calculate radius in meters
r = np.sqrt((an * an + bn * bn) / (ad * ad + bd * bd))
return r
...
- Calculating the bearing and distance, using WGS'84.
...
def qdrdist(latd1, lond1, latd2, lond2):
""" Calculate bearing and distance, using WGS'84
In:
latd1,lond1 en latd2, lond2 [deg] :positions 1 & 2
Out:
qdr [deg] = heading from 1 to 2
d [nm] = distance from 1 to 2 in nm """
# Haversine with average radius
# Check for hemisphere crossing,
# when simple average would not work
# res1 for same hemisphere
res1 = rwgs84(0.5 * (latd1 + latd2))
# res2 :different hemisphere
a = 6378137.0 # [m] Major semi-axis WGS-84
r1 = rwgs84(latd1)
r2 = rwgs84(latd2)
res2 = 0.5 * (abs(latd1) * (r1 + a) + abs(latd2) * (r2 + a)) / \
(abs(latd1) + abs(latd2))
# Condition
sw = (latd1 * latd2 >= 0.)
r = sw * res1 + (1 - sw) * res2
# Convert to radians
lat1 = np.radians(latd1)
lon1 = np.radians(lond1)
lat2 = np.radians(latd2)
lon2 = np.radians(lond2)
sin1 = np.sin(0.5 * (lat2 - lat1))
sin2 = np.sin(0.5 * (lon2 - lon1))
coslat1 = np.cos(lat1)
coslat2 = np.cos(lat2)
root = sin1 * sin1 + coslat1 * coslat2 * sin2 * sin2
d = 2.0 * r * np.arctan2(np.sqrt(root) , np.sqrt(1.0 - root))
# d =2.*r*np.arcsin(np.sqrt(sin1*sin1 + coslat1*coslat2*sin2*sin2))
# Bearing from Ref. http://www.movable-type.co.uk/scripts/latlong.html
qdr = np.degrees(np.arctan2(np.sin(lon2 - lon1) * coslat2,
coslat1 * np.sin(lat2) - np.sin(lat1) * coslat2 * np.cos(lon2 - lon1)))
return qdr, d/nm
...