Source code for autocnet.transformation.spatial
import pyproj
import numpy as np
[docs]def og2oc(lon, lat, semi_major, semi_minor):
"""
Converts planetographic latitude to planetocentric latitude using pyproj pipeline.
Parameters
----------
lon : float
longitude 0 to 360 domain (in degrees)
lat : float
planetographic latitude (in degrees)
semi_major : float
Radius from the center of the body to the equator
semi_minor : float
Radius from the center of the body to the pole
Returns
-------
lon: float
longitude (in degrees)
lat: float
planetocentric latitude (in degrees)
"""
proj_str = f"""
+proj=pipeline
+step +proj=geoc +a={semi_major} +b={semi_minor} +lon_wrap=180 +xy_in=deg +xy_out=deg
"""
og2oc = pyproj.transformer.Transformer.from_pipeline(proj_str)
lon_oc, lat_oc = og2oc.transform(lon, lat, errcheck=True)
return lon_oc, lat_oc
[docs]def oc2og(lon, lat, semi_major, semi_minor):
"""
Converts planetocentric latitude to planetographic latitude using pyproj pipeline.
Parameters
----------
lon : float
longitude 0 to 360 domain (in degrees)
lat : float
planetocentric latitude (in degrees)
semi_major : float
Radius from the center of the body to the equator
semi_minor : float
Radius from the center of the body to the pole
Returns
-------
lon : float
longitude (in degrees)
lat : float
planetographic latitude (in degrees)
"""
proj_str = f"""
+proj=pipeline
+step +proj=geoc +a={semi_major} +b={semi_minor} +lon_wrap=180 +inv +xy_in=deg +xy_out=deg
"""
oc2og = pyproj.transformer.Transformer.from_pipeline(proj_str)
lon_og, lat_og = oc2og.transform(lon, lat, errcheck=True)
return lon_og, lat_og
[docs]def reproject(record, semi_major, semi_minor, source_proj, dest_proj, **kwargs):
"""
Thin wrapper around PyProj's Transform() function to transform 1 or more three-dimensional
point from one coordinate system to another. If converting between Cartesian
body-centered body-fixed (BCBF) coordinates and Longitude/Latitude/Altitude coordinates,
the values input for semi-major and semi-minor axes determine whether latitudes are
planetographic or planetocentric and determine the shape of the datum for altitudes.
If semi_major == semi_minor, then latitudes are interpreted/created as planetocentric
and altitudes are interpreted/created as referenced to a spherical datum.
If semi_major != semi_minor, then latitudes are interpreted/created as planetographic
and altitudes are interpreted/created as referenced to an ellipsoidal datum.
Parameters
----------
record : object
Pandas series object
semi_major : float
Radius from the center of the body to the equater
semi_minor : float
Radius from the pole to the center of mass
source_proj : str
Pyproj string that defines a projection space ie. 'geocent'
dest_proj : str
Pyproj string that defines a project space ie. 'latlon'
Returns
-------
: list
Transformed coordinates as y, x, z
"""
source_pyproj = pyproj.Proj(proj=source_proj, a=semi_major, b=semi_minor, lon_wrap=180)
dest_pyproj = pyproj.Proj(proj=dest_proj, a=semi_major, b=semi_minor, lon_wrap=180)
y, x, z = pyproj.transform(source_pyproj, dest_pyproj, record[0], record[1], record[2], **kwargs)
return y, x, z