SciTools / cartopy

Cartopy - a cartographic python library with matplotlib support
https://scitools.org.uk/cartopy/docs/latest
BSD 3-Clause "New" or "Revised" License
1.42k stars 362 forks source link

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

Closed dennissergeev closed 10 months ago

dennissergeev commented 2 years ago

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: https://github.com/SciTools/iris/issues/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 ```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..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..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..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) 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..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..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..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..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..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 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 ```
gosselgj commented 2 years ago

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

dennissergeev commented 2 years ago

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...

gosselgj commented 2 years ago

No problem, and I agree that it would be incredibly helpful to implement some non-terrestrial ellipsoids.

cgallinger commented 11 months ago

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.

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

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.)
Full traceback ```python Traceback (most recent call last): File "/var/folders/n3/mhlpcdr96z3279lyvq_sf1bm0000gn/T/ipykernel_71540/750241958.py", line 1, in 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.) ```
Full environment definition ### 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 ```