I am trying to use the General Oblique Transformation to create a projection that is a rotated Oblique Mercator ... but I cannot for the life of me figure out what on earth that thing is doing.

I started by trying to reproduce a standard Transverse Mercator centered at 0 latitude and 0 longitude, and I'm already stuck. I actually can do it successfully using a "modified" pole, but when I try to use a center point and a rotation, it does unexpected things. I want to be able to set it by the latter, not have to deal with the former.

Here's what I've tried, using pyproj to interface with proj4:

from pyproj import CRS, Transformer

geod = CRS.from_proj4("+proj=latlon")
custom1 = CRS.from_proj4("+proj=ob_tran +o_proj=tmerc +o_lat_p=90 +o_lon_p=0")

cust12geo = Transformer.from_crs(custom1, geod)
print("Custom General Oblique to mimic Transverse, using pole")
print("Origin: ", cust12geo.transform(0, 0))
print("+X: ", cust12geo.transform(111e3, 0))
print("+Y: ", cust12geo.transform(0, 111e3))

custom2 = CRS.from_proj4("+proj=ob_tran +o_proj=tmerc +o_lat_c=0 +o_lon_c=0 +o_alpha=0")

cust22geo = Transformer.from_crs(custom2, geod)
print("Custom General Oblique to mimic Transverse, using center and rotation")
print("Origin: ", cust22geo.transform(0, 0))
print("+X: ", cust22geo.transform(111e3, 0))
print("+Y: ", cust22geo.transform(0, 111e3))

What I get is the following printed out:

Custom General Oblique to mimic Transverse, using pole
Origin:  (0.0, 3.508354649267438e-15)
+X:  (0.9970792962983757, 3.507823426518576e-15)
+Y:  (0.0, 1.0038490881892714)
Custom General Oblique to mimic Transverse, using center and rotation
Origin:  (90.0, 3.508354649267438e-15)
+X:  (90.0, -0.9970792962983749)
+Y:  (91.00384908818927, 3.5078161886111948e-15)

According to the documentation here, I should be able to do this - I'm attempting the second of the three ways mentioned:

In addition to specifying an oblique projection, how to rotate the projection should be specified. This is done in one of three ways: Define a new pole, rotate the projection about a given point or define a new "equator" spanned by two points on the sphere.

With the above I thought that it would take a Transverse Mercator projection (with its default origin of (0,0)), and then "rotate" it around (0, 0) with a rotation of 0, meaning it shouldn't move. Why is the origin suddenly at (90, 0), with +X going south and +Y going east, instead of east and north respectively? I am clearly not understanding the inputs to this.

p.s. In case it might be relevant, I'm actually working in Cartopy and looking for a way to get something similar to its RotatedPole, but with coordinates in meters and without needing to futz with the pole (I have a center lat/lon and rotation angle I want to use). I can do that once I figure out how to work the proj4 inputs correctly!

ETA: I actually was able to get what I wanted by making a custom Cartopy Projection sub-class that exposed the "+gamma" parameter in an Oblique Mercator projection. But, I'm still interested in seeing where my understanding of "+proj=ob_tran" is faulty!

ETA: Added an issue to PROJ #4045, in case this is really a bug.

1 Answer 1


It seems like something is mixed up in PROJ.

I only have version 8.1.0 on hand, and this is what a map looks like in the projection you defined.

Map projected to ob_tran, tmerc, with one point in lon 0, lat 0, alpha 0, with PROJ 8.1.0

It looks like the pole was at longitude 90, latitude 0.
I would say it looks like a mercator projection of a transverse world.

In case it helps, here's what a map with the following definition looks like::

+proj=ob_tran +o_proj=tmerc +o_lat_c=0 +o_lon_c=90 +o_alpha=0

Map projected to ob_tran, tmerc, with one point in lon 90, lat 0, alpha 0, with PROJ 8.1.0

  • "It looks like a mercator projection of a transverse world" Haha! Indeed! Huh. Maybe it's not me then ... ?
    – Ajean
    Nov 14, 2023 at 17:55
  • :-) It's not you. But maybe transverse mercator is not a great candidate to a general oblique since it is in fact a 90 degrees oblique projection of mercator. Anyway, i will try some tests with other projections and the latest version of proj. Nov 15, 2023 at 2:09
  • I totally agree on the TM, I was just using it as an intermediate step to the Oblique Mercator with fewer parameters to worry about. Maybe that's what's messing with it, although I'm still not sure why it works fine differently via the pole method and via the center-point method. Much appreciated!
    – Ajean
    Nov 15, 2023 at 19:54
  • If Proj has a bug please be sure to report it at github.com/OSGeo/PROJ/issues Feb 7 at 5:15

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.