-
Notifications
You must be signed in to change notification settings - Fork 389
Description
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:
cartopy/lib/cartopy/mpl/geoaxes.py
Line 1498 in 22cdafc
crs = ccrs.PlateCarree() cartopy/lib/cartopy/mpl/ticker.py
Line 23 in 22cdafc
_target_projection = ccrs.PlateCarree()
both of which assume aPlateCarree()
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.
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