#!/usr/bin/env python
u"""
crs.py
Written by Tyler Sutterley (05/2024)
Coordinates Reference System (CRS) utilities
PYTHON DEPENDENCIES:
pyproj: Python interface to PROJ library
https://pypi.org/project/pyproj/
https://pyproj4.github.io/pyproj/
UPDATE HISTORY:
Updated 05/2024: use wrapper to importlib for optional dependencies
Written 10/2023
"""
import logging
from grounding_zones.utilities import import_dependency
# attempt imports
pyproj = import_dependency('pyproj')
# Topex/Poseidon Ellipsoid in ITRF2008 to WGS84 Ellipsoid in ITRF2014
[docs]
def tp_itrf2008_to_wgs84_itrf2014():
"""``pyproj`` transform for T/P Ellipsoid in ITRF2008 to WGS84 Ellipsoid in ITRF2014"""
pipeline = """+proj=pipeline
+step +proj=unitconvert +xy_in=deg +z_in=m +xy_out=rad +z_out=m
+step +proj=cart +a=6378136.3 +rf=298.257
+step +proj=helmert +x=-0.0016 +y=-0.0019 +z=-0.0024 +rx=0 +ry=0 +rz=0 +s=2e-05
+dx=0 +dy=0 +dz=0.0001 +drx=0 +dry=0 +drz=0 +ds=-3e-05
+t_epoch=2010 +convention=position_vector
+step +inv +proj=cart +ellps=WGS84
+step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m"""
return pyproj.Transformer.from_pipeline(pipeline)
# Topex/Poseidon Ellipsoid in ITRF2008 to WGS84 Ellipsoid in ITRF2020
[docs]
def tp_itrf2008_to_wgs84_itrf2020():
"""``pyproj`` transform for T/P Ellipsoid in ITRF2008 to WGS84 Ellipsoid in ITRF2020"""
pipeline = """+proj=pipeline
+step +proj=unitconvert +xy_in=deg +z_in=m +xy_out=rad +z_out=m
+step +proj=cart +a=6378136.3 +rf=298.257
+step +proj=helmert +x=-0.0002 +y=-0.001 +z=-0.0033 +rx=0 +ry=0 +rz=0 +s=0.00029
+dx=0 +dy=0.0001 +dz=-0.0001 +drx=0 +dry=0 +drz=0 +ds=-3e-05
+t_epoch=2015 +convention=position_vector
+step +inv +proj=cart +ellps=WGS84
+step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m"""
return pyproj.Transformer.from_pipeline(pipeline)
# WGS84 Ellipsoid in ITRF88 to WGS84 Ellipsoid in ITRF2020
[docs]
def wgs84_itrf88_to_wgs84_itrf2020():
"""``pyproj`` transform for WGS84 Ellipsoid in ITRF88 to WGS84 Ellipsoid in ITRF2020"""
pipeline = """+proj=pipeline
+step +proj=unitconvert +xy_in=deg +z_in=m +xy_out=rad +z_out=m
+step +proj=cart +ellps=WGS84
+step +proj=helmert +x=-0.0245 +y=0.0039 +z=0.1699 +rx=-0.0001 +ry=0 +rz=-0.00036 +s=-0.01147
+dx=-0.0001 +dy=0.0006 +dz=0.0031 +drx=0 +dry=0 +drz=-2e-05 +ds=-0.00012
+t_epoch=2015 +convention=position_vector
+step +inv +proj=cart +ellps=WGS84
+step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m"""
return pyproj.Transformer.from_pipeline(pipeline)
# WGS84 Ellipsoid in ITRF89 to WGS84 Ellipsoid in ITRF2020
[docs]
def wgs84_itrf89_to_wgs84_itrf2020():
"""``pyproj`` transform for WGS84 Ellipsoid in ITRF89 to WGS84 Ellipsoid in ITRF2020"""
pipeline = """+proj=pipeline
+step +proj=unitconvert +xy_in=deg +z_in=m +xy_out=rad +z_out=m
+step +proj=cart +ellps=WGS84
+step +proj=helmert +x=-0.0295 +y=-0.0321 +z=0.1459 +rx=0 +ry=0 +rz=-0.00036 +s=-0.00837
+dx=-0.0001 +dy=0.0006 +dz=0.0031 +drx=0 +dry=0 +drz=-2e-05 +ds=-0.00012
+t_epoch=2015 +convention=position_vector
+step +inv +proj=cart +ellps=WGS84
+step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m"""
return pyproj.Transformer.from_pipeline(pipeline)
# WGS84 Ellipsoid in ITRF92 to WGS84 Ellipsoid in ITRF2020
[docs]
def wgs84_itrf92_to_wgs84_itrf2020():
"""``pyproj`` transform for WGS84 Ellipsoid in ITRF92 to WGS84 Ellipsoid in ITRF2020"""
pipeline = """+proj=pipeline
+step +proj=unitconvert +xy_in=deg +z_in=m +xy_out=rad +z_out=m
+step +proj=cart +ellps=WGS84
+step +proj=helmert +x=-0.0145 +y=0.0019 +z=0.0859 +rx=0 +ry=0 +rz=-0.00036 +s=-0.00327
+dx=-0.0001 +dy=0.0006 +dz=0.0031 +drx=0 +dry=0 +drz=-2e-05 +ds=-0.00012
+t_epoch=2015 +convention=position_vector
+step +inv +proj=cart +ellps=WGS84
+step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m"""
return pyproj.Transformer.from_pipeline(pipeline)
# WGS84 Ellipsoid in ITRF93 to WGS84 Ellipsoid in ITRF2020
[docs]
def wgs84_itrf93_to_wgs84_itrf2020():
"""``pyproj`` transform for WGS84 Ellipsoid in ITRF93 to WGS84 Ellipsoid in ITRF2020"""
pipeline = """+proj=pipeline
+step +proj=unitconvert +xy_in=deg +z_in=m +xy_out=rad +z_out=m
+step +proj=cart +ellps=WGS84
+step +proj=helmert +x=0.0658 +y=-0.0019 +z=0.0713 +rx=0.00336 +ry=0.00433 +rz=-0.00075 +s=-0.00447
+dx=0.0028 +dy=0.0002 +dz=0.0023 +drx=0.00011 +dry=0.00019 +drz=-7e-05 +ds=-0.00012
+t_epoch=2015 +convention=position_vector
+step +inv +proj=cart +ellps=WGS84
+step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m"""
return pyproj.Transformer.from_pipeline(pipeline)
# WGS84 Ellipsoid in ITRF94 to WGS84 Ellipsoid in ITRF2020
[docs]
def wgs84_itrf94_to_wgs84_itrf2020():
"""``pyproj`` transform for WGS84 Ellipsoid in ITRF94 to WGS84 Ellipsoid in ITRF2020"""
pipeline = """+proj=pipeline
+step +proj=unitconvert +xy_in=deg +z_in=m +xy_out=rad +z_out=m
+step +proj=cart +ellps=WGS84
+step +proj=helmert +x=-0.0065 +y=0.0039 +z=0.0779 +rx=0 +ry=0 +rz=-0.00036 +s=-0.00398
+dx=-0.0001 +dy=0.0006 +dz=0.0031 +drx=0 +dry=0 +drz=-2e-05 +ds=-0.00012
+t_epoch=2015 +convention=position_vector
+step +inv +proj=cart +ellps=WGS84
+step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m"""
return pyproj.Transformer.from_pipeline(pipeline)
# WGS84 Ellipsoid in ITRF96 to WGS84 Ellipsoid in ITRF2020
[docs]
def wgs84_itrf96_to_wgs84_itrf2020():
"""``pyproj`` transform for WGS84 Ellipsoid in ITRF96 to WGS84 Ellipsoid in ITRF2020"""
pipeline = """+proj=pipeline
+step +proj=unitconvert +xy_in=deg +z_in=m +xy_out=rad +z_out=m
+step +proj=cart +ellps=WGS84
+step +proj=helmert +x=-0.0065 +y=0.0039 +z=0.0779 +rx=0 +ry=0 +rz=-0.00036 +s=-0.00398
+dx=-0.0001 +dy=0.0006 +dz=0.0031 +drx=0 +dry=0 +drz=-2e-05 +ds=-0.00012
+t_epoch=2015 +convention=position_vector
+step +inv +proj=cart +ellps=WGS84
+step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m"""
return pyproj.Transformer.from_pipeline(pipeline)
# WGS84 Ellipsoid in ITRF97 to WGS84 Ellipsoid in ITRF2020
[docs]
def wgs84_itrf97_to_wgs84_itrf2020():
"""``pyproj`` transform for WGS84 Ellipsoid in ITRF97 to WGS84 Ellipsoid in ITRF2020"""
pipeline = """+proj=pipeline
+step +proj=unitconvert +xy_in=deg +z_in=m +xy_out=rad +z_out=m
+step +proj=cart +ellps=WGS84
+step +proj=helmert +x=-0.0065 +y=0.0039 +z=0.0779 +rx=0 +ry=0 +rz=-0.00036 +s=-0.00398
+dx=-0.0001 +dy=0.0006 +dz=0.0031 +drx=0 +dry=0 +drz=-2e-05 +ds=-0.00012
+t_epoch=2015 +convention=position_vector
+step +inv +proj=cart +ellps=WGS84
+step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m"""
return pyproj.Transformer.from_pipeline(pipeline)
# WGS84 Ellipsoid in ITRF2000 to WGS84 Ellipsoid in ITRF2020
[docs]
def wgs84_itrf2000_to_wgs84_itrf2020():
"""``pyproj`` transform for WGS84 Ellipsoid in ITRF2000 to WGS84 Ellipsoid in ITRF2020"""
pipeline = """+proj=pipeline
+step +proj=unitconvert +xy_in=deg +z_in=m +xy_out=rad +z_out=m
+step +proj=cart +ellps=WGS84
+step +proj=helmert +x=0.0002 +y=-0.0008 +z=0.0342 +rx=0 +ry=0 +rz=0 +s=-0.00225
+dx=-0.0001 +dy=0 +dz=0.0017 +drx=0 +dry=0 +drz=0 +ds=-0.00011
+t_epoch=2015 +convention=position_vector
+step +inv +proj=cart +ellps=WGS84
+step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m"""
return pyproj.Transformer.from_pipeline(pipeline)
# WGS84 Ellipsoid in ITRF2005 to WGS84 Ellipsoid in ITRF2020
[docs]
def wgs84_itrf2005_to_wgs84_itrf2020():
"""``pyproj`` transform for WGS84 Ellipsoid in ITRF2005 to WGS84 Ellipsoid in ITRF2020"""
pipeline = """+proj=pipeline
+step +proj=unitconvert +xy_in=deg +z_in=m +xy_out=rad +z_out=m
+step +proj=cart +ellps=WGS84
+step +proj=helmert +x=-0.0027 +y=-0.0001 +z=0.0014 +rx=0 +ry=0 +rz=0 +s=-0.00065
+dx=-0.0003 +dy=0.0001 +dz=-0.0001 +drx=0 +dry=0 +drz=0 +ds=-3e-05
+t_epoch=2015 +convention=position_vector
+step +inv +proj=cart +ellps=WGS84
+step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m"""
return pyproj.Transformer.from_pipeline(pipeline)
# WGS84 Ellipsoid in ITRF2008 to WGS84 Ellipsoid in ITRF2020
[docs]
def wgs84_itrf2008_to_wgs84_itrf2020():
"""``pyproj`` transform for WGS84 Ellipsoid in ITRF2008 to WGS84 Ellipsoid in ITRF2020"""
pipeline = """+proj=pipeline
+step +proj=unitconvert +xy_in=deg +z_in=m +xy_out=rad +z_out=m
+step +proj=cart +ellps=WGS84
+step +proj=helmert +x=-0.0002 +y=-0.001 +z=-0.0033 +rx=0 +ry=0 +rz=0 +s=0.00029
+dx=0 +dy=0.0001 +dz=-0.0001 +drx=0 +dry=0 +drz=0 +ds=-3e-05
+t_epoch=2015 +convention=position_vector
+step +inv +proj=cart +ellps=WGS84
+step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m"""
return pyproj.Transformer.from_pipeline(pipeline)
# WGS84 Ellipsoid in ITRF2014 to WGS84 Ellipsoid in ITRF2020
[docs]
def wgs84_itrf2014_to_wgs84_itrf2020():
"""``pyproj`` transform for WGS84 Ellipsoid in ITRF2014 to WGS84 Ellipsoid in ITRF2020"""
pipeline = """+proj=pipeline
+step +proj=unitconvert +xy_in=deg +z_in=m +xy_out=rad +z_out=m
+step +proj=cart +ellps=WGS84
+step +proj=helmert +x=0.0014 +y=0.0009 +z=-0.0014 +rx=0 +ry=0 +rz=0 +s=0.00042
+dx=0 +dy=0.0001 +dz=-0.0002 +drx=0 +dry=0 +drz=0 +ds=0
+t_epoch=2015 +convention=position_vector
+step +inv +proj=cart +ellps=WGS84
+step +proj=unitconvert +xy_in=rad +z_in=m +xy_out=deg +z_out=m"""
return pyproj.Transformer.from_pipeline(pipeline)
# PURPOSE: return WGS84 transform for a given ITRF
# PURPOSE: return a pyproj transform direction
[docs]
def get_direction(BF):
"""
Get a pyproj transform direction
Parameters
----------
BF: str
direction of transform (Forward or Backward)
"""
if BF.lower() in ('f','forward',):
return pyproj.enums.TransformDirection.FORWARD
elif BF.lower() in ('b','backward','i','inverse',):
return pyproj.enums.TransformDirection.INVERSE
else:
raise ValueError(f'Invalid direction: {BF}')