Skip to content

Projections with non-Earth radii do not work correctly #2007

@dennissergeev

Description

@dennissergeev

Description

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: SciTools/iris#4582

The reason for this error are on the following lines of code:

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.

Code to reproduce

The quickest example to reproduce this bug is to run the following in Jupyter:

ccrs.PlateCarree(globe=ccrs.Globe(semimajor_axis=12345))

Traceback

ProjError: Error creating Transformer from CRS.: (Internal Proj Error: proj_create_operations: Source and target ellipsoid do not belong to the same celestial body)
Full traceback
---------------------------------------------------------------------------
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)
Full environment definition

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions