I'm trying to transform (using pyproj) the same coordinates, first from WGS84, and then from NAD83(2011), and I'm getting the same result:

from pyproj import CRS, Transformer

from_wgs84_transformer = Transformer.from_crs(CRS("WGS84"), CRS("epsg:6415"), allow_ballpark=False)
from_nad83_transformer = Transformer.from_crs(CRS("NAD83(2011)"), CRS("epsg:6415"), allow_ballpark=False)
>>> from_wgs84_transformer.transform(41.15240653663834, -122.85890995637374)
(1927909.814711512, 702339.7864515218)

>>> from_nad83_transformer.transform(41.15240653663834, -122.85890995637374)
(1927909.814711512, 702339.7864515218)

Can someone explain why, and also how to fix the code?

  • I could not find any example about the usage as ` Transformer.from_crs(CRS("WGS84"),...`. Where did you find the documentation for that syntax?
    – user30184
    Commented Nov 21, 2023 at 7:56
  • How to you suggest to create the transformation? pyproj4.github.io/pyproj/stable/_modules/pyproj/…
    – paul
    Commented Nov 21, 2023 at 8:03
  • Do you have the transportation grids installed? pyproj4.github.io/pyproj/stable/transformation_grids.html
    – snowman2
    Commented Nov 21, 2023 at 13:51
  • One transformation/operation path could be 7666 which is wgs84(G1762) to ITRF2008 (null transformation) and then 7807, ITRF2008 to NAD83(2011) which is time-based so you need a data epoch or just use the base epoch of the transformation.
    – mkennedy
    Commented Nov 29, 2023 at 21:33
  • @mkennedy How can I make sure this is the correct path to take? btw, can you recommend a source (book/blog/etc) where I can learn all this stuff to its core?
    – paul
    Commented Dec 2, 2023 at 21:50

2 Answers 2


You get that result because for Proj NAD83(2011) and WGS 84 mean the same. You can get a full report by testing the transformation with Projinfo.

projinfo -s epsg:6318 -t epsg:4326

Candidate operations found: 1
Operation No. 1:

EPSG:9774, NAD83(2011) to WGS 84 (1), 2.0 m ...

PROJ string:
SCOPE["(null/copy) Approximation for medium and low accuracy
applications assuming equality between plate-fixed static 
and earth-fixed dynamic CRSs, ignoring static/dynamic CRS 
    REMARK["For many purposes NAD83(2011) can be considered
to be coincident with WGS 84. This approximation ignores 
the ~2.2m offset of NAD83 from the geocentre, the low 
accuracy of the WGS 84 ensemble and the application 
of tectonic plate motion to WGS 84 data."]]

Unfortunately I do not know which tools can handle the terms that Proj ignores.

  • 1
    They're not the same. NAD83(2011) is plate-fixed, while WGS 84 (and ITRFxx) is not. There's about 1-2 m difference between the 2 systems. That transformation has a 2 m accuracy because it's not taking the differences into account.
    – mkennedy
    Commented Nov 29, 2023 at 21:25
  • 1
    And for taking into account the differences also the epoch of the dynamic system should be known. It seems that Proj and GDAL has nowadays support for coordinate epoch gdal.org/user/coordinate_epoch.html.
    – user30184
    Commented Nov 30, 2023 at 6:54
  • @user30184 do you know how to do this in pyproj? I didn't find any reference to "coordinate epoch" in pyproj
    – paul
    Commented Dec 2, 2023 at 21:52
  • Maybe you could try for example EPSG:7665 instead of EPSG:4326. If I understand right it has the epoch included somehow.
    – user30184
    Commented Dec 3, 2023 at 8:41

Since NAD83(2011) is plate-fixed, you need to know the time of the coordinate in order to do a transformation, as the relationship between the two frames changes over time. So, like others have stated in comments, you would need to specify the time/epoch of the coordinates to do such a transformation, which is the tt parameter (Input time coordinate(s)) of the transform call. Also, EPSG:6415 is a projected CRS, so passing a lat/lon to from_nad83_transformer in your question doesn't really make much sense.

Also, WGS 84 is not really a 4D CRS, so you might need to use ITRF 2014/2020 instead for it to find the appropriate transformation.

Assuming you want geographic 2D coordinates for NAD83(2011), it would look something like:

from_itrf2020_transformer = Transformer.from_crs(9990, 6318, allow_ballpark=False)
from_itrf2020_transformer .transform(xx=41.15240653663834, yy=-122.85890995637374, tt=2024.0)

See https://pyproj4.github.io/pyproj/stable/examples.html#d-transformations-with-time

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.