Repository: SciTools/cartopy

Issue:
Projections with non-Earth radii do not work correctly
### Description
<!-- Please provide a general introduction to the issue/proposal. -->
Cartopy projections / coordinate systems seem to assume the Earth's semi-major axis and if initialised with a non-Earth value fail to display in Jupyter Lab because of a proj4 error.

This is related to a similar issue in iris, see point 2 in this issue: https://github.com/SciTools/iris/issues/4582

The reason for this error are on the following lines of code:
 - https://github.com/SciTools/cartopy/blob/22cdafca511744143c5b673598a1889f169c1e3d/lib/cartopy/mpl/geoaxes.py#L1498
 - https://github.com/SciTools/cartopy/blob/22cdafca511744143c5b673598a1889f169c1e3d/lib/cartopy/mpl/ticker.py#L23
both of which assume a `PlateCarree()` projection with default parameters.

This is probably not a common problem at all, but may be a symptom of some Earth-centric assumptions and/or underlying bugs. So I think it would be great if this could be fixed at some point.

<!--
If you are reporting a bug, attach the *entire* traceback from Python.

If you are proposing an enhancement/new feature, provide links to related articles, reference examples, etc.

If you are asking a question, please ask on StackOverflow and use the cartopy tag. All cartopy
questions on StackOverflow can be found at https://stackoverflow.com/questions/tagged/cartopy
-->

#### Code to reproduce
The quickest example to reproduce this bug is to run the following in Jupyter:
```python
ccrs.PlateCarree(globe=ccrs.Globe(semimajor_axis=12345))
```

#### Traceback 
```python
ProjError: Error creating Transformer from CRS.: (Internal Proj Error: proj_create_operations: Source and target ellipsoid do not belong to the same celestial body)
```
<details>

<summary>Full traceback</summary>

```python
---------------------------------------------------------------------------
ProjError                                 Traceback (most recent call last)
File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/IPython/core/formatters.py:343, in BaseFormatter.__call__(self, obj)
    341     method = get_real_method(obj, self.print_method)
    342     if method is not None:
--> 343         return method()
    344     return None
    345 else:

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/cartopy/crs.py:765, in Projection._repr_html_(self)
    763 ax.gridlines()
    764 buf = io.StringIO()
--> 765 fig.savefig(buf, format='svg', bbox_inches='tight')
    766 plt.close(fig)
    767 # "Rewind" the buffer to the start and return it as an svg string.

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/matplotlib/figure.py:3019, in Figure.savefig(self, fname, transparent, **kwargs)
   3015     for ax in self.axes:
   3016         stack.enter_context(
   3017             ax.patch._cm_set(facecolor='none', edgecolor='none'))
-> 3019 self.canvas.print_figure(fname, **kwargs)

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/matplotlib/backend_bases.py:2295, in FigureCanvasBase.print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, pad_inches, bbox_extra_artists, backend, **kwargs)
   2289     renderer = _get_renderer(
   2290         self.figure,
   2291         functools.partial(
   2292             print_method, orientation=orientation)
   2293     )
   2294     with getattr(renderer, "_draw_disabled", nullcontext)():
-> 2295         self.figure.draw(renderer)
   2297 if bbox_inches:
   2298     if bbox_inches == "tight":

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/matplotlib/artist.py:73, in _finalize_rasterization.<locals>.draw_wrapper(artist, renderer, *args, **kwargs)
     71 @wraps(draw)
     72 def draw_wrapper(artist, renderer, *args, **kwargs):
---> 73     result = draw(artist, renderer, *args, **kwargs)
     74     if renderer._rasterizing:
     75         renderer.stop_rasterizing()

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/matplotlib/artist.py:50, in allow_rasterization.<locals>.draw_wrapper(artist, renderer)
     47     if artist.get_agg_filter() is not None:
     48         renderer.start_filter()
---> 50     return draw(artist, renderer)
     51 finally:
     52     if artist.get_agg_filter() is not None:

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/matplotlib/figure.py:2810, in Figure.draw(self, renderer)
   2807         # ValueError can occur when resizing a window.
   2809 self.patch.draw(renderer)
-> 2810 mimage._draw_list_compositing_images(
   2811     renderer, self, artists, self.suppressComposite)
   2813 for sfig in self.subfigs:
   2814     sfig.draw(renderer)

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/matplotlib/image.py:132, in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
    130 if not_composite or not has_images:
    131     for a in artists:
--> 132         a.draw(renderer)
    133 else:
    134     # Composite any adjacent images together
    135     image_group = []

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/matplotlib/artist.py:50, in allow_rasterization.<locals>.draw_wrapper(artist, renderer)
     47     if artist.get_agg_filter() is not None:
     48         renderer.start_filter()
---> 50     return draw(artist, renderer)
     51 finally:
     52     if artist.get_agg_filter() is not None:

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/cartopy/mpl/geoaxes.py:543, in GeoAxes.draw(self, renderer, **kwargs)
    535 """
    536 Extend the standard behaviour of :func:`matplotlib.axes.Axes.draw`.
    537 
   (...)
    540 been set.
    541 """
    542 # Shared processing steps
--> 543 self._draw_preprocess(renderer)
    545 # XXX This interface needs a tidy up:
    546 #       image drawing on pan/zoom;
    547 #       caching the resulting image;
    548 #       buffering the result by 10%...;
    549 if not self._done_img_factory:

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/cartopy/mpl/geoaxes.py:517, in GeoAxes._draw_preprocess(self, renderer)
    515 self.apply_aspect()
    516 for gl in self._gridliners:
--> 517     gl._draw_gridliner(renderer=renderer)

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/cartopy/mpl/gridliner.py:642, in Gridliner._draw_gridliner(self, nx, ny, renderer)
    639 self._labels.clear()
    641 # Inits
--> 642 lon_lim, lat_lim = self._axes_domain(nx=nx, ny=ny)
    643 transform = self._crs_transform()
    644 n_steps = self.n_steps

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/cartopy/mpl/gridliner.py:1194, in Gridliner._axes_domain(self, nx, ny)
   1190 x, y = np.meshgrid(x, y)
   1192 coords = np.column_stack((x.ravel(), y.ravel()))
-> 1194 in_data = desired_trans.transform(coords)
   1196 ax_to_bkg_patch = self.axes.transAxes - self.axes.patch.get_transform()
   1198 # convert the coordinates of the data to the background patches
   1199 # coordinates

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/matplotlib/transforms.py:1503, in Transform.transform(self, values)
   1500 values = values.reshape((-1, self.input_dims))
   1502 # Transform the values
-> 1503 res = self.transform_affine(self.transform_non_affine(values))
   1505 # Convert the result back to the shape of the input values.
   1506 if ndim == 0:

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/matplotlib/transforms.py:2428, in CompositeGenericTransform.transform_non_affine(self, points)
   2426     return self._a.transform_non_affine(points)
   2427 else:
-> 2428     return self._b.transform_non_affine(
   2429                         self._a.transform(points))

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/cartopy/mpl/geoaxes.py:134, in InterProjectionTransform.transform_non_affine(self, xy)
    132 prj = self.target_projection
    133 if isinstance(xy, np.ndarray):
--> 134     return prj.transform_points(self.source_projection,
    135                                 xy[:, 0], xy[:, 1])[:, 0:2]
    136 else:
    137     x, y = xy

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/cartopy/crs.py:408, in CRS.transform_points(self, src_crs, x, y, z, trap)
    405     x[to_180] = (((x[to_180] + 180) % 360) - 180)
    406 try:
    407     result[:, 0], result[:, 1], result[:, 2] = \
--> 408         _safe_pj_transform(src_crs, self, x, y, z, trap=trap)
    409 except ProjError as err:
    410     msg = str(err).lower()

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/cartopy/crs.py:50, in _safe_pj_transform(src_crs, tgt_crs, x, y, z, trap)
     49 def _safe_pj_transform(src_crs, tgt_crs, x, y, z=None, trap=True):
---> 50     transformer = _get_transformer_from_crs(src_crs, tgt_crs)
     51     transformed_coords = transformer.transform(x, y, z, errcheck=trap)
     52     if z is None:

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/cartopy/crs.py:46, in _get_transformer_from_crs(src_crs, tgt_crs)
     44 @lru_cache()
     45 def _get_transformer_from_crs(src_crs, tgt_crs):
---> 46     return Transformer.from_crs(src_crs, tgt_crs, always_xy=True)

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/pyproj/transformer.py:565, in Transformer.from_crs(crs_from, crs_to, skip_equivalent, always_xy, area_of_interest, authority, accuracy, allow_ballpark)
    558 if skip_equivalent:
    559     warnings.warn(
    560         "skip_equivalent is deprecated.",
    561         DeprecationWarning,
    562         stacklevel=2,
    563     )
--> 565 return Transformer(
    566     TransformerFromCRS(
    567         cstrencode(CRS.from_user_input(crs_from).srs),
    568         cstrencode(CRS.from_user_input(crs_to).srs),
    569         always_xy=always_xy,
    570         area_of_interest=area_of_interest,
    571         authority=authority,
    572         accuracy=accuracy if accuracy is None else str(accuracy),
    573         allow_ballpark=allow_ballpark,
    574     )
    575 )

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/pyproj/transformer.py:310, in Transformer.__init__(self, transformer_maker)
    304     raise ProjError(
    305         "Transformer must be initialized using: "
    306         "'from_crs', 'from_pipeline', or 'from_proj'."
    307     )
    309 self._local = TransformerLocal()
--> 310 self._local.transformer = transformer_maker()
    311 self._transformer_maker = transformer_maker

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/pyproj/transformer.py:97, in TransformerFromCRS.__call__(self)
     91 def __call__(self) -> _Transformer:
     92     """
     93     Returns
     94     -------
     95     _Transformer
     96     """
---> 97     return _Transformer.from_crs(
     98         self.crs_from,
     99         self.crs_to,
    100         always_xy=self.always_xy,
    101         area_of_interest=self.area_of_interest,
    102         authority=self.authority,
    103         accuracy=self.accuracy,
    104         allow_ballpark=self.allow_ballpark,
    105     )

File pyproj/_transformer.pyx:1001, in pyproj._transformer._Transformer.from_crs()

ProjError: Error creating Transformer from CRS.: (Internal Proj Error: proj_create_operations: Source and target ellipsoid do not belong to the same celestial body)
<Derived Projected CRS: +proj=eqc +ellps=WGS84 +a=12345 +lon_0=0.0 +to_met ...>
Name: unknown
Axis Info [cartesian]:
- E[east]: Easting (unknown)
- N[north]: Northing (unknown)
- h[up]: Ellipsoidal height (metre)
Area of Use:
- undefined
Coordinate Operation:
- name: unknown
- method: Equidistant Cylindrical
Datum: unknown
- Ellipsoid: unknown
- Prime Meridian: Reference meridian
---------------------------------------------------------------------------
ProjError                                 Traceback (most recent call last)
File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/IPython/core/formatters.py:339, in BaseFormatter.__call__(self, obj)
    337     pass
    338 else:
--> 339     return printer(obj)
    340 # Finally look for special method names
    341 method = get_real_method(obj, self.print_method)

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/IPython/core/pylabtools.py:151, in print_figure(fig, fmt, bbox_inches, base64, **kwargs)
    148     from matplotlib.backend_bases import FigureCanvasBase
    149     FigureCanvasBase(fig)
--> 151 fig.canvas.print_figure(bytes_io, **kw)
    152 data = bytes_io.getvalue()
    153 if fmt == 'svg':

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/matplotlib/backend_bases.py:2295, in FigureCanvasBase.print_figure(self, filename, dpi, facecolor, edgecolor, orientation, format, bbox_inches, pad_inches, bbox_extra_artists, backend, **kwargs)
   2289     renderer = _get_renderer(
   2290         self.figure,
   2291         functools.partial(
   2292             print_method, orientation=orientation)
   2293     )
   2294     with getattr(renderer, "_draw_disabled", nullcontext)():
-> 2295         self.figure.draw(renderer)
   2297 if bbox_inches:
   2298     if bbox_inches == "tight":

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/matplotlib/artist.py:73, in _finalize_rasterization.<locals>.draw_wrapper(artist, renderer, *args, **kwargs)
     71 @wraps(draw)
     72 def draw_wrapper(artist, renderer, *args, **kwargs):
---> 73     result = draw(artist, renderer, *args, **kwargs)
     74     if renderer._rasterizing:
     75         renderer.stop_rasterizing()

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/matplotlib/artist.py:50, in allow_rasterization.<locals>.draw_wrapper(artist, renderer)
     47     if artist.get_agg_filter() is not None:
     48         renderer.start_filter()
---> 50     return draw(artist, renderer)
     51 finally:
     52     if artist.get_agg_filter() is not None:

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/matplotlib/figure.py:2810, in Figure.draw(self, renderer)
   2807         # ValueError can occur when resizing a window.
   2809 self.patch.draw(renderer)
-> 2810 mimage._draw_list_compositing_images(
   2811     renderer, self, artists, self.suppressComposite)
   2813 for sfig in self.subfigs:
   2814     sfig.draw(renderer)

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/matplotlib/image.py:132, in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
    130 if not_composite or not has_images:
    131     for a in artists:
--> 132         a.draw(renderer)
    133 else:
    134     # Composite any adjacent images together
    135     image_group = []

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/matplotlib/artist.py:50, in allow_rasterization.<locals>.draw_wrapper(artist, renderer)
     47     if artist.get_agg_filter() is not None:
     48         renderer.start_filter()
---> 50     return draw(artist, renderer)
     51 finally:
     52     if artist.get_agg_filter() is not None:

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/cartopy/mpl/geoaxes.py:558, in GeoAxes.draw(self, renderer, **kwargs)
    553         self.imshow(img, extent=extent, origin=origin,
    554                     transform=factory.crs, *factory_args[1:],
    555                     **factory_kwargs)
    556 self._done_img_factory = True
--> 558 return matplotlib.axes.Axes.draw(self, renderer=renderer, **kwargs)

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/matplotlib/artist.py:50, in allow_rasterization.<locals>.draw_wrapper(artist, renderer)
     47     if artist.get_agg_filter() is not None:
     48         renderer.start_filter()
---> 50     return draw(artist, renderer)
     51 finally:
     52     if artist.get_agg_filter() is not None:

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/matplotlib/axes/_base.py:3082, in _AxesBase.draw(self, renderer)
   3079         a.draw(renderer)
   3080     renderer.stop_rasterizing()
-> 3082 mimage._draw_list_compositing_images(
   3083     renderer, self, artists, self.figure.suppressComposite)
   3085 renderer.close_group('axes')
   3086 self.stale = False

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/matplotlib/image.py:132, in _draw_list_compositing_images(renderer, parent, artists, suppress_composite)
    130 if not_composite or not has_images:
    131     for a in artists:
--> 132         a.draw(renderer)
    133 else:
    134     # Composite any adjacent images together
    135     image_group = []

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/matplotlib/artist.py:50, in allow_rasterization.<locals>.draw_wrapper(artist, renderer)
     47     if artist.get_agg_filter() is not None:
     48         renderer.start_filter()
---> 50     return draw(artist, renderer)
     51 finally:
     52     if artist.get_agg_filter() is not None:

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/cartopy/mpl/feature_artist.py:147, in FeatureArtist.draw(self, renderer, *args, **kwargs)
    145 extent = None
    146 try:
--> 147     extent = ax.get_extent(feature_crs)
    148 except ValueError:
    149     warnings.warn('Unable to determine extent. Defaulting to global.')

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/cartopy/mpl/geoaxes.py:814, in GeoAxes.get_extent(self, crs)
    805 def get_extent(self, crs=None):
    806     """
    807     Get the extent (x0, x1, y0, y1) of the map in the given coordinate
    808     system.
   (...)
    812 
    813     """
--> 814     p = self._get_extent_geom(crs)
    815     r = p.bounds
    816     x1, y1, x2, y2 = r

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/cartopy/mpl/geoaxes.py:859, in GeoAxes._get_extent_geom(self, crs)
    856     eroded_boundary = boundary_poly.buffer(-self.projection.threshold)
    857     geom_in_src_proj = eroded_boundary.intersection(
    858         domain_in_src_proj)
--> 859     geom_in_crs = proj.project_geometry(geom_in_src_proj,
    860                                         self.projection)
    861 else:
    862     geom_in_crs = boundary_poly.intersection(domain_in_src_proj)

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/cartopy/crs.py:805, in Projection.project_geometry(self, geometry, src_crs)
    803 if not method_name:
    804     raise ValueError(f'Unsupported geometry type {geom_type!r}')
--> 805 return getattr(self, method_name)(geometry, src_crs)

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/cartopy/crs.py:948, in Projection._project_polygon(self, polygon, src_crs)
    946 multi_lines = []
    947 for src_ring in [polygon.exterior] + list(polygon.interiors):
--> 948     p_rings, p_mline = self._project_linear_ring(src_ring, src_crs)
    949     if p_rings:
    950         rings.extend(p_rings)

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/cartopy/crs.py:824, in Projection._project_linear_ring(self, linear_ring, src_crs)
    819 debug = False
    820 # 1) Resolve the initial lines into projected segments
    821 # 1abc
    822 # def23ghi
    823 # jkl41
--> 824 multi_line_string = cartopy.trace.project_linear(linear_ring,
    825                                                  src_crs, self)
    827 # Threshold for whether a point is close enough to be the same
    828 # point as another.
    829 threshold = max(np.abs(self.x_limits + self.y_limits)) * 1e-5

File lib/cartopy/trace.pyx:630, in cartopy.trace.project_linear()

File lib/cartopy/trace.pyx:591, in cartopy.trace._interpolator()

File lib/cartopy/trace.pyx:202, in cartopy.trace.Interpolator.init()

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/pyproj/transformer.py:565, in Transformer.from_crs(crs_from, crs_to, skip_equivalent, always_xy, area_of_interest, authority, accuracy, allow_ballpark)
    558 if skip_equivalent:
    559     warnings.warn(
    560         "skip_equivalent is deprecated.",
    561         DeprecationWarning,
    562         stacklevel=2,
    563     )
--> 565 return Transformer(
    566     TransformerFromCRS(
    567         cstrencode(CRS.from_user_input(crs_from).srs),
    568         cstrencode(CRS.from_user_input(crs_to).srs),
    569         always_xy=always_xy,
    570         area_of_interest=area_of_interest,
    571         authority=authority,
    572         accuracy=accuracy if accuracy is None else str(accuracy),
    573         allow_ballpark=allow_ballpark,
    574     )
    575 )

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/pyproj/transformer.py:310, in Transformer.__init__(self, transformer_maker)
    304     raise ProjError(
    305         "Transformer must be initialized using: "
    306         "'from_crs', 'from_pipeline', or 'from_proj'."
    307     )
    309 self._local = TransformerLocal()
--> 310 self._local.transformer = transformer_maker()
    311 self._transformer_maker = transformer_maker

File ~/mambaforge/envs/iris-dev/lib/python3.8/site-packages/pyproj/transformer.py:97, in TransformerFromCRS.__call__(self)
     91 def __call__(self) -> _Transformer:
     92     """
     93     Returns
     94     -------
     95     _Transformer
     96     """
---> 97     return _Transformer.from_crs(
     98         self.crs_from,
     99         self.crs_to,
    100         always_xy=self.always_xy,
    101         area_of_interest=self.area_of_interest,
    102         authority=self.authority,
    103         accuracy=self.accuracy,
    104         allow_ballpark=self.allow_ballpark,
    105     )

File pyproj/_transformer.pyx:1001, in pyproj._transformer._Transformer.from_crs()

ProjError: Error creating Transformer from CRS.: (Internal Proj Error: proj_create_operations: Source and target ellipsoid do not belong to the same celestial body)
```


</details>



<details>
 <summary>Full environment definition</summary>

<!-- fill in the following information as appropriate -->

### Operating system
Ubuntu 20.04 LTS

### Cartopy version
0.20.2

### conda list

```
# Name                    Version                   Build  Channel
_libgcc_mutex             0.1                 conda_forge    conda-forge
_openmp_mutex             4.5                       1_gnu    conda-forge
alabaster                 0.7.12                     py_0    conda-forge
alsa-lib                  1.2.3                h516909a_0    conda-forge
antlr-python-runtime      4.7.2           py38h578d9bd_1003    conda-forge
asttokens                 2.0.5              pyhd8ed1ab_0    conda-forge
atk-1.0                   2.36.0               h3371d22_4    conda-forge
babel                     2.9.1              pyh44b312d_0    conda-forge
backcall                  0.2.0              pyh9f0ad1d_0    conda-forge
backports                 1.0                        py_2    conda-forge
backports.functools_lru_cache 1.6.4              pyhd8ed1ab_0    conda-forge
black                     22.1.0             pyhd8ed1ab_0    conda-forge
brotli                    1.0.9                h7f98852_6    conda-forge
brotli-bin                1.0.9                h7f98852_6    conda-forge
brotlipy                  0.7.0           py38h497a2fe_1003    conda-forge
bzip2                     1.0.8                h7f98852_4    conda-forge
c-ares                    1.18.1               h7f98852_0    conda-forge
ca-certificates           2021.10.8            ha878542_0    conda-forge
cairo                     1.16.0            ha00ac49_1009    conda-forge
cartopy                   0.20.2           py38ha217159_3    conda-forge
certifi                   2021.10.8        py38h578d9bd_1    conda-forge
cf-units                  3.0.1            py38h6c62de6_2    conda-forge
cffi                      1.15.0           py38h3931269_0    conda-forge
cfgv                      3.3.1              pyhd8ed1ab_0    conda-forge
cftime                    1.5.2            py38h6c62de6_0    conda-forge
charset-normalizer        2.0.12             pyhd8ed1ab_0    conda-forge
click                     8.0.4            py38h578d9bd_0    conda-forge
cloudpickle               2.0.0              pyhd8ed1ab_0    conda-forge
colorama                  0.4.4              pyh9f0ad1d_0    conda-forge
cryptography              36.0.1           py38h3e25421_0    conda-forge
curl                      7.81.0               h2574ce0_0    conda-forge
cycler                    0.11.0             pyhd8ed1ab_0    conda-forge
dask-core                 2022.2.0           pyhd8ed1ab_0    conda-forge
dataclasses               0.8                pyhc8e2a94_3    conda-forge
dbus                      1.13.6               h5008d03_3    conda-forge
debugpy                   1.5.1            py38h709712a_0    conda-forge
decorator                 5.1.1              pyhd8ed1ab_0    conda-forge
distlib                   0.3.4              pyhd8ed1ab_0    conda-forge
docutils                  0.17.1           py38h578d9bd_1    conda-forge
entrypoints               0.4                pyhd8ed1ab_0    conda-forge
esmf                      8.2.0           mpi_mpich_h4975321_100    conda-forge
esmpy                     8.2.0           mpi_mpich_py38h9147699_101    conda-forge
executing                 0.8.2              pyhd8ed1ab_0    conda-forge
expat                     2.4.5                h27087fc_0    conda-forge
filelock                  3.6.0              pyhd8ed1ab_0    conda-forge
font-ttf-dejavu-sans-mono 2.37                 hab24e00_0    conda-forge
font-ttf-inconsolata      3.000                h77eed37_0    conda-forge
font-ttf-source-code-pro  2.038                h77eed37_0    conda-forge
font-ttf-ubuntu           0.83                 hab24e00_0    conda-forge
fontconfig                2.13.96              ha180cfb_0    conda-forge
fonts-conda-ecosystem     1                             0    conda-forge
fonts-conda-forge         1                             0    conda-forge
fonttools                 4.29.1           py38h497a2fe_0    conda-forge
freetype                  2.10.4               h0708190_1    conda-forge
fribidi                   1.0.10               h36c2ea0_0    conda-forge
fsspec                    2022.1.0           pyhd8ed1ab_0    conda-forge
gdk-pixbuf                2.42.6               h04a7f16_0    conda-forge
geos                      3.10.2               h9c3ff4c_0    conda-forge
gettext                   0.19.8.1          h73d1719_1008    conda-forge
giflib                    5.2.1                h36c2ea0_2    conda-forge
graphite2                 1.3.13            h58526e2_1001    conda-forge
graphviz                  2.50.0               h8e749b2_2    conda-forge
gst-plugins-base          1.18.5               hf529b03_3    conda-forge
gstreamer                 1.18.5               h9f60fe5_3    conda-forge
gtk2                      2.24.33              h90689f9_2    conda-forge
gts                       0.7.6                h64030ff_2    conda-forge
harfbuzz                  3.4.0                hb4a5f5f_0    conda-forge
hdf4                      4.2.15               h10796ff_3    conda-forge
hdf5                      1.12.1          mpi_mpich_h9c45103_3    conda-forge
icu                       69.1                 h9c3ff4c_0    conda-forge
identify                  2.4.10             pyhd8ed1ab_0    conda-forge
idna                      3.3                pyhd8ed1ab_0    conda-forge
imagehash                 4.2.1              pyhd8ed1ab_0    conda-forge
imagesize                 1.3.0              pyhd8ed1ab_0    conda-forge
importlib-metadata        4.11.1           py38h578d9bd_0    conda-forge
ipykernel                 6.9.1            py38he5a9106_0    conda-forge
ipython                   8.0.1            py38h578d9bd_2    conda-forge
iris-sample-data          2.4.0              pyhd8ed1ab_0    conda-forge
jbig                      2.1               h7f98852_2003    conda-forge
jedi                      0.17.2                   pypi_0    pypi
jinja2                    3.0.3              pyhd8ed1ab_0    conda-forge
jpeg                      9e                   h7f98852_0    conda-forge
jupyter_client            7.1.2              pyhd8ed1ab_0    conda-forge
jupyter_core              4.9.2            py38h578d9bd_0    conda-forge
kiwisolver                1.3.2            py38h1fd1430_1    conda-forge
krb5                      1.19.2               hcc1bbae_3    conda-forge
lcms2                     2.12                 hddcbb42_0    conda-forge
ld_impl_linux-64          2.36.1               hea4e1c9_2    conda-forge
lerc                      3.0                  h9c3ff4c_0    conda-forge
libblas                   3.9.0           13_linux64_openblas    conda-forge
libbrotlicommon           1.0.9                h7f98852_6    conda-forge
libbrotlidec              1.0.9                h7f98852_6    conda-forge
libbrotlienc              1.0.9                h7f98852_6    conda-forge
libcblas                  3.9.0           13_linux64_openblas    conda-forge
libclang                  13.0.1          default_hc23dcda_0    conda-forge
libcurl                   7.81.0               h2574ce0_0    conda-forge
libdeflate                1.10                 h7f98852_0    conda-forge
libedit                   3.1.20191231         he28a2e2_2    conda-forge
libev                     4.33                 h516909a_1    conda-forge
libevent                  2.1.10               h9b69904_4    conda-forge
libffi                    3.4.2                h7f98852_5    conda-forge
libgcc-ng                 11.2.0              h1d223b6_12    conda-forge
libgd                     2.3.3                h3cfcdeb_1    conda-forge
libgfortran-ng            11.2.0              h69a702a_12    conda-forge
libgfortran5              11.2.0              h5c6108e_12    conda-forge
libglib                   2.70.2               h174f98d_4    conda-forge
libgomp                   11.2.0              h1d223b6_12    conda-forge
libiconv                  1.16                 h516909a_0    conda-forge
liblapack                 3.9.0           13_linux64_openblas    conda-forge
libllvm13                 13.0.1               hf817b99_1    conda-forge
libmo_unpack              3.1.2             hf484d3e_1001    conda-forge
libnetcdf                 4.8.1           mpi_mpich_h319fa22_1    conda-forge
libnghttp2                1.46.0               h812cca2_0    conda-forge
libnsl                    2.0.0                h7f98852_0    conda-forge
libogg                    1.3.4                h7f98852_1    conda-forge
libopenblas               0.3.18          pthreads_h8fe5266_0    conda-forge
libopus                   1.3.1                h7f98852_1    conda-forge
libpng                    1.6.37               h21135ba_2    conda-forge
libpq                     14.2                 hd57d9b9_0    conda-forge
librsvg                   2.52.5               h0a9e6e8_2    conda-forge
libsodium                 1.0.18               h36c2ea0_1    conda-forge
libssh2                   1.10.0               ha56f1ee_2    conda-forge
libstdcxx-ng              11.2.0              he4da1e4_12    conda-forge
libtiff                   4.3.0                h542a066_3    conda-forge
libtool                   2.4.6             h9c3ff4c_1008    conda-forge
libuuid                   2.32.1            h7f98852_1000    conda-forge
libvorbis                 1.3.7                h9c3ff4c_0    conda-forge
libwebp                   1.2.2                h3452ae3_0    conda-forge
libwebp-base              1.2.2                h7f98852_1    conda-forge
libxcb                    1.13              h7f98852_1004    conda-forge
libxkbcommon              1.0.3                he3ba5ed_0    conda-forge
libxml2                   2.9.12               h885dcf4_1    conda-forge
libzip                    1.8.0                h4de3113_1    conda-forge
libzlib                   1.2.11            h36c2ea0_1013    conda-forge
locket                    0.2.1                    pypi_0    pypi
lz4-c                     1.9.3                h9c3ff4c_1    conda-forge
markupsafe                2.1.0            py38h0a891b7_0    conda-forge
matplotlib                3.5.1            py38h578d9bd_0    conda-forge
matplotlib-base           3.5.1            py38hf4fb855_0    conda-forge
matplotlib-inline         0.1.3              pyhd8ed1ab_0    conda-forge
mo_pack                   0.2.0           py38h6c62de6_1006    conda-forge
mpi                       1.0                       mpich    conda-forge
mpi4py                    3.1.3            py38he865349_0    conda-forge
mpich                     3.4.3              h846660c_100    conda-forge
munkres                   1.1.4              pyh9f0ad1d_0    conda-forge
mypy_extensions           0.4.3            py38h578d9bd_4    conda-forge
mysql-common              8.0.28               ha770c72_0    conda-forge
mysql-libs                8.0.28               hfa10184_0    conda-forge
nc-time-axis              1.4.0              pyhd8ed1ab_0    conda-forge
ncurses                   6.3                  h9c3ff4c_0    conda-forge
nest-asyncio              1.5.4              pyhd8ed1ab_0    conda-forge
netcdf-fortran            4.5.4           mpi_mpich_h1364a43_0    conda-forge
netcdf4                   1.5.8           nompi_py38h2823cc8_101    conda-forge
nodeenv                   1.6.0              pyhd8ed1ab_0    conda-forge
nose                      1.3.7                   py_1006    conda-forge
nspr                      4.32                 h9c3ff4c_1    conda-forge
nss                       3.74                 hb5efdd6_0    conda-forge
numpy                     1.22.2           py38h6ae9a64_0    conda-forge
olefile                   0.46               pyh9f0ad1d_1    conda-forge
openssl                   1.1.1l               h7f98852_0    conda-forge
packaging                 21.3               pyhd8ed1ab_0    conda-forge
pandas                    1.4.1            py38h43a58ef_0    conda-forge
pango                     1.50.3               h9967ed3_0    conda-forge
parso                     0.7.1                    pypi_0    pypi
partd                     1.2.0              pyhd8ed1ab_0    conda-forge
pathspec                  0.9.0              pyhd8ed1ab_0    conda-forge
pcre                      8.45                 h9c3ff4c_0    conda-forge
pexpect                   4.8.0              pyh9f0ad1d_2    conda-forge
pickleshare               0.7.5                   py_1003    conda-forge
pillow                    6.2.2            py38h9776b28_0    conda-forge
pip                       22.0.3             pyhd8ed1ab_0    conda-forge
pixman                    0.40.0               h36c2ea0_0    conda-forge
platformdirs              2.5.1              pyhd8ed1ab_0    conda-forge
pluggy                    1.0.0                    pypi_0    pypi
pockets                   0.9.1                      py_0    conda-forge
pre-commit                2.17.0           py38h578d9bd_0    conda-forge
proj                      8.2.1                h277dcde_0    conda-forge
prompt-toolkit            3.0.27             pyha770c72_0    conda-forge
pthread-stubs             0.4               h36c2ea0_1001    conda-forge
ptyprocess                0.7.0              pyhd3deb0d_0    conda-forge
pure_eval                 0.2.2              pyhd8ed1ab_0    conda-forge
pycparser                 2.21               pyhd8ed1ab_0    conda-forge
pygments                  2.11.2             pyhd8ed1ab_0    conda-forge
pyopenssl                 22.0.0             pyhd8ed1ab_0    conda-forge
pyparsing                 3.0.7              pyhd8ed1ab_0    conda-forge
pyproj                    3.3.0            py38h5383654_1    conda-forge
pyqt                      5.12.3           py38h578d9bd_8    conda-forge
pyqt-impl                 5.12.3           py38h0ffb2e6_8    conda-forge
pyqt5-sip                 4.19.18          py38h709712a_8    conda-forge
pyqtchart                 5.12             py38h7400c14_8    conda-forge
pyqtwebengine             5.12.1           py38h7400c14_8    conda-forge
pyshp                     2.2.0              pyhd8ed1ab_0    conda-forge
pysocks                   1.7.1            py38h578d9bd_4    conda-forge
python                    3.8.12          ha38a3c6_3_cpython    conda-forge
python-dateutil           2.8.2              pyhd8ed1ab_0    conda-forge
python-jsonrpc-server     0.4.0                    pypi_0    pypi
python-language-server    0.36.2                   pypi_0    pypi
python-stratify           0.2.post0        py38h6c62de6_1    conda-forge
python-xxhash             2.0.2            py38h497a2fe_1    conda-forge
python_abi                3.8                      2_cp38    conda-forge
pytz                      2021.3             pyhd8ed1ab_0    conda-forge
pywavelets                1.2.0            py38h6c62de6_1    conda-forge
pyyaml                    6.0              py38h497a2fe_3    conda-forge
pyzmq                     22.3.0           py38h2035c66_1    conda-forge
qt                        5.12.9               ha98a1a1_5    conda-forge
readline                  8.1                  h46c0cb4_0    conda-forge
requests                  2.27.1             pyhd8ed1ab_0    conda-forge
scipy                     1.8.0            py38h56a6a73_1    conda-forge
scitools-iris             3.3.dev0                  dev_0    <develop>
setuptools                60.9.3           py38h578d9bd_0    conda-forge
shapely                   1.8.0            py38h596eeab_5    conda-forge
six                       1.16.0             pyh6c4a22f_0    conda-forge
snowballstemmer           2.2.0              pyhd8ed1ab_0    conda-forge
sphinx                    4.4.0              pyh6c4a22f_1    conda-forge
sphinx-copybutton         0.5.0              pyhd8ed1ab_0    conda-forge
sphinx-gallery            0.10.1             pyhd8ed1ab_0    conda-forge
sphinx-panels             0.6.0              pyhd8ed1ab_0    conda-forge
sphinx_rtd_theme          1.0.0              pyhd8ed1ab_0    conda-forge
sphinxcontrib-applehelp   1.0.2                      py_0    conda-forge
sphinxcontrib-devhelp     1.0.2                      py_0    conda-forge
sphinxcontrib-htmlhelp    2.0.0              pyhd8ed1ab_0    conda-forge
sphinxcontrib-jsmath      1.0.1                      py_0    conda-forge
sphinxcontrib-napoleon    0.7                        py_0    conda-forge
sphinxcontrib-qthelp      1.0.3                      py_0    conda-forge
sphinxcontrib-serializinghtml 1.1.5              pyhd8ed1ab_1    conda-forge
sqlite                    3.37.0               h9cd32fc_0    conda-forge
stack_data                0.2.0              pyhd8ed1ab_0    conda-forge
tk                        8.6.12               h27826a3_0    conda-forge
toml                      0.10.2             pyhd8ed1ab_0    conda-forge
tomli                     2.0.1              pyhd8ed1ab_0    conda-forge
toolz                     0.11.2             pyhd8ed1ab_0    conda-forge
tornado                   6.1              py38h497a2fe_2    conda-forge
traitlets                 5.1.1              pyhd8ed1ab_0    conda-forge
typed-ast                 1.5.2            py38h497a2fe_0    conda-forge
typing_extensions         4.1.1              pyha770c72_0    conda-forge
tzdata                    2021e                he74cb21_0    conda-forge
udunits2                  2.2.28               hc3e0081_0    conda-forge
ujson                     5.1.0                    pypi_0    pypi
ukkonen                   1.0.1            py38h1fd1430_1    conda-forge
unicodedata2              14.0.0           py38h497a2fe_0    conda-forge
urllib3                   1.26.8             pyhd8ed1ab_1    conda-forge
virtualenv                20.13.1          py38h578d9bd_0    conda-forge
wcwidth                   0.2.5              pyh9f0ad1d_2    conda-forge
wheel                     0.37.1             pyhd8ed1ab_0    conda-forge
xorg-kbproto              1.0.7             h7f98852_1002    conda-forge
xorg-libice               1.0.10               h7f98852_0    conda-forge
xorg-libsm                1.2.3             hd9c2040_1000    conda-forge
xorg-libx11               1.7.2                h7f98852_0    conda-forge
xorg-libxau               1.0.9                h7f98852_0    conda-forge
xorg-libxdmcp             1.1.3                h7f98852_0    conda-forge
xorg-libxext              1.3.4                h7f98852_1    conda-forge
xorg-libxrender           0.9.10            h7f98852_1003    conda-forge
xorg-renderproto          0.11.1            h7f98852_1002    conda-forge
xorg-xextproto            7.3.0             h7f98852_1002    conda-forge
xorg-xproto               7.0.31            h7f98852_1007    conda-forge
xxhash                    0.8.0                h7f98852_3    conda-forge
xz                        5.2.5                h516909a_1    conda-forge
yaml                      0.2.5                h7f98852_2    conda-forge
zeromq                    4.3.4                h9c3ff4c_1    conda-forge
zipp                      3.7.0              pyhd8ed1ab_1    conda-forge
zlib                      1.2.11            h36c2ea0_1013    conda-forge
zstd                      1.5.2                ha95c52a_0    conda-forge
```
</details>



Discussion:
I was able to plot Mercurian data without a problem by defining both semi-major and semi-minor axes, and setting the keyword argument _ellipse_ to none. I made a Stackoverflow post about it and answered it myself once I got things up and running. 
[https://stackoverflow.com/questions/72523526/is-cartopy-capable-of-plotting-georeferenced-data-from-another-planet-e-g-mar](url)
Thanks for the example @gosselgj!
I agree that you can find a workaround and plot data like you did, but I still think there are Earth-centric assumptions/bugs in cartopy such as the one I reported above...
No problem, and I agree that it would be incredibly helpful to implement some non-terrestrial ellipsoids.
Ran into this issue when creating a LambertConformal projection for the Moon with the latest release. Tried modifying a few of the default parameters for this projection, but always got the same error.
<!--
If you are reporting a bug, attach the *entire* traceback from Python.

If you are proposing an enhancement/new feature, provide links to related articles, reference examples, etc.

If you are asking a question, please ask on StackOverflow and use the cartopy tag. All cartopy
questions on StackOverflow can be found at https://stackoverflow.com/questions/tagged/cartopy
-->

#### Code to reproduce

```
import cartopy.crs as ccrs
moon = ccrs.Globe(ellipse=None, semimajor_axis=1737400, 
           semiminor_axis=1737400)
map_proj=ccrs.LambertConformal(globe=moon)
```

#### Traceback

```python
ProjError: Error creating Transformer from CRS.: (Internal Proj Error: proj_create_operations: Source and target ellipsoid do not belong to the same celestial body (Moon vs Earth). You may override this check by setting the PROJ_IGNORE_CELESTIAL_BODY environment variable to YES.)
```

<details>
 <summary>Full traceback</summary>

```python
Traceback (most recent call last):

  File "/var/folders/n3/mhlpcdr96z3279lyvq_sf1bm0000gn/T/ipykernel_71540/750241958.py", line 1, in <cell line: 0>
    map_proj=ccrs.LambertConformal(globe=moon)

  File "/Users/cailingallinger/anaconda3/envs/geopkgs3.11/lib/python3.11/site-packages/cartopy/crs.py", line 1786, in __init__
    points = self.transform_points(PlateCarree(), lons, lats)

  File "/Users/cailingallinger/anaconda3/envs/geopkgs3.11/lib/python3.11/site-packages/cartopy/crs.py", line 417, in transform_points
    _safe_pj_transform(src_crs, self, x, y, z, trap=trap)

  File "/Users/cailingallinger/anaconda3/envs/geopkgs3.11/lib/python3.11/site-packages/cartopy/crs.py", line 49, in _safe_pj_transform
    transformer = _get_transformer_from_crs(src_crs, tgt_crs)

  File "/Users/cailingallinger/anaconda3/envs/geopkgs3.11/lib/python3.11/site-packages/cartopy/crs.py", line 45, in _get_transformer_from_crs
    return Transformer.from_crs(src_crs, tgt_crs, always_xy=True)

  File "/Users/cailingallinger/anaconda3/envs/geopkgs3.11/lib/python3.11/site-packages/pyproj/transformer.py", line 625, in from_crs
    return Transformer(

  File "/Users/cailingallinger/anaconda3/envs/geopkgs3.11/lib/python3.11/site-packages/pyproj/transformer.py", line 337, in __init__
    self._local.transformer = transformer_maker()

  File "/Users/cailingallinger/anaconda3/envs/geopkgs3.11/lib/python3.11/site-packages/pyproj/transformer.py", line 105, in __call__
    return _Transformer.from_crs(

  File "pyproj/_transformer.pyx", line 568, in pyproj._transformer._Transformer.from_crs

  File "pyproj/_transformer.pyx", line 344, in pyproj._transformer.proj_create_crs_to_crs

ProjError: Error creating Transformer from CRS.: (Internal Proj Error: proj_create_operations: Source and target ellipsoid do not belong to the same celestial body (Moon vs Earth). You may override this check by setting the PROJ_IGNORE_CELESTIAL_BODY environment variable to YES.)
```
</details>

<details>
 <summary>Full environment definition</summary>

<!-- fill in the following information as appropriate -->

### Operating system
macOS 10.13.6 High Sierra

### Cartopy version
0.22.0

### conda list

```
# Name                    Version                   Build  Channel
affine                    2.4.0              pyhd8ed1ab_0    conda-forge
anyio                     4.0.0              pyhd8ed1ab_0    conda-forge
aom                       3.6.1                he965462_0    conda-forge
appnope                   0.1.3              pyhd8ed1ab_0    conda-forge
argon2-cffi               23.1.0             pyhd8ed1ab_0    conda-forge
argon2-cffi-bindings      21.2.0          py311h2725bcf_4    conda-forge
arrow                     1.3.0              pyhd8ed1ab_0    conda-forge
astropy                   5.3.4           py311hc9a392d_2    conda-forge
asttokens                 2.4.1              pyhd8ed1ab_0    conda-forge
async-lru                 2.0.4              pyhd8ed1ab_0    conda-forge
attrs                     23.1.0             pyh71513ae_1    conda-forge
aws-c-auth                0.7.5                h671831e_0    conda-forge
aws-c-cal                 0.6.7                h50c96e6_0    conda-forge
aws-c-common              0.9.4                h10d778d_0    conda-forge
aws-c-compression         0.2.17               h6cdfeff_4    conda-forge
aws-c-event-stream        0.3.2                h74ccef4_4    conda-forge
aws-c-http                0.7.13               h7fc0988_7    conda-forge
aws-c-io                  0.13.35              h3dcb58e_4    conda-forge
aws-c-mqtt                0.9.8                hb951632_0    conda-forge
aws-c-s3                  0.3.20               h4b852be_1    conda-forge
aws-c-sdkutils            0.1.12               h6cdfeff_3    conda-forge
aws-checksums             0.1.17               h6cdfeff_3    conda-forge
aws-crt-cpp               0.24.4               hf472077_2    conda-forge
aws-sdk-cpp               1.11.182             hfd15655_2    conda-forge
babel                     2.13.1             pyhd8ed1ab_0    conda-forge
backcall                  0.2.0                    pypi_0    pypi
backports                 1.0                pyhd8ed1ab_3    conda-forge
backports.functools_lru_cache 1.6.5              pyhd8ed1ab_0    conda-forge
beautifulsoup4            4.12.2             pyha770c72_0    conda-forge
bleach                    6.1.0              pyhd8ed1ab_0    conda-forge
blosc                     1.21.5               heccf04b_0    conda-forge
bokeh                     3.3.0              pyhd8ed1ab_0    conda-forge
branca                    0.7.0              pyhd8ed1ab_0    conda-forge
brotli                    1.1.0                h0dc2134_1    conda-forge
brotli-bin                1.1.0                h0dc2134_1    conda-forge
brotli-python             1.1.0           py311hdf8f085_1    conda-forge
bzip2                     1.0.8                h10d778d_5    conda-forge
c-ares                    1.21.0               h10d778d_0    conda-forge
ca-certificates           2023.7.22            h8857fd0_0    conda-forge
cached-property           1.5.2                hd8ed1ab_1    conda-forge
cached_property           1.5.2              pyha770c72_1    conda-forge
cairo                     1.18.0               h99e66fa_0    conda-forge
cartopy                   0.22.0          py311h1eadf79_1    conda-forge
certifi                   2023.7.22          pyhd8ed1ab_0    conda-forge
cffi                      1.16.0          py311hc0b63fd_0    conda-forge
cfitsio                   4.3.0                h66f91ea_0    conda-forge
charset-normalizer        3.3.2              pyhd8ed1ab_0    conda-forge
click                     8.1.7           unix_pyh707e725_0    conda-forge
click-plugins             1.1.1                      py_0    conda-forge
cligj                     0.7.2              pyhd8ed1ab_1    conda-forge
cloudpickle               3.0.0              pyhd8ed1ab_0    conda-forge
comm                      0.1.4              pyhd8ed1ab_0    conda-forge
contourpy                 1.2.0           py311h7bea37d_0    conda-forge
cycler                    0.12.1             pyhd8ed1ab_0    conda-forge
cytoolz                   0.12.2          py311h2725bcf_1    conda-forge
dask                      2023.10.1          pyhd8ed1ab_0    conda-forge
dask-core                 2023.10.1          pyhd8ed1ab_0    conda-forge
dav1d                     1.2.1                h0dc2134_0    conda-forge
debugpy                   1.8.0           py311hdf8f085_1    conda-forge
decorator                 5.1.1              pyhd8ed1ab_0    conda-forge
defusedxml                0.7.1              pyhd8ed1ab_0    conda-forge
distributed               2023.10.1          pyhd8ed1ab_0    conda-forge
entrypoints               0.4                pyhd8ed1ab_0    conda-forge
exceptiongroup            1.1.3              pyhd8ed1ab_0    conda-forge
executing                 2.0.1              pyhd8ed1ab_0    conda-forge
expat                     2.5.0                hf0c8a7f_1    conda-forge
ffmpeg                    6.0.0           gpl_h789aacd_105    conda-forge
fiona                     1.9.5           py311hf14a637_0    conda-forge
folium                    0.14.0             pyhd8ed1ab_0    conda-forge
font-ttf-dejavu-sans-mono 2.37                 hab24e00_0    conda-forge
font-ttf-inconsolata      3.000                h77eed37_0    conda-forge
font-ttf-source-code-pro  2.038                h77eed37_0    conda-forge
font-ttf-ubuntu           0.83                 hab24e00_0    conda-forge
fontconfig                2.14.2               h5bb23bf_0    conda-forge
fonts-conda-ecosystem     1                             0    conda-forge
fonts-conda-forge         1                             0    conda-forge
fonttools                 4.44.0          py311he705e18_0    conda-forge
fqdn                      1.5.1              pyhd8ed1ab_0    conda-forge
freetype                  2.12.1               h60636b9_2    conda-forge
freexl                    2.0.0                h3ec172f_0    conda-forge
fribidi                   1.0.10               hbcb3906_0    conda-forge
fsspec                    2023.10.0          pyhca7485f_0    conda-forge
gdal                      3.7.3           py311h5646c56_2    conda-forge
geopandas                 0.14.0             pyhd8ed1ab_1    conda-forge
geopandas-base            0.14.0             pyha770c72_1    conda-forge
geos                      3.12.0               he965462_0    conda-forge
geotiff                   1.7.1               h889ec99_14    conda-forge
gettext                   0.21.1               h8a4c099_0    conda-forge
gflags                    2.2.2             hb1e8313_1004    conda-forge
giflib                    5.2.1                hb7f2c08_3    conda-forge
glog                      0.6.0                h8ac2a54_0    conda-forge
gmp                       6.2.1                h2e338ed_0    conda-forge
gnutls                    3.7.8                h207c4f0_0    conda-forge
graphite2                 1.3.13            h2e338ed_1001    conda-forge
harfbuzz                  8.2.1                h7666e2a_0    conda-forge
hdf4                      4.2.15               h8138101_7    conda-forge
hdf5                      1.14.2          nompi_hedada53_100    conda-forge
icu                       73.2                 hf5e326d_0    conda-forge
idna                      3.4                pyhd8ed1ab_0    conda-forge
importlib-metadata        6.8.0              pyha770c72_0    conda-forge
importlib_metadata        6.8.0                hd8ed1ab_0    conda-forge
importlib_resources       6.1.0              pyhd8ed1ab_0    conda-forge
ipykernel                 6.26.0             pyh3cd1d5f_0    conda-forge
ipython                   7.34.0                   pypi_0    pypi
ipywidgets                8.1.1              pyhd8ed1ab_0    conda-forge
isoduration               20.11.0            pyhd8ed1ab_0    conda-forge
jasper                    4.1.0                h6ff19ee_0    conda-forge
jedi                      0.19.1             pyhd8ed1ab_0    conda-forge
jinja2                    3.1.2              pyhd8ed1ab_1    conda-forge
joblib                    1.3.2              pyhd8ed1ab_0    conda-forge
json-c                    0.17                 h8e11ae5_0    conda-forge
json5                     0.9.14             pyhd8ed1ab_0    conda-forge
jsonpointer               2.4             py311h6eed73b_3    conda-forge
jsonschema                4.19.2             pyhd8ed1ab_0    conda-forge
jsonschema-specifications 2023.7.1           pyhd8ed1ab_0    conda-forge
jsonschema-with-format-nongpl 4.19.2             pyhd8ed1ab_0    conda-forge
jupyter                   1.0.0             pyhd8ed1ab_10    conda-forge
jupyter-lsp               2.2.0              pyhd8ed1ab_0    conda-forge
jupyter_client            8.6.0              pyhd8ed1ab_0    conda-forge
jupyter_console           6.6.3              pyhd8ed1ab_0    conda-forge
jupyter_core              5.5.0           py311h6eed73b_0    conda-forge
jupyter_events            0.9.0              pyhd8ed1ab_0    conda-forge
jupyter_server            2.10.0             pyhd8ed1ab_0    conda-forge
jupyter_server_terminals  0.4.4              pyhd8ed1ab_1    conda-forge
jupyterlab                4.0.8              pyhd8ed1ab_0    conda-forge
jupyterlab_pygments       0.2.2              pyhd8ed1ab_0    conda-forge
jupyterlab_server         2.25.0             pyhd8ed1ab_0    conda-forge
jupyterlab_widgets        3.0.9              pyhd8ed1ab_0    conda-forge
kealib                    1.5.2                h052fcf7_1    conda-forge
kiwisolver                1.4.5           py311h5fe6e05_1    conda-forge
krb5                      1.21.2               hb884880_0    conda-forge
lame                      3.100             hb7f2c08_1003    conda-forge
lcms2                     2.15                 hd6ba6f3_3    conda-forge
lerc                      4.0.0                hb486fe8_0    conda-forge
libabseil                 20230802.1      cxx17_h048a20a_0    conda-forge
libaec                    1.1.2                he965462_1    conda-forge
libarchive                3.7.2                h0b5dc4a_0    conda-forge
libarrow                  13.0.0          h6b0247c_14_cpu    conda-forge
libass                    0.17.1               h80904bb_1    conda-forge
libblas                   3.9.0           19_osx64_openblas    conda-forge
libboost-headers          1.82.0               h694c41f_6    conda-forge
libbrotlicommon           1.1.0                h0dc2134_1    conda-forge
libbrotlidec              1.1.0                h0dc2134_1    conda-forge
libbrotlienc              1.1.0                h0dc2134_1    conda-forge
libcblas                  3.9.0           19_osx64_openblas    conda-forge
libcrc32c                 1.1.2                he49afe7_0    conda-forge
libcurl                   8.4.0                h726d00d_0    conda-forge
libcxx                    16.0.6               hd57cbcb_0    conda-forge
libdeflate                1.19                 ha4e1b8e_0    conda-forge
libedit                   3.1.20191231         h0678c8f_2    conda-forge
libev                     4.33                 haf1e3a3_1    conda-forge
libevent                  2.1.12               ha90c15b_1    conda-forge
libexpat                  2.5.0                hf0c8a7f_1    conda-forge
libffi                    3.4.2                h0d85af4_5    conda-forge
libgdal                   3.7.3                h926149b_2    conda-forge
libgfortran               5.0.0           13_2_0_h97931a8_1    conda-forge
libgfortran5              13.2.0               h2873a65_1    conda-forge
libglib                   2.78.1               h6d9ecee_0    conda-forge
libgoogle-cloud           2.12.0               hc0857f6_4    conda-forge
libgrpc                   1.59.2               ha7f534c_0    conda-forge
libiconv                  1.17                 hac89ed1_0    conda-forge
libidn2                   2.3.4                hb7f2c08_0    conda-forge
libjpeg-turbo             3.0.0                h0dc2134_1    conda-forge
libkml                    1.3.0             hab3ca0e_1018    conda-forge
liblapack                 3.9.0           19_osx64_openblas    conda-forge
liblapacke                3.9.0           19_osx64_openblas    conda-forge
libllvm14                 14.0.6               hc8e404f_4    conda-forge
libnetcdf                 4.9.2           nompi_h6a32802_112    conda-forge
libnghttp2                1.55.1               hc0a10c5_0    conda-forge
libopenblas               0.3.24          openmp_h48a4ad5_0    conda-forge
libopencv                 4.8.1           py311h712aba7_5    conda-forge
libopenvino               2023.1.0             h93d8f39_1    conda-forge
libopenvino-auto-batch-plugin 2023.1.0             h93d8f39_1    conda-forge
libopenvino-auto-plugin   2023.1.0             h93d8f39_1    conda-forge
libopenvino-hetero-plugin 2023.1.0             h93d8f39_1    conda-forge
libopenvino-intel-cpu-plugin 2023.1.0             h93d8f39_1    conda-forge
libopenvino-ir-frontend   2023.1.0             h93d8f39_1    conda-forge
libopenvino-onnx-frontend 2023.1.0             h93d8f39_1    conda-forge
libopenvino-paddle-frontend 2023.1.0             h93d8f39_1    conda-forge
libopenvino-pytorch-frontend 2023.1.0             h93d8f39_1    conda-forge
libopenvino-tensorflow-frontend 2023.1.0             h93d8f39_1    conda-forge
libopenvino-tensorflow-lite-frontend 2023.1.0             h93d8f39_1    conda-forge
libopus                   1.3.1                hc929b4f_1    conda-forge
libpng                    1.6.39               ha978bb4_0    conda-forge
libpq                     16.0                 h3df487d_1    conda-forge
libprotobuf               4.24.4               h0ee05dc_0    conda-forge
libre2-11                 2023.06.02           h4694dbf_0    conda-forge
librttopo                 1.1.0               h23f359d_14    conda-forge
libsodium                 1.0.18               hbcb3906_1    conda-forge
libspatialindex           1.9.3                he49afe7_4    conda-forge
libspatialite             5.1.0                h231fb02_0    conda-forge
libsqlite                 3.44.0               h92b6c6a_0    conda-forge
libssh2                   1.11.0               hd019ec5_0    conda-forge
libtasn1                  4.19.0               hb7f2c08_0    conda-forge
libthrift                 0.19.0               h064b379_1    conda-forge
libtiff                   4.6.0                h684deea_2    conda-forge
libunistring              0.9.10               h0d85af4_0    conda-forge
libutf8proc               2.8.0                hb7f2c08_0    conda-forge
libvpx                    1.13.1               he965462_0    conda-forge
libwebp-base              1.3.2                h0dc2134_0    conda-forge
libxcb                    1.15                 hb7f2c08_0    conda-forge
libxml2                   2.11.5               h3346baf_1    conda-forge
libzip                    1.10.1               hc158999_3    conda-forge
libzlib                   1.2.13               h8a1eda9_5    conda-forge
llvm-openmp               17.0.4               hb6ac08f_0    conda-forge
llvmlite                  0.40.1          py311hcbb5c6d_0    conda-forge
locket                    1.0.0              pyhd8ed1ab_0    conda-forge
lz4                       4.3.2           py311hbaf8d61_1    conda-forge
lz4-c                     1.9.4                hf0c8a7f_0    conda-forge
lzo                       2.10              haf1e3a3_1000    conda-forge
mapclassify               2.6.1              pyhd8ed1ab_0    conda-forge
markupsafe                2.1.3           py311h2725bcf_1    conda-forge
matplotlib                3.8.1           py311h6eed73b_0    conda-forge
matplotlib-base           3.8.1           py311hd316c10_0    conda-forge
matplotlib-inline         0.1.6              pyhd8ed1ab_0    conda-forge
minizip                   4.0.2                h23f18a7_0    conda-forge
mistune                   3.0.2              pyhd8ed1ab_0    conda-forge
msgpack-python            1.0.6           py311h5fe6e05_0    conda-forge
munch                     4.0.0              pyhd8ed1ab_0    conda-forge
munkres                   1.1.4              pyh9f0ad1d_0    conda-forge
nbclient                  0.8.0              pyhd8ed1ab_0    conda-forge
nbconvert                 7.11.0             pyhd8ed1ab_0    conda-forge
nbconvert-core            7.11.0             pyhd8ed1ab_0    conda-forge
nbconvert-pandoc          7.11.0             pyhd8ed1ab_0    conda-forge
nbformat                  5.9.2              pyhd8ed1ab_0    conda-forge
ncurses                   6.4                  h93d8f39_2    conda-forge
nest-asyncio              1.5.8              pyhd8ed1ab_0    conda-forge
nettle                    3.8.1                h96f3785_1    conda-forge
networkx                  3.2.1              pyhd8ed1ab_0    conda-forge
notebook                  7.0.6              pyhd8ed1ab_0    conda-forge
notebook-shim             0.2.3              pyhd8ed1ab_0    conda-forge
nspr                      4.35                 hea0b92c_0    conda-forge
nss                       3.94                 hd6ac835_0    conda-forge
numba                     0.57.1          py311h5a8220d_0    conda-forge
numpy                     1.24.4          py311hc44ba51_0    conda-forge
opencv                    4.8.1           py311h9073893_5    conda-forge
openh264                  2.3.1                hf0c8a7f_2    conda-forge
openjpeg                  2.5.0                ha4da562_3    conda-forge
openssl                   3.1.4                hd75f5a5_0    conda-forge
orc                       1.9.0                hd1092d7_4    conda-forge
overrides                 7.4.0              pyhd8ed1ab_0    conda-forge
p11-kit                   0.24.1               h65f8906_0    conda-forge
packaging                 23.2               pyhd8ed1ab_0    conda-forge
palettable                3.3.3              pyhd8ed1ab_0    conda-forge
pandas                    2.1.2           py311h1eadf79_0    conda-forge
pandoc                    3.1.3                h9d075a6_0    conda-forge
pandocfilters             1.5.0              pyhd8ed1ab_0    conda-forge
parso                     0.8.3              pyhd8ed1ab_0    conda-forge
partd                     1.4.1              pyhd8ed1ab_0    conda-forge
patsy                     0.5.3              pyhd8ed1ab_0    conda-forge
pcre2                     10.40                h1c4e4bc_0    conda-forge
pexpect                   4.8.0              pyh1a96a4e_2    conda-forge
pickleshare               0.7.5                   py_1003    conda-forge
pillow                    10.1.0          py311hea5c87a_0    conda-forge
pip                       23.3.1             pyhd8ed1ab_0    conda-forge
pixman                    0.42.2               he965462_0    conda-forge
pkgutil-resolve-name      1.3.10             pyhd8ed1ab_1    conda-forge
platformdirs              3.11.0             pyhd8ed1ab_0    conda-forge
poppler                   23.10.0              hdd5a5e8_0    conda-forge
poppler-data              0.4.12               hd8ed1ab_0    conda-forge
postgresql                16.0                 hc940a54_1    conda-forge
proj                      9.3.0                h23b96cc_2    conda-forge
prometheus_client         0.18.0             pyhd8ed1ab_0    conda-forge
prompt-toolkit            3.0.39             pyha770c72_0    conda-forge
prompt_toolkit            3.0.39               hd8ed1ab_0    conda-forge
psutil                    5.9.5           py311h2725bcf_1    conda-forge
pthread-stubs             0.4               hc929b4f_1001    conda-forge
ptyprocess                0.7.0              pyhd3deb0d_0    conda-forge
pugixml                   1.14                 he965462_0    conda-forge
pure_eval                 0.2.2              pyhd8ed1ab_0    conda-forge
py-opencv                 4.8.1           py311h112db91_5    conda-forge
pyarrow                   13.0.0          py311h98a0319_14_cpu    conda-forge
pycparser                 2.21               pyhd8ed1ab_0    conda-forge
pyerfa                    2.0.1.1         py311hc9a392d_0    conda-forge
pygments                  2.16.1             pyhd8ed1ab_0    conda-forge
pyobjc-core               10.0            py311hf110eff_0    conda-forge
pyobjc-framework-cocoa    10.0            py311hf110eff_1    conda-forge
pyparsing                 3.1.1              pyhd8ed1ab_0    conda-forge
pyproj                    3.6.1           py311he36daed_4    conda-forge
pyshp                     2.3.1              pyhd8ed1ab_0    conda-forge
pysocks                   1.7.1              pyha2e5f31_6    conda-forge
python                    3.11.6          h30d4d87_0_cpython    conda-forge
python-dateutil           2.8.2              pyhd8ed1ab_0    conda-forge
python-fastjsonschema     2.18.1             pyhd8ed1ab_0    conda-forge
python-json-logger        2.0.7              pyhd8ed1ab_0    conda-forge
python-tzdata             2023.3             pyhd8ed1ab_0    conda-forge
python_abi                3.11                    4_cp311    conda-forge
pytz                      2023.3.post1       pyhd8ed1ab_0    conda-forge
pyyaml                    6.0.1           py311h2725bcf_1    conda-forge
pyzmq                     25.1.1          py311he3804a1_2    conda-forge
qtconsole-base            5.5.0              pyha770c72_0    conda-forge
qtpy                      2.4.1              pyhd8ed1ab_0    conda-forge
rasterio                  1.3.9           py311h154ac00_0    conda-forge
re2                       2023.06.02           hd34609a_0    conda-forge
readline                  8.2                  h9e318b2_1    conda-forge
referencing               0.30.2             pyhd8ed1ab_0    conda-forge
requests                  2.31.0             pyhd8ed1ab_0    conda-forge
rfc3339-validator         0.1.4              pyhd8ed1ab_0    conda-forge
rfc3986-validator         0.1.1              pyh9f0ad1d_0    conda-forge
rpds-py                   0.12.0          py311h5e0f0e4_0    conda-forge
rtree                     1.1.0           py311hbc1f44b_0    conda-forge
scikit-learn              1.3.2           py311h66081b9_1    conda-forge
scipy                     1.11.3          py311h16c3c4d_1    conda-forge
seaborn                   0.13.0               hd8ed1ab_0    conda-forge
seaborn-base              0.13.0             pyhd8ed1ab_0    conda-forge
send2trash                1.8.2              pyhd1c38e8_0    conda-forge
setuptools                68.2.2             pyhd8ed1ab_0    conda-forge
shapely                   2.0.2           py311h359915d_0    conda-forge
six                       1.16.0             pyh6c4a22f_0    conda-forge
snappy                    1.1.10               h225ccf5_0    conda-forge
sniffio                   1.3.0              pyhd8ed1ab_0    conda-forge
snuggs                    1.4.7                      py_0    conda-forge
sortedcontainers          2.4.0              pyhd8ed1ab_0    conda-forge
soupsieve                 2.5                pyhd8ed1ab_1    conda-forge
spyder-kernels            2.2.1                    pypi_0    pypi
sqlite                    3.44.0               h7461747_0    conda-forge
stack_data                0.6.2              pyhd8ed1ab_0    conda-forge
statsmodels               0.14.0          py311hc9a392d_2    conda-forge
svt-av1                   1.7.0                he965462_0    conda-forge
tbb                       2021.10.0            h1c7c39f_2    conda-forge
tblib                     2.0.0              pyhd8ed1ab_0    conda-forge
terminado                 0.17.1             pyhd1c38e8_0    conda-forge
threadpoolctl             3.2.0              pyha21a80b_0    conda-forge
tiledb                    2.16.3               hd3a41d5_3    conda-forge
tinycss2                  1.2.1              pyhd8ed1ab_0    conda-forge
tk                        8.6.13               h1abcd95_1    conda-forge
tomli                     2.0.1              pyhd8ed1ab_0    conda-forge
toolz                     0.12.0             pyhd8ed1ab_0    conda-forge
tornado                   6.3.3           py311h2725bcf_1    conda-forge
traitlets                 5.13.0             pyhd8ed1ab_0    conda-forge
types-python-dateutil     2.8.19.14          pyhd8ed1ab_0    conda-forge
typing-extensions         4.8.0                hd8ed1ab_0    conda-forge
typing_extensions         4.8.0              pyha770c72_0    conda-forge
typing_utils              0.1.0              pyhd8ed1ab_0    conda-forge
tzcode                    2023c                hb7f2c08_0    conda-forge
tzdata                    2023c                h71feb2d_0    conda-forge
uri-template              1.3.0              pyhd8ed1ab_0    conda-forge
uriparser                 0.9.7                hf0c8a7f_1    conda-forge
urllib3                   2.0.7              pyhd8ed1ab_0    conda-forge
wcwidth                   0.2.9              pyhd8ed1ab_0    conda-forge
webcolors                 1.13               pyhd8ed1ab_0    conda-forge
webencodings              0.5.1              pyhd8ed1ab_2    conda-forge
websocket-client          1.6.4              pyhd8ed1ab_0    conda-forge
wheel                     0.41.3             pyhd8ed1ab_0    conda-forge
widgetsnbextension        4.0.9              pyhd8ed1ab_0    conda-forge
wurlitzer                 3.0.3                    pypi_0    pypi
x264                      1!164.3095           h775f41a_2    conda-forge
x265                      3.5                  hbb4e6a2_3    conda-forge
xarray                    2023.10.1          pyhd8ed1ab_0    conda-forge
xerces-c                  3.2.4                h6314983_3    conda-forge
xorg-libxau               1.0.11               h0dc2134_0    conda-forge
xorg-libxdmcp             1.1.3                h35c211d_0    conda-forge
xyzservices               2023.10.1          pyhd8ed1ab_0    conda-forge
xz                        5.2.6                h775f41a_0    conda-forge
yaml                      0.2.5                h0d85af4_2    conda-forge
zeromq                    4.3.5                h93d8f39_0    conda-forge
zict                      3.0.0              pyhd8ed1ab_0    conda-forge
zipp                      3.17.0             pyhd8ed1ab_0    conda-forge
zlib                      1.2.13               h8a1eda9_5    conda-forge
zstd                      1.5.5                h829000d_0    conda-forge
```

</details>

Resolving patch:
diff --git a/lib/cartopy/crs.py b/lib/cartopy/crs.py
--- a/lib/cartopy/crs.py
+++ b/lib/cartopy/crs.py
@@ -1783,7 +1783,7 @@ def __init__(self, central_longitude=-96.0, central_latitude=39.0,
             lons[1:-1] = np.linspace(central_longitude - 180 + 0.001,
                                      central_longitude + 180 - 0.001, n)
 
-        points = self.transform_points(PlateCarree(), lons, lats)
+        points = self.transform_points(PlateCarree(globe=globe), lons, lats)
 
         self._boundary = sgeom.LinearRing(points)
         mins = np.min(points, axis=0)
diff --git a/lib/cartopy/mpl/geoaxes.py b/lib/cartopy/mpl/geoaxes.py
--- a/lib/cartopy/mpl/geoaxes.py
+++ b/lib/cartopy/mpl/geoaxes.py
@@ -1499,7 +1499,7 @@ def gridlines(self, crs=None, draw_labels=False,
         the Y axis.
         """
         if crs is None:
-            crs = ccrs.PlateCarree()
+            crs = ccrs.PlateCarree(globe=self.projection.globe)
         from cartopy.mpl.gridliner import Gridliner
         gl = Gridliner(
             self, crs=crs, draw_labels=draw_labels, xlocator=xlocs,
diff --git a/lib/cartopy/mpl/ticker.py b/lib/cartopy/mpl/ticker.py
--- a/lib/cartopy/mpl/ticker.py
+++ b/lib/cartopy/mpl/ticker.py
@@ -19,9 +19,6 @@ class _PlateCarreeFormatter(Formatter):
     rectangular projection (e.g. Plate Carree, Mercator).
 
     """
-
-    _target_projection = ccrs.PlateCarree()
-
     def __init__(self, direction_label=True, degree_symbol='°',
                  number_format='g', transform_precision=1e-8, dms=False,
                  minute_symbol='′', second_symbol='″',
@@ -52,21 +49,14 @@ def __init__(self, direction_label=True, degree_symbol='°',
             cardinal_labels = {}
         self._cardinal_labels = cardinal_labels
         self._decimal_point = decimal_point
+        self._source_projection = None
+        self._target_projection = None
 
     def __call__(self, value, pos=None):
-        if self.axis is not None and isinstance(self.axis.axes, GeoAxes):
-
-            # We want to produce labels for values in the familiar Plate Carree
-            # projection, so convert the tick values from their own projection
-            # before formatting them.
-            source = self.axis.axes.projection
-            if not isinstance(source, (ccrs._RectangularProjection,
-                                       ccrs.Mercator)):
-                raise TypeError("This formatter cannot be used with "
-                                "non-rectangular projections.")
+        if self._source_projection is not None:
             projected_value = self._apply_transform(value,
                                                     self._target_projection,
-                                                    source)
+                                                    self._source_projection)
 
             # Round the transformed value using a given precision for display
             # purposes. Transforms can introduce minor rounding errors that
@@ -137,6 +127,24 @@ def _get_dms(self, x):
         secs = np.round((y - mins) * 60, self._precision - 3)
         return x, degs, mins, secs
 
+    def set_axis(self, axis):
+        super().set_axis(axis)
+
+        # Set the source and target projections for the formatter
+        # setting them to None if we aren't interacting with a GeoAxes
+        if self.axis is None or not isinstance(self.axis.axes, GeoAxes):
+            self._source_projection = None
+            self._target_projection = None
+            return
+
+        self._source_projection = self.axis.axes.projection
+        if not isinstance(self._source_projection, (ccrs._RectangularProjection,
+                                                    ccrs.Mercator)):
+            raise TypeError("This formatter cannot be used with "
+                            "non-rectangular projections.")
+        # The transforms need to use the same globe
+        self._target_projection = ccrs.PlateCarree(globe=self._source_projection.globe)
+
     def set_locs(self, locs):
         Formatter.set_locs(self, locs)
         if not self._auto_hide:


Test patch:
diff --git a/lib/cartopy/tests/crs/test_lambert_conformal.py b/lib/cartopy/tests/crs/test_lambert_conformal.py
--- a/lib/cartopy/tests/crs/test_lambert_conformal.py
+++ b/lib/cartopy/tests/crs/test_lambert_conformal.py
@@ -52,6 +52,14 @@ def test_specific_lambert():
     check_proj_params('lcc', crs, other_args)
 
 
+def test_lambert_moon():
+    moon = ccrs.Globe(ellipse=None, semimajor_axis=1737400, semiminor_axis=1737400)
+    crs = ccrs.LambertConformal(globe=moon)
+    other_args = {'a=1737400', 'b=1737400', 'lat_0=39.0', 'lat_1=33', 'lat_2=45',
+                  'lon_0=-96.0', 'x_0=0.0', 'y_0=0.0'}
+    check_proj_params('lcc', crs, other_args)
+
+
 class Test_LambertConformal_standard_parallels:
     def test_single_value(self):
         crs = ccrs.LambertConformal(standard_parallels=[1.])
diff --git a/lib/cartopy/tests/mpl/test_gridliner.py b/lib/cartopy/tests/mpl/test_gridliner.py
--- a/lib/cartopy/tests/mpl/test_gridliner.py
+++ b/lib/cartopy/tests/mpl/test_gridliner.py
@@ -56,7 +56,7 @@
 
 @pytest.mark.natural_earth
 # Robinson projection is slightly better in Proj 6+.
-@pytest.mark.mpl_image_compare(filename='gridliner1.png', tolerance=0.7)
+@pytest.mark.mpl_image_compare(filename='gridliner1.png', tolerance=0.73)
 def test_gridliner():
     ny, nx = 2, 4
 
@@ -303,7 +303,7 @@ def test_grid_labels_inline(proj):
     else:
         kwargs = {}
     ax = fig.add_subplot(projection=proj(**kwargs))
-    ax.gridlines(draw_labels=True, auto_inline=True)
+    ax.gridlines(crs=ccrs.PlateCarree(), draw_labels=True, auto_inline=True)
     ax.coastlines(resolution="110m")
     return fig
 
@@ -584,3 +584,13 @@ def test_gridliner_labels_zoom():
     # After zoom, we may not be using all the available labels.
     assert len(gl._all_labels) == 24
     assert gl._labels == gl._all_labels[:20]
+
+
+def test_gridliner_with_globe():
+    fig = plt.figure()
+    proj = ccrs.PlateCarree(globe=ccrs.Globe(semimajor_axis=12345))
+    ax = fig.add_subplot(1, 1, 1, projection=proj)
+    gl = ax.gridlines()
+    fig.draw_without_rendering()
+
+    assert gl in ax.artists
diff --git a/lib/cartopy/tests/mpl/test_ticker.py b/lib/cartopy/tests/mpl/test_ticker.py
--- a/lib/cartopy/tests/mpl/test_ticker.py
+++ b/lib/cartopy/tests/mpl/test_ticker.py
@@ -23,16 +23,15 @@
 @pytest.mark.parametrize('cls', [LatitudeFormatter, LongitudeFormatter])
 def test_formatter_bad_projection(cls):
     formatter = cls()
-    formatter.axis = Mock(axes=Mock(GeoAxes, projection=ccrs.Orthographic()))
     match = r'This formatter cannot be used with non-rectangular projections\.'
     with pytest.raises(TypeError, match=match):
-        formatter(0)
+        formatter.set_axis(Mock(axes=Mock(GeoAxes, projection=ccrs.Orthographic())))
 
 
 def test_LatitudeFormatter():
     formatter = LatitudeFormatter()
     p = ccrs.PlateCarree()
-    formatter.axis = Mock(axes=Mock(GeoAxes, projection=p))
+    formatter.set_axis(Mock(axes=Mock(GeoAxes, projection=p)))
     test_ticks = [-90, -60, -30, 0, 30, 60, 90]
     result = [formatter(tick) for tick in test_ticks]
     expected = ['90°S', '60°S', '30°S', '0°', '30°N', '60°N', '90°N']
@@ -42,7 +41,7 @@ def test_LatitudeFormatter():
 def test_LatitudeFormatter_direction_label():
     formatter = LatitudeFormatter(direction_label=False)
     p = ccrs.PlateCarree()
-    formatter.axis = Mock(axes=Mock(GeoAxes, projection=p))
+    formatter.set_axis(Mock(axes=Mock(GeoAxes, projection=p)))
     test_ticks = [-90, -60, -30, 0, 30, 60, 90]
     result = [formatter(tick) for tick in test_ticks]
     expected = ['-90°', '-60°', '-30°', '0°', '30°', '60°', '90°']
@@ -52,7 +51,7 @@ def test_LatitudeFormatter_direction_label():
 def test_LatitudeFormatter_degree_symbol():
     formatter = LatitudeFormatter(degree_symbol='')
     p = ccrs.PlateCarree()
-    formatter.axis = Mock(axes=Mock(GeoAxes, projection=p))
+    formatter.set_axis(Mock(axes=Mock(GeoAxes, projection=p)))
     test_ticks = [-90, -60, -30, 0, 30, 60, 90]
     result = [formatter(tick) for tick in test_ticks]
     expected = ['90S', '60S', '30S', '0', '30N', '60N', '90N']
@@ -62,7 +61,7 @@ def test_LatitudeFormatter_degree_symbol():
 def test_LatitudeFormatter_number_format():
     formatter = LatitudeFormatter(number_format='.2f', dms=False)
     p = ccrs.PlateCarree()
-    formatter.axis = Mock(axes=Mock(GeoAxes, projection=p))
+    formatter.set_axis(Mock(axes=Mock(GeoAxes, projection=p)))
     test_ticks = [-90, -60, -30, 0, 30, 60, 90]
     result = [formatter(tick) for tick in test_ticks]
     expected = ['90.00°S', '60.00°S', '30.00°S', '0.00°',
@@ -73,7 +72,7 @@ def test_LatitudeFormatter_number_format():
 def test_LatitudeFormatter_mercator():
     formatter = LatitudeFormatter()
     p = ccrs.Mercator()
-    formatter.axis = Mock(axes=Mock(GeoAxes, projection=p))
+    formatter.set_axis(Mock(axes=Mock(GeoAxes, projection=p)))
     test_ticks = [-15496570.739707904, -8362698.548496634,
                   -3482189.085407435, 0.0, 3482189.085407435,
                   8362698.548496634, 15496570.739707898]
@@ -85,7 +84,7 @@ def test_LatitudeFormatter_mercator():
 def test_LatitudeFormatter_small_numbers():
     formatter = LatitudeFormatter(number_format='.7f', dms=False)
     p = ccrs.PlateCarree()
-    formatter.axis = Mock(axes=Mock(GeoAxes, projection=p))
+    formatter.set_axis(Mock(axes=Mock(GeoAxes, projection=p)))
     test_ticks = [40.1275150, 40.1275152, 40.1275154]
     result = [formatter(tick) for tick in test_ticks]
     expected = ['40.1275150°N', '40.1275152°N', '40.1275154°N']
@@ -97,7 +96,7 @@ def test_LongitudeFormatter_direction_label():
                                    dateline_direction_label=True,
                                    zero_direction_label=True)
     p = ccrs.PlateCarree()
-    formatter.axis = Mock(axes=Mock(GeoAxes, projection=p))
+    formatter.set_axis(Mock(axes=Mock(GeoAxes, projection=p)))
     test_ticks = [-180, -120, -60, 0, 60, 120, 180]
     result = [formatter(tick) for tick in test_ticks]
     expected = ['-180°', '-120°', '-60°', '0°', '60°', '120°', '180°']
@@ -116,7 +115,7 @@ def test_LongitudeFormatter_central_longitude(central_longitude, kwargs,
                                               expected):
     formatter = LongitudeFormatter(**kwargs)
     p = ccrs.PlateCarree(central_longitude=central_longitude)
-    formatter.axis = Mock(axes=Mock(GeoAxes, projection=p))
+    formatter.set_axis(Mock(axes=Mock(GeoAxes, projection=p)))
     test_ticks = [-180, -120, -60, 0, 60, 120, 180]
     result = [formatter(tick) for tick in test_ticks]
     assert result == expected
@@ -126,7 +125,7 @@ def test_LongitudeFormatter_degree_symbol():
     formatter = LongitudeFormatter(degree_symbol='',
                                    dateline_direction_label=True)
     p = ccrs.PlateCarree()
-    formatter.axis = Mock(axes=Mock(GeoAxes, projection=p))
+    formatter.set_axis(Mock(axes=Mock(GeoAxes, projection=p)))
     test_ticks = [-180, -120, -60, 0, 60, 120, 180]
     result = [formatter(tick) for tick in test_ticks]
     expected = ['180W', '120W', '60W', '0', '60E', '120E', '180E']
@@ -137,7 +136,7 @@ def test_LongitudeFormatter_number_format():
     formatter = LongitudeFormatter(number_format='.2f', dms=False,
                                    dateline_direction_label=True)
     p = ccrs.PlateCarree()
-    formatter.axis = Mock(axes=Mock(GeoAxes, projection=p))
+    formatter.set_axis(Mock(axes=Mock(GeoAxes, projection=p)))
     test_ticks = [-180, -120, -60, 0, 60, 120, 180]
     result = [formatter(tick) for tick in test_ticks]
     expected = ['180.00°W', '120.00°W', '60.00°W', '0.00°',
@@ -148,7 +147,7 @@ def test_LongitudeFormatter_number_format():
 def test_LongitudeFormatter_mercator():
     formatter = LongitudeFormatter(dateline_direction_label=True)
     p = ccrs.Mercator()
-    formatter.axis = Mock(axes=Mock(GeoAxes, projection=p))
+    formatter.set_axis(Mock(axes=Mock(GeoAxes, projection=p)))
     test_ticks = [-20037508.342783064, -13358338.895188706,
                   -6679169.447594353, 0.0, 6679169.447594353,
                   13358338.895188706, 20037508.342783064]
@@ -166,7 +165,7 @@ def test_LongitudeFormatter_small_numbers(central_longitude,
     formatter = LongitudeFormatter(number_format='.7f', dms=False,
                                    zero_direction_label=zero_direction_label)
     p = ccrs.PlateCarree(central_longitude=central_longitude)
-    formatter.axis = Mock(axes=Mock(GeoAxes, projection=p))
+    formatter.set_axis(Mock(axes=Mock(GeoAxes, projection=p)))
     test_ticks = [-17.1142343, -17.1142340, -17.1142337]
     result = [formatter(tick) for tick in test_ticks]
     assert result == expected