Recent Releases of eomaps

eomaps - EOmaps v8.3.3

A minor bugfix release with 2 small new features

๐Ÿ”จ Fixes

  • fix m.add_wms.get_service not working for wmts services
  • fix companion-widget hidden on first keypress
  • fix companion-widget not closed if parent figure is closed
  • fix broken WebMap urls for Austrian webmaps

๐ŸŒณ New

  • There is a new option for m.set_frame() to use country-borders as map frame. python m = Maps() m.set_frame(countries=["Austria", "Italy"], facecolor="k")
  • codespell has been added to the pre-commit hooks to detect common typos ( thanks to @nathanjmcdougall )

- Python
Published by raphaelquast 9 months ago

eomaps - EOmaps v8.3.2

A minor bugfix release that addresses some pending issues.

๐Ÿ”จ Fixes

  • โ—fix m.set_shape.contour() if matplotlib >=3.10 is used
  • fix AttributeError: 'Figure' object has no attribute '_mpl_orig_savefig'
  • fix readthedocs builds (e.g. add "sphinx configuration key")

๐ŸŒณ New

  • You can now provide the crs also as a string, e.g: m = Maps(crs="EPSG:4326")

- Python
Published by raphaelquast about 1 year ago

eomaps - EOmaps v8.3.1

๐Ÿ”จ Fixes

  • fix minor dependency issues reported on conda-forge

EOmaps v8.3

A new minor release that brings a few features and a much improved documentation!

๐ŸŒณ New

  • There is a new method ScaleBar.set_rotation to set the rotation-angle of a scalebar.
  • m.set_frame(gdf=...) can now be used to set arbitrary map-boundaries based on geopandas.GeoDataFrames
    (multipolygon support requires upcoming cartopy v0.24 release)
  • There is a new contextmanager Maps.delay_draw that can be used to delay intermediate draw-events and speed up the creation of complex figures.

๐Ÿ“– Documentation updates and new theme

๐Ÿš€ Big thanks to @Fanchengyan for his efforts to improve the documentation!

๐Ÿ”จ Fixes

  • Fix issues with "inherit_position=False" for colorbars
  • Make sure cached layers are re-drawn if a colorbar changes the axes-size
  • Fix treatment of assigned "search_radius" for pick callbacks if 1D brute-force search is used
  • Update GitHub actions and documentation dependencies

- Python
Published by raphaelquast over 1 year ago

eomaps - EOmaps v8.3

A new minor release that brings a few features and a much improved documentation!

๐ŸŒณ New

  • There is a new method ScaleBar.set_rotation to set the rotation-angle of a scalebar.
  • m.set_frame(gdf=...) can now be used to set arbitrary map-boundaries based on geopandas.GeoDataFrames
    (multipolygon support requires upcoming cartopy v0.24 release)
  • There is a new contextmanager Maps.delay_draw that can be used to delay intermediate draw-events and speed up the creation of complex figures.

๐Ÿ“– Documentation updates and new theme

๐Ÿš€ Big thanks to @Fanchengyan for his efforts to improve the documentation!

๐Ÿ”จ Fixes

  • Fix issues with "inherit_position=False" for colorbars
  • Make sure cached layers are re-drawn if a colorbar changes the axes-size
  • Fix treatment of assigned "search_radius" for pick callbacks if 1D brute-force search is used
  • Update GitHub actions and documentation dependencies

- Python
Published by raphaelquast over 1 year ago

eomaps - EOmaps v8.2.1

A first series of bugfixes for v8.2

๐Ÿ”จ Fixes

  • โ—Fix identification of default shape based on dataset size
  • โ—Fix issues with unmanaged artists on inset-maps
  • Explicitly check if norm is provided as string before setting data limits
  • Provide more descriptive (info) error message if data cannot be plotted
  • Avoid using classification bins as labels if a large number of bins is used (>30)
  • Make sure to resample colormaps in case more bins than colors are used
  • Avoid shape radius estimation if no data is set
  • Avoid unnecessary draw-triggers for datasets if the "all" layer is visible
  • Remove warning for widgets if backends other than "ipympl" are used

- Python
Published by raphaelquast almost 2 years ago

eomaps - EOmaps v8.2

A new minor release with some fixes, many improvements to the internals and a few new features!

๐ŸŒณ New

  • You can now use m.add_colorbar(layer=..) to override the layer at which the colorbar is plotted
  • There is a new method m.set_shade_dpi(...) to override the dpi used by shade-shapes. (Useful to fix data aggregation resolution for high-dpi exports or to adjust resolution to better suit data density)

๐ŸŒฆ๏ธ Changes

  • Grid-snapping of the LayoutEditor now snaps to all edges of the axes (Useful in case the axis-size is not a multiple of the grid-spacing)
    • If multiple axes are moved, the first selected object acts as anchor
  • โ— The default matplotlib keymap p : "toggle pan/zoom tool" is now active again
๐ŸŒฉ๏ธ Internals (no effects on the public API)
  • Unit-tests now use image-comparison to ensure stable image export results
  • โ— The Maps class has been refactored (Maps and MapsBase) to make the code more accessible and easier to handle.

๐Ÿ”จ Fixes

  • fix handling of axes on combined layers in the LayoutEditor
  • allow custom scatter_points marker shapes for "mark" callback
  • fix issues with identification of grid-label position with projections that create non-intersecting grid-lines
  • always print basic exception info on issue during layer-change action
  • make sure to trigger a figure-update after adding a scalebar
  • address pyproj warnings for pyproj>=3.5

- Python
Published by raphaelquast almost 2 years ago

eomaps - EOmaps v8.1.1

A quick bugfix release to address issues with disappearing colorbars on multiple layers.

EOmaps v8.1.1

๐Ÿ”จ Fixes

  • โ— Fix colorbars on different layers only show after additional draw
  • Handle numpy linalg errors resulting from singular colorbar axes

EOmaps v8.1

A minor release that brings a new plot-shape!

Make sure to also checkout the release-notes for EOmaps v8.0!

๐ŸŒณ New

New hexbin shape

There is a new shape to visualize your data as hexagonal-bin plots! python m.set_shape.hexbin(size=(20, 40), aggregator="mean")

๐Ÿ”จ Fixes

  • โ— fix using multiple sizes with m.set_shape.scatter_points(size=...)
  • Fix scroll events should be captured in Jupyter Notebooks if the LayoutEditor is active
  • Fix placement of InsetMaps indicator-lines if multiple boundary intersections are found
  • Fix clipping issues if m.get_extent() is used with a crs other than the plot-crs
  • Fix using m.add_gridlines with uneven number of explicit lon/lat values
  • Unify treatment of ellipses and geod_circle shapes
  • Fix using kwargs to style the boundary of the peek_layer callback area
  • Fix using "hist_size=None" when adding colorbars
  • Fix hiding histogram axes with hist_size=0
  • Fix identification of layers that contain only dynamic artists
  • Fix issues with scalebars outside the axes clip boundary
  • Allow passing an explicit norm to m.plot_map if no classification is used
  • Allow using bbox=None with annotations to to hide the bounding-box
  • Identification of the directions for m.add_gridlines(where="tblr") has been improved

- Python
Published by raphaelquast almost 2 years ago

eomaps - EOmaps v8.1

A minor release that brings a new plot-shape!

Make sure to also checkout the release-notes for EOmaps v8.0!

๐ŸŒณ New

New hexbin shape

There is a new shape to visualize your data as hexagonal-bin plots! python m.set_shape.hexbin(size=(20, 40), aggregator="mean")

๐Ÿ”จ Fixes

  • โ— fix using multiple sizes with m.set_shape.scatter_points(size=...)
  • Fix scroll events should be captured in Jupyter Notebooks if the LayoutEditor is active
  • Fix placement of InsetMaps indicator-lines if multiple boundary intersections are found
  • Fix clipping issues if m.get_extent() is used with a crs other than the plot-crs
  • Fix using m.add_gridlines with uneven number of explicit lon/lat values
  • Unify treatment of ellipses and geod_circle shapes
  • Fix using kwargs to style the boundary of the peek_layer callback area
  • Fix using "hist_size=None" when adding colorbars
  • Fix hiding histogram axes with hist_size=0
  • Fix identification of layers that contain only dynamic artists
  • Fix issues with scalebars outside the axes clip boundary
  • Allow passing an explicit norm to m.plot_map if no classification is used
  • Allow using bbox=None with annotations to to hide the bounding-box
  • Identification of the directions for m.add_gridlines(where="tblr") has been improved

- Python
Published by raphaelquast almost 2 years ago

eomaps - EOmaps v8.0.2

EOmaps v8.0.2

  • fix issues with missing companion-widget source files
  • fix issues with missing dask-expr dependency for datashader

EOmaps v8.0

A new major release that brings a lot of important updates and improvements for EOmaps!

A big thanks goes to @banesullivan, @yeelauren and @jhkennedy who provided many useful suggestions and comments to improve EOmaps in the PyOpenSci review (https://github.com/pyOpenSci/software-submission/issues/138)!

ยง New License!

The EOmaps source code is now licensed under a BSD 3 Clause License to make it easier for users and contributors to improve and extend the codebase and to use EOmaps to build awesome tools for geo-data analysis!

Make sure to have a look at the licensing-note in the FAQ of the docs for some more details!

Interested in contributing to EOmaps? Checkout the updated Contribution Guide!

โš ๏ธ Major changes to pip install

Dependency management for EOmaps has been improved to split between required and optional dependencies.

โ—pip install eomaps now only installs the bare minimum requirements to run EOmaps. โ—To install EOmaps with all optional dependencies, use pip install eomaps[all].

Make sure to have a look at the updated installation instructions in the docs for more details on how to selectively install optional dependencies!

๐ŸŒณ New

  • m.set_data(...) now directly accepts xarray.Datasets as input (see docs on how to assign datasets)
  • There is a new pre-defined keypress callback: overlay_layer
    • You can use it to toggle showing a layer on top of the currently visible layer. python m.all.cb.keypress.attach.overlay_layer(<layer-name>, key="a")
  • The switch_layer keypress-callback now also accepts lists of layer-names (or lists of tuples (name, transparency))
  • m.cb.pick.share_events() now supports the additional kwarg "ensure_same_id"
    • If True, all maps that share the pick-event will use the same ID to identify the relevant datapoint
    • If False, all maps that share the pick-event identify the closest datapoint based on the (reprojected) click position.
  • The LayoutEditor now accepts -1 as width/height value for axes (to auto-adjust the value)

๐Ÿ•น๏ธ Jupyter Widgets

There is now a collection of pre-configured Jupyter Widgets that can be used as control elements in Jupyter Notebooks!

Make sure to checkout the corresponding ๐Ÿ•น๏ธ EOmaps Jupyter Widgets section in the docs!

๐ŸŒฆ๏ธ Changes

  • โ— Installation config is now provided as a pyproject.toml file (instead of setup.py)
  • โ— Supported python version is now >=3.8
  • EOmaps now uses qtpy to support multiple Qt versions for the ๐Ÿงฐ Companion Widget!
  • _version.py has been removed. The version is now specified in the [project] category of the pyproject.toml file.
  • Actions now use micromamba to setup (and cache) test environments
  • Colorbar kwargs show_outline and ylabel have been renamed to outline and hist_label

The following (previously deprecated) methods are now removed: - m.set_data_specs $\Rightarrow$ use m.set_data instead - m.add_wms.DLR_basemaps... $\Rightarrow$ use m.add_wms.DLR.basemap... instead - m_inset.indicate_inset_extent $\Rightarrow$ use m_inset.add_extent_indicator instead

๐Ÿ“– Documentation updates

Make sure to checkout the fully updated API docs!

  • Documentation environment was updated to most recent build dependencies
  • Only minimal requirements to import eomaps are now installed for docs-build
  • Info on how to configure VSCode/VSCodium for EOmaps has been added to the docs
  • In general, the docs now (gradually switch to) use MySt and Jupyter Notebooks (parsed with myst_nb) to improve formatting, examples etc.

๐Ÿ”จ Fixes

  • Make sure the widget is compatible with both Qt5 and Qt6
  • Fix forcing colorbar-position inheritance
  • Fix treatment of colorbar histogram style kwargs (e.g. edgecolor, facecolor, etc.)
  • Address numpy binary incompatibility warning if netCDF4 is imported after numpy
  • Fix inheriting colorbar positions from other colorbars
  • Address unittest issue with contour-shape labels
  • Avoid blocking the terminal in unittests for jupyter notebooks
  • Fix missing docstring for DLR webmap service
  • Fix issues for move-callbacks shared between multiple Maps
  • Fix visibility of datasets when using "dynamicshadeindicator" colorbars
  • Fix assignment of vmin/vmax for "count" based shade-aggregation
  • Fix treatment of masked values in evaluation of vmin/vmax for encoded datasets
  • Fix issues with help-text popups of the CompanionWidget LayerTabBar
  • Improvements for colorbar implementation
  • Unify treatment of layer-name parsing
  • Try to push current view to toolbar nav-stack after layout-restore
  • Fix issues with help-popups of the LayerTabBar of the companion-widget
  • Fix issues with figure-exports after m.apply_layout(...)
  • Fix treatment of reprojected 1D datasets with shade_raster shape
  • Fix parsing maxsize argument in companion widget for raster-shape
  • Fix treatment of infinite values in weighted colorbar histograms
  • Allow passing transform-kwarg to m.add_text(...)
  • Fix truncating companion-widget title if too long
  • Make sure companion-widget dataset-dropdown is elided
  • Avoid memory-leaks caused by artist-references in pick-containers
  • Fix numpy.ma.masked_array issues with datashader/numba when using "shade_points"
  • Fix handling pick-events that do not have an "idx" property
  • Fix raster-aggregation if block-size cannot be evaluated (e.g. None)
  • Fix handling of pick-events that do not have an "idx" property
  • Make sure keypress-events are triggered irrespective of the toolbar mode
  • Make sure LayoutEditor x0, y0 values are always set as specified
  • Fix issues with string-type dpi values passed to savefig
  • Avoid pandas dependency when attempting to use raster shape with 1D datasets
  • Make sure data encoding fill-value is properly applied

- Python
Published by raphaelquast almost 2 years ago

eomaps - EOmaps v8.0.1

A new major release that brings a lot of important updates and improvements for EOmaps!

A big thanks goes to @banesullivan, @yeelauren and @jhkennedy who provided many useful suggestions and comments to improve EOmaps in the PyOpenSci review (https://github.com/pyOpenSci/software-submission/issues/138)!

ยง New License!

The EOmaps source code is now licensed under a BSD 3 Clause License to make it easier for users and contributors to improve and extend the codebase and to use EOmaps to build awesome tools for geo-data analysis!

Make sure to have a look at the licensing-note in the FAQ of the docs for some more details!

Interested in contributing to EOmaps? Checkout the updated Contribution Guide!

โš ๏ธ Major changes to pip install

Dependency management for EOmaps has been improved to split between required and optional dependencies.

โ—pip install eomaps now only installs the bare minimum requirements to run EOmaps. โ—To install EOmaps with all optional dependencies, use pip install eomaps[all].

Make sure to have a look at the updated installation instructions in the docs for more details on how to selectively install optional dependencies!

๐ŸŒณ New

  • m.set_data(...) now directly accepts xarray.Datasets as input (see docs on how to assign datasets)
  • There is a new pre-defined keypress callback: overlay_layer
    • You can use it to toggle showing a layer on top of the currently visible layer. python m.all.cb.keypress.attach.overlay_layer(<layer-name>, key="a")
  • The switch_layer keypress-callback now also accepts lists of layer-names (or lists of tuples (name, transparency))
  • m.cb.pick.share_events() now supports the additional kwarg "ensure_same_id"
    • If True, all maps that share the pick-event will use the same ID to identify the relevant datapoint
    • If False, all maps that share the pick-event identify the closest datapoint based on the (reprojected) click position.
  • The LayoutEditor now accepts -1 as width/height value for axes (to auto-adjust the value)

๐Ÿ•น๏ธ Jupyter Widgets

There is now a collection of pre-configured Jupyter Widgets that can be used as control elements in Jupyter Notebooks!

Make sure to checkout the corresponding ๐Ÿ•น๏ธ EOmaps Jupyter Widgets section in the docs!

๐ŸŒฆ๏ธ Changes

  • โ— Installation config is now provided as a pyproject.toml file (instead of setup.py)
  • โ— Supported python version is now >=3.8
  • EOmaps now uses qtpy to support multiple Qt versions for the ๐Ÿงฐ Companion Widget!
  • _version.py has been removed. The version is now specified in the [project] category of the pyproject.toml file.
  • Actions now use micromamba to setup (and cache) test environments
  • Colorbar kwargs show_outline and ylabel have been renamed to outline and hist_label

The following (previously deprecated) methods are now removed: - m.set_data_specs $\Rightarrow$ use m.set_data instead - m.add_wms.DLR_basemaps... $\Rightarrow$ use m.add_wms.DLR.basemap... instead - m_inset.indicate_inset_extent $\Rightarrow$ use m_inset.add_extent_indicator instead

๐Ÿ“– Documentation updates

Make sure to checkout the fully updated API docs!

  • Documentation environment was updated to most recent build dependencies
  • Only minimal requirements to import eomaps are now installed for docs-build
  • Info on how to configure VSCode/VSCodium for EOmaps has been added to the docs
  • In general, the docs now (gradually switch to) use MySt and Jupyter Notebooks (parsed with myst_nb) to improve formatting, examples etc.

๐Ÿ”จ Fixes

  • Make sure the widget is compatible with both Qt5 and Qt6
  • Fix forcing colorbar-position inheritance
  • Fix treatment of colorbar histogram style kwargs (e.g. edgecolor, facecolor, etc.)
  • Address numpy binary incompatibility warning if netCDF4 is imported after numpy
  • Fix inheriting colorbar positions from other colorbars
  • Address unittest issue with contour-shape labels
  • Avoid blocking the terminal in unittests for jupyter notebooks
  • Fix missing docstring for DLR webmap service
  • Fix issues for move-callbacks shared between multiple Maps
  • Fix visibility of datasets when using "dynamicshadeindicator" colorbars
  • Fix assignment of vmin/vmax for "count" based shade-aggregation
  • Fix treatment of masked values in evaluation of vmin/vmax for encoded datasets
  • Fix issues with help-text popups of the CompanionWidget LayerTabBar
  • Improvements for colorbar implementation
  • Unify treatment of layer-name parsing
  • Try to push current view to toolbar nav-stack after layout-restore
  • Fix issues with help-popups of the LayerTabBar of the companion-widget
  • Fix issues with figure-exports after m.apply_layout(...)
  • Fix treatment of reprojected 1D datasets with shade_raster shape
  • Fix parsing maxsize argument in companion widget for raster-shape
  • Fix treatment of infinite values in weighted colorbar histograms
  • Allow passing transform-kwarg to m.add_text(...)
  • Fix truncating companion-widget title if too long
  • Make sure companion-widget dataset-dropdown is elided
  • Avoid memory-leaks caused by artist-references in pick-containers
  • Fix numpy.ma.masked_array issues with datashader/numba when using "shade_points"
  • Fix handling pick-events that do not have an "idx" property
  • Fix raster-aggregation if block-size cannot be evaluated (e.g. None)
  • Fix handling of pick-events that do not have an "idx" property
  • Make sure keypress-events are triggered irrespective of the toolbar mode
  • Make sure LayoutEditor x0, y0 values are always set as specified
  • Fix issues with string-type dpi values passed to savefig
  • Avoid pandas dependency when attempting to use raster shape with 1D datasets
  • Make sure data encoding fill-value is properly applied

- Python
Published by raphaelquast almost 2 years ago

eomaps - EOmaps v8.0rc2

A third release-candidate for EOmaps v8.

For a full list of upcoming changes, fixes and improvements, see #205

- Python
Published by raphaelquast almost 2 years ago

eomaps - EOmaps v8.0rc1

A second release-candidate for EOmaps v8.

For a full list of upcoming changes, fixes and improvements, see #205

- Python
Published by raphaelquast almost 2 years ago

eomaps - EOmaps v8.0rc0

A first release-candidate for EOmaps v8.

For a full list of upcoming changes, fixes and improvements, see #205

- Python
Published by raphaelquast almost 2 years ago

eomaps - EOmaps v7.3.3

Another round of bug-fixes for v7.3.

๐ŸŒณ New

  • MapsGrid objects now have dedicated .show() and .snapshot() methods

๐Ÿ”จ Fixes

  • โ— fix restoring visible layer in interactive backends after using m.savefig()
  • โ— fix issues with InsetMaps in ipympl backend
  • fix re-drawing spines with m.set_frame() if corners are not rounded
  • fix colorbar should use figure directly instead of relying on plt.gcf
  • fix re-fetching backgrounds if colorbars change axes sizes
  • fix parsing "maxsize" argument for raster-shape in companion-widget
  • fix treatment of weighted colorbar histograms with (outofrange_vals="masked")

- Python
Published by raphaelquast about 2 years ago

eomaps - EOmaps v7.3.2

A second bugfix release for v7.3 that brings some important fixes for Jupyter Notebooks, custom WebMap services and RGB/RGBA composite plots.

๐ŸŒณ New

  • Style kwargs are now supported when adding multiple preset-features in one go, for example:
    python m = Maps() m.add_feature.preset("coastline", "ocean", "land", alpha=0.5)
  • You can now specify additional wms properties when using custom WebMap services, for example: python my_wms = m.add_wms.get_service("service-url", service_type="wms", version=1.3.0)

๐ŸŒฆ๏ธ Changes

  • The figure-header added by the Jupyter-notebook ipympl backend is now hidden by default. To revert back to the old behavior (and enable the header), use: python %matplotlib widget m = Maps() m.f.canvas.header_visible = True

๐Ÿ”จ fixes

  • โ— fix issues with RGB/RGBA composite plots
  • โ— fix UserDefined Classification issue: max-bin replaced by data-max
  • โ— fix using transparent snapshots in IPython/Jupyter Notebooks
  • fix duplicated figures shown in jupyter notebooks inline backend
  • fix re-fetching backgrounds and spines with m.set_frame()
  • fix using m.set_frame() in jupyter notebook inline backend
  • improve syntax for disabling draw or update in the BlitManager
  • improve handling of issues with "tight_bbox" redraws
  • avoid logging during draw on higher levels
  • avoid turning off interactive mode with the jupyter notebook inline backend
  • allow passing kwargs to custom WebMap services

- Python
Published by raphaelquast about 2 years ago

eomaps - EOmaps v7.3.1

A first series of bugfixes for v7.3.

๐ŸŒฆ๏ธ changes

  • InsetMap indicator lines are now only drawn between the boundaries of the InsetMap and its extent.

You can add markers at the connection points with:

python m_inset.add_indicator_line(m, marker="o", markersize=10)

๐Ÿ”จ Fixes

  • fix re-drawing backgrounds on add/remove gridlines and gridlabels
  • fix re-drawing backgrounds on m.set_frame
  • fix triggering on_layer callbacks defined on InsetMaps
  • fix custom text positioning with m.add_title
  • fix handling of multiple inset-indicator lines
  • fix passing InsetMap boundary colors as RGBA tuples

- Python
Published by raphaelquast over 2 years ago

eomaps - EOmaps v7.3

A new minor release that brings a lot of fixes and some nice new functionalities!

๐ŸŒณ New

  • There is a new convenience method to quickly update the properties of the frame of a map:
    • set boundary line properties and use rounded corners for map boundaries
    • set background patch color

python m = Maps() m.set_frame(rounded=0.5, edgecolor="r", linewidth=2, facecolor="0.5")

grafik

  • m.add_annotation() and m.add_marker() now support the "update" kwarg to override update triggers (useful to avoid unnecessary updates if multiple dynamic annotations/markers are added in a callback)
  • m.add_gdf() now supports the "permanent" kwarg to control if artists are updated on each event or added as background-artists
  • The ๐Ÿš€ Contribution guide contains a new chapter on how to build the docs!

๐ŸŒฆ๏ธ Changes

  • โ— Using m.show() no longer activates the layer associated with the calling Maps object. (use m.show_layer(m.layer) to show the layer of a selected Maps object!)
  • Activating the AnnotationEditor now clears all currently visible temporary artists and disables all callbacks

๐Ÿ”จ Fixes

  • โ—fix zooming datasets with individual shape sizes for each datapoints
  • โ—fix using the save-button in the normal matplotlib toolbar to save a figure
  • โ—fix custom axis background patch color is only visible on figure export
  • โ—fix grid-labels are not properly updated on pan/zoom events
  • fix identification of layers that only exist on InsetMaps
  • fix annotation editor clears annotation text on companion-widget init
  • fix all-nan slice warnings on vmin/vmax estimation if no data-values are provided
  • fix single geod_circle radius parsed to 1D array in setter
  • fix using m.add_gdf(permanent=False) to add dynamically updated geometries
  • fix annotation editor issues if annotation is not attached to the figure
  • fix m.get_extent() should not return coordinates outside the crs bounds
  • fix closing companion-widgets of child-maps on figure close
  • fix clearing snapshot cells with m.show()
  • fix m.util.layer_selector() should remain responsive during toolbar actions
  • fix using m.cb.<method>.set_execute_during_toolbar_action() on child Maps objects
  • improve handling of errors during snapshot creation
  • remove rtree and add default python version to development env file
  • fix restoring axes backgrounds in gui after savefig

- Python
Published by raphaelquast over 2 years ago

eomaps - EOmaps v7.2.1

A first bugfix release for v7.2 that also brings some nice performance improvements!

Make sure to also check the release-notes for EOmaps v7.2!

๐Ÿ”จ Fixes

  • โ— Fix issues with aggregated datasets outside the currently visible extent
  • โ— Fix displacement of grid-labels on figure export with dpi other than the native dpi
  • โ— Fix dataset export issues with "agg" backend on some of the plot-shapes
  • general performance updates for background-fetching and caching
  • avoid activating the companion widget when webagg backend is active

๐ŸŒณ New

  • New method for raster-data aggregation: "mode" (e.g. most common value)
  • The behavior of callbacks during toolbar actions can now be set via
    m.cb.<method>.set_execute_during_toolbar_action()
  • New .remove() method for grid-lalbels

๐ŸŒฆ๏ธ Changes

  • To avoid issues with "webagg" derived backends, custom "move" callbacks no longer trigger automatic updates of the plot.
    • โ— Explicitly call m.BM.update() in custom move-callbacks to trigger an update!

- Python
Published by raphaelquast over 2 years ago

eomaps - EOmaps v7.2

A mew minor release that brings a lot of improvements for raster-data visualization!

๐ŸŒณ New

Major improvements for raster-data visualization!

The raster-shape (e.g. m.set_shape.raster) now has data-aggregation capabilities!

This means that the raster shape can now be used also for arbitrarily sized datasets (as long as they fit in memory) (so far tested with datasets up to 2 billion datapoints)

In short, this means: - Datasets larger than maxsize will be aggregated prior to plotting to avoid slow load-times for extremely large datasets - Aggregation can be turned off using maxsize=None (e.g. to get the behavior prior to v7.2) - By default, only datasets larger than 5 million datapoints will be aggregated prior to plotting

For more details, check the docs for the raster-shape!

๐Ÿ”จ Fixes

  • โ— avoid activating matplotlibs interactive mode by default
  • fix identification of data-limits and colormap for GeoTiffs

๐ŸŒฆ๏ธ Changes

  • raster is now used as default plot shape also for very large datasets

- Python
Published by raphaelquast over 2 years ago

eomaps - EOmaps v7.1.2

A second minor bugfix release for v7.1.2

Make sure to check the release-notes for EOmaps v7.1 as well!

๐Ÿ”จ Fixes

  • fix import error when adding wms layers
  • only log unique picker names for multi-geometry GeoDataFrames
  • allow using scatter_points as marker-shape
  • fix setting permanent-kwarg for markers
  • fix search-radius should default to m.cb.pick._search_radius
  • return created annotation object in m.add_annotation()
  • fix docstrings for get/set extent
  • avoid reprojection of gdf if init or cartopy crs can be identified
  • add more descriptive repr for Maps objects
  • make sure to only re-evaluate scalebar scale on extent changes
  • contributing.md file added

- Python
Published by raphaelquast over 2 years ago

eomaps - EOmaps v7.1.1

A first bugfix release for EOmaps v7.1

Make sure to check the release-notes for EOmaps v7.1 as well!

๐Ÿ”จ Fixes

  • โ—fix delay on figure close due to unnecessary background re-fetch during cleanup
  • โ—fix OSM nominatim query url (e.g. m.set_extent_to_location)
  • fix mask_radius for voronoi and delaunay should return a list not a generator
  • address matplotlib deprecation of f.canvas.key_release_event
  • fix treatment of layers starting with a single underscore in utility sliders and selectors
  • fix singular matrix issues when using colorbars in the layout editor
  • fix adjusting colorbars that inherit the position in the layout editor

- Python
Published by raphaelquast over 2 years ago

eomaps - EOmaps v7.1

A new minor release that introduces contour plots and brings some nice updates for the companion widget!

Make sure to check the release-notes for EOmaps v7.0 for an overview of all new features that arrived with v7.x

๐ŸŒณ New

Contour plots!

  • There is a new plot-shape: m.set_shape.contour()

    • it can be used to draw contour-plots (filled shapes or lines) of regular (2D) or irregular (1D) datasets!
    • use colorbar.indicate_contours() to indicate the contour-levels on an existing colorbar
  • Checkout the new Contour Plot Example in the docs for more details!

contour plot example

Companion widget updates

  • The drop-down menu for WebMaps is now easier to navigate and has properly grouped entries
  • The "Add Feature" widget now has individual buttons for each category and properly grouped entries

Map Feature Infos

The Editor tab of the companion widget now offers a new button for each artist that opens a popup with additional information on the feature (if available)

  • General infos (Licensing, References etc.)
  • Source code to reproduce the feature

Checkout the corresponding section in the docs for more details: Additional information on Features and WebMaps

โš ๏ธ Deprecations

  • The following arguments of m.new_layer() are depreciated and will be removed in upcoming releases:
    • copy_data_specs $\rightarrow$ inherit_data
    • copy_classify_specs $\rightarrow$ inherit_classification
    • copy_shape $\rightarrow$ inherit_shape

To create a new layer (or map) that uses the same data and classification as the Maps-object m, you can now use: python m2 = m.new_layer(inherit_data=True, inherit_classification=True) m2 = m.new_map(ax=222, inherit_data=True, inherit_classification=True)

  • Using the WebMap service name DLR_basemaps is deprecated
    • services are now integrated in the parent category DLR (use m.add_wms.DLR.basemap... to access basemap features)

๐Ÿ”จ Fixes

  • โ— fix compatibility with python < 3.9
  • run unittests on python 3.8 as well
  • remove no longer needed mamba requirement numpy < 1.24
  • fix toggling of the AnnotationEditor for multiple maps in one figure
  • fix setting plot-extent for GeoDataFrames with m.add_gdf(dataframe, set_extent=True)
  • fix classification issues for encoded masked datasets
  • fix resetting of linestyles on layout editor exit

- Python
Published by raphaelquast over 2 years ago

eomaps - EOmaps v7.0

A new major release that brings a lot of important updates for EOmaps!

  • Export figures as vektor graphics (and export to clipboard with ctrl+c)
  • Extensive re-work of the companion-widget (new design and new features)
  • Basic command line interface
  • Improved documentation (incl. a Contribution Guide and an API Reference)
  • Improved Jupyter Notebook support
  • Editable annotations
  • Logging

Interested in contributing to EOmaps? Checkout the new Contribution Guide on how to get started!

๐ŸŒณ New

๐Ÿ—บ Export figures as vector graphics

Export routines have been re-worked! Now its possible to export figures as vector graphics (svg, pdf, eps) in addition to rasterized images (png, jpeg, tiff, ...)! - use m.savefig(rasterize_data=False) to control if datasets are exported as vectors or not - by default datasets are rasterized even on vector export to avoid creating very large files

Checkout the corresponding section in the docs for more details.

๐Ÿ“ฆ Directly export figures to the clipboard (ctrl + c)!

This is really useful to quickly copy-paste the current state of a figure at runtime to other programs (e.g. paste figures in documents or in an image-editing software for post-processing)

The export can be customized (file-type, dpi, etc.) - simply adjust the most important parameters in the Companion Widget (currently set values are used for clipboard export) - or use m.set_clipboard_kwargs(...) to programmatically set clipboard-export parameters

๐Ÿงฐ Companion Widget updates

The companion widget has been extensively re-worked: - New design with a nice and clean look and greatly improved usability - New features: - Human readable names for artists in the editor - Assign transparencies to individual layers - Currently set export parameters are now used as parameters for export to clipboard (e.g. whenever ctrl + c is pressed) - set arrow/patch/text/colors for annotations (and a button to make existing annotations editable)

Checkout the corresponding section in the docs for more details.

๐Ÿ” Zoomable InsetMaps

InsetMaps can now be zoomed (and indicator patches are updated accordingly)

Editable Annotations

The AnnotationEditor allows you to interactively place (or edit existing) annotations! - Set text, colors, patch and arrow designs - Drag textbox and anchor position

โœ‘ Command Line Interface

EOmaps can now be used directly from the terminal via the eomaps command!
The following options can be provided: - --help get some help - --crs <crs identifier> set the crs of the map - --location <location>set the map extent to the queried location ---file open a file for plotting ---ne add basic features to the map ---wms ` add some selected WebMaps to the map

For example: `eomaps --crs 4326 --ne coastline --ne ocean --location europe

Checkout the corresponding section in the docs for more details.

Updates for Jupyter Notebooks

It is now possible to use the companion widget in jupyter notebooks!

To support using the widget, use the ipympl backend together with the %gui qt command! ```python %matplotlib widget %gui qt

from eomaps import Maps m = Maps() m.add_feature.preset("coastline", "ocean") ```

Logging

Proper logging has finally been implemented!
To set the log-level (and customize log message formatting), use:

```python from eomaps import Maps, setloglevel setloglevel("info")

m = Maps(3857) m.setdata([1, 2, 3], [1, 2, 3], [1, 2, 3], crs=4326) m.plotmap() ```

๐Ÿ“– Documentation updates

The documentation has been extensively updated to make it cleaner and easier to navigate. - Improved document structure and proper cross-referencing throughout the docs - Many updates on individual chapters - New chapter ๐Ÿš€ Contribution Guide

additional new features worth mentioning:

  • There is a new way to add multiple preset features to a map in one go: python m = Maps() m.add_feature.preset("coastline", "ocean", "land")
  • New (shorter) syntax for delayed actions that initialize a new layer: ```python def func(m): m.add_feature.preset.coastline()

m = Maps() m.onlayeractivation(func, layer="mylayer") `` - It is now possible to select if callbacks are executed on all layers or only on the visible layer (seem.cb..setexecuteonalllayers()) - There is a new convenience methodm.addtitle(...)to add a title to a map - The new class-methodMaps.config(...)` can be used to set global config variables
(backend specific configs, default shortcuts etc.)

โš ๏ธ Depreciations

  • m.set_data_specs(...) is deprecated and will be removed in the next minor version. Use m.set_data(...) instead!
  • m_inset.indicate_inset_extent is deprecated, Use m_inset.add_extent_indicator instead!

A lot of code re-factoring has been done to better follow PEP8 naming conventions.
Most of the changes concern internal class and function definitions and should not affect public API.

For more details see From EOmaps v6.x to v7.x:

๐Ÿ”จ Fixes

  • properly cross-reference functions in docs
  • fix companion-widget init for maps in already initialized figures
  • better caching for transformers and crs objects
  • unify handling of default PyQt5 keypress callbacks
  • avoid recursions caused by dynamically updated grids on savefig
  • fix performance issue with m.get_extent
  • fix colorbar causing singular matrix errors with hist_size=1
  • only warn for vmin/vmax=None if data is not inherited
  • fix clearing peek-layer callback markers on savefig
  • make sure "all" layer callbacks are executed after normal layers
  • fix performance issues with the LayoutEditor
  • allow activating the LayoutEditor if toolbar actions are active
  • fix InsetMaps._parent override on init
  • fix clearing temp artists on Maps-cleanup
  • fix search radius crs when using geod_circles
  • fix dataset-Maps object identification for semi-transparent layers
  • fix treatment of figure background patches
  • fix issues with jupyter notebook inline backend
  • fix issues with LayoutEditor and jupyter notebook ipympl backend
  • avoid using black dots in the LayoutEditor to support dark themes
  • fix cleanup of datamanager callbacks on consecutive calls to plotmap
  • fix activating current layer on control+click on tab-widget
  • cache combined layers only if necessary
  • avoid unnecessary draws in shape-drawer
  • avoid duplicated snapshots on update with inline backend
  • fix using the companion widgets with backends other than PyQt5
  • fix shade canvas size updates on figure resize events

- Python
Published by raphaelquast over 2 years ago

eomaps - EOmaps v6.5

A new release that finally adds a long-standing feature request to EOmaps: GridLabels!

๐ŸŒณ new

๐ŸŒ Grid Labels

It is now possible to add labels to grids in arbitrary projections! Make sure to checkout the new section in the docs Adding Labels to the Grid as well as the new ๐ŸŒ Gridlines and Grid Labels example!

python m = Maps(...) ... g = m.add_gridlines(...) g.add_labels(...)

EOmaps introduction figure. EOmaps introduction figure.

๐Ÿ”ฌ New features for InsetMaps

  • m_inset.add_indicator_line(...): Add a line that connects the inset-map with the inset-extent on another map.
  • The edge-color of the inset-map can now be specified directly via the boundary kwarg (e.g. boundary="red")

...other new features

  • Picked compass objects are now indicated with a red boundary
  • ColorBar objects have a new convenience-method cb.set_labels(...) to set the colorbar & histogram labels (and the style)
  • the ๐Ÿ“– Documentation has been re-structured and updated EOmaps introduction figure.

๐ŸŒฆ๏ธ changes

  • Fill values in integer encoded datasets are now excluded when evaluating data-bounds (vmin/vmax)
  • m.from_file, m.read_file and m.new_layer_from_file now support the additional kwarg fill_values="mask"/"keep" (to avoid costly and memory-intensive initialization of masked-arrays for extremely large datasets)
  • the print_to_console callback now returns tuples by default

๐Ÿ”จ fixes

  • fix cartopy crs identification from pyproj-crs
  • fix updating compass objects on init and scroll events
  • fix colorbars should only inherit positions if orientation is the same
  • fix colorbar minor ticks for vertical colorbars
  • fix clipping of colorbar bins provided as lists
  • make sure NE preset features handle mpl-synonyms (ec, fc, lw ...)
  • fix orientation of inset-map boundary vertices

- Python
Published by raphaelquast almost 3 years ago

eomaps - EOmaps v6.4.1

A minor bugfix release to ensure immediate draws of new background artists

๐Ÿ”จ fixes

  • fix setting vmin/vmax for encoded data
  • fix add/remove bg_artists should immediately trigger a draw

- Python
Published by raphaelquast almost 3 years ago

eomaps - EOmaps v6.4

A minor release that brings some nice performance improvements and a lot of bugfixes.

๐Ÿ“ Improvements for the scalebar!

The ScaleBar implementation has been re-worked in terms of performance and usability.

๐Ÿ”จ Fixes

  • fix adding colorbars with hist_size=None
  • fix treatment of inset-maps in peek-layer callbacks
  • improve scalebar performance
  • make sure scalebars are not positioned out of bounds
  • cache transformer and crs objects to speed up initialization
  • make sure spines are properly updated on refetch-bg actions
  • make Maps-axes animated to avoid unnecessary draws of AxesImage objects
  • speed up initialization of Maps objects
  • fix performance issues with the companion-widget with many map-layers
  • fix updating dynamic colorbars on layer change
  • only print a warning on pick-dataset override if pick-callbacks are assigned
  • fix inheriting classifications from maps using shade-shapes
  • properly support layer kwarg for m.text
  • make sure dynamic artists maintain plot order at same zorder
  • fix inset-map indicator shapes should be permanent artists
  • fix using uniform colors for delaunay_triangulations
  • fix identification of intermediate shape-points if data=None
  • unify treatment of vmin/vmax for all shapes
  • fix issues with inherited classifications and vmin/vmax

โš ๏ธ Depreciations

  • The ScaleBar segment-length (scale) and number of segments (n) are now explicitly passed as arguments on initialization: m.add_scalebar(scale=..., n=...) (Old syntax is still functional but will raise an error in future versions!)

- Python
Published by raphaelquast almost 3 years ago

eomaps - EOmaps v6.3

A new minor release with a lot of important fixes.

๐ŸŒฆ๏ธ changes

  • Dynamic artists now properly respect the order of multi-layers
    • Vertical stacking of artists is determined first by the layer-order and then by the intrinsic zorders within the layer
  • Executing callbacks now clears temporary artists only for the currently visible layer
  • The obsolete method m.util.remove(...) has been removed.
    • call .remove() on the selector/slider instances directly to remove them!

๐ŸŒณ New

  • m.util.layer_slider() and m.util.layer_selector() now support using "combined layer tuples" when specifying layer-names that should be included in the widget (e.g. layers=["layer1", ("layer1", "layer2")] )
  • m.get_extent() : get the extent of the map (a wrapper for m.ax.get_extent())

๐Ÿ”จ Fixes

  • โ— Fix maintaining order of vertical stacking for background artists at the same zorder
  • โ— Fix vertical stacking order of dynamic artists on multi-layers
  • โ— Fix issues using m.set_shape.raster() with irregularly spaced datasets
  • โ— Fix automatic evaluation of intermediate points used for plot-shapes based on visible data size
  • Fix issues with background patches for dynamic artists on ordinary (managed) axes
  • Use unittests to check basic functionality of code-snippets in docs
  • Mention m.set_extent() in the docs
  • Update docutils, sphinx and sphinx_rtd_theme versions
  • Only attempt to close netcdfs in m.read_file.NetCDF if opening was successful
  • Fix triggering data_manager updates for dynamic collections

- Python
Published by raphaelquast almost 3 years ago

eomaps - EOmaps v6.2.1

Primarily a bugfix release that also introduces new WebMap services!

๐ŸŒณ New

  • There is a new option to directly export figures with a "tight bbox" in the companion-widget.

๐Ÿ—บ๏ธ new WebMap services

  • OpenStreetMap
    • Humanitarian (e.g. HOT) style (https://wiki.openstreetmap.org/wiki/HOT_style)
    • OpenSeaMap (https://wiki.openstreetmap.org/wiki/OpenSeaMap)
  • GMRT (Global Multi-Resolution Topography (GMRT) Synthesis, https://gmrt.org/)
  • GLAD (Global Land Analysis and Discovery Team, https://glad.umd.edu/)
  • GOOGLE (Google Maps layers, https://google.com) #### ๐ŸŒ‘ EOmaps is going outta space! (โ— NOTE: since these WebMaps are provided in an earth-based WebMercator projection, units of scalebars, geod-circles etc. will be wrong since they represent earth-based units)
  • OpenPlanets - Mars and Moon WebMaps! (https://www.openplanetary.org)

๐ŸŒฆ๏ธ Changes

  • ESRI_ArcGIS WebMap services are now fetched as xyz services

๐Ÿ”จ Fixes

  • fix exporting figures with tight bboxes if dpi=figure_dpi
  • fix data-manager issues if radius cannot be evaluated
  • fix using custom globes with scalebars and gridlines
  • make sure webmaps are added transparent in the companion-widget
  • fix identification of picked values if "shade_raster" is used with 2D coordinates

- Python
Published by raphaelquast almost 3 years ago

eomaps - EOmaps v6.2

A minor release that brings new WebMap services and addresses handling of non-EOmaps artists.

๐ŸŒณ New

Improved handling of artists added with matplotlib/cartopy methods

Handling of artists added with methods NOT provided by EOmaps (e.g. using matplotlib or cartopy methods directly) has been improved:

  • All artists that are created with non-EOmaps methods are now drawn on the "base" layer by default.
  • To put artists on dedicated layers, you need to explicitly add them to the blit-manager (m.BM):
    • for "dynamic" artists that have to be updated on every event on the map:
      m.BM.add_artist(artist, layer=...)
    • for "background" artists that only need to be re-drawn on pan/zoom/resize: m.BM.add_bg_artist(artist, layer=...)

``python from eomaps import Maps m = Maps(layer="base") m.add_feature.preset.coastline() # EOmaps method... the layer ofm` is used for the artist

a matplotlib method is used... this artist will show up on the "base" layer

m.ax.plot([10, 20, 30], [5, 78, 25], c="r", lw=3)

to put arbitrary artists on dedicated layers, add them to the blit-manager:

l, = m.ax.plot([10, 20, 30], [5, 78, 25], lw=2, c="b") m.BM.addbgartist(l, layer="my_line") ```

๐Ÿ—บ New OpenStreetMap WebMap services added!

  • OpenRiverboatMap
  • CyclOSM
  • OEPNVpublictransport
  • OSM_WhereGroup
  • OSM_WaymarkedTrails
  • OSM_OpenRailwayMap
  • OSM_CartoDB basemaps

๐Ÿ”จ Fixes

  • fix drawing artists that were not added via EOmaps functions (e.g. using matplotlib/cartopy functionalitites)
  • fix using m.savefig() with bbox_inches="tight"

- Python
Published by raphaelquast almost 3 years ago

eomaps - EOmaps v6.1.3

A quick-fix release to fix adding multiple markers via lists of data IDs

๐Ÿ”จ Fixes

  • fix adding multiple markers/annotations by ID

- Python
Published by raphaelquast almost 3 years ago

eomaps - EOmaps v6.1.2

A second bugfix release for v6.1

๐ŸŒณ New

  • InsetMaps now add a white background patch by default.
    (use m.new_inset_map(background_color=None) to get a transparent inset-map

๐Ÿ”จ Fixes

  • fix crs argument of m.set_extent()
  • fix re-population of layer-tabs in the widget if new layers are created with the widget
  • fix assignment of initial shape "n" on new layer creation
  • fix treatment of the "all" layer on InsetMaps
  • fix issues with flushing events on fast updates in the companion widget
  • fix GridLines should inherit the default layer from the calling maps object
  • fix treatment of background patches for "unmanaged" axes
  • fix removing background-artists from dedicated inset-map layers

- Python
Published by raphaelquast almost 3 years ago

eomaps - EOmaps v6.1.1

A quick bugfix release that addresses some issues in Jupyter Notebooks

๐Ÿ”จ fixes

  • fix creating snapshots (e.g. for jupyter notebooks etc.) with arbitrary combinations of layers
  • fix spines not properly updated when adding colorbars with %matplotlib inline

EOmaps v6.1

A minor release that fixes remaining issues with v6.0.x and adds functionalities for grid-lines!

๐ŸŒณ New

  • The LayoutEditor now supports undo/redo of recent events via control + z and control + y
  • There is a new method m.new_map() to simplify adding new maps to existing figures
  • InsetMaps now have a new method m.get_inset_position() to get the current position and size
  • There is a new function m.add_gridlines() that can be used to add GridLines to the map!

๐Ÿ”จ Fixes

  • fix ReferenceErrors if the parent-map variable is overridden while the figure is still open
  • fix performance issues caused by unnecessary updates in the companion widget
  • avoid triggering "onlayerchange" actions if the layer is already active
  • make sure the selected "pick-map" does not automatically reset in the companion-widget
  • only attempt to close an opened file if opening was actually successful
  • add support for the "frameon" kwarg when creating new Maps-objects
  • fix "pick-only" datasets should not attempt to plot a collection
  • fix misplaced axes-frames when adding colorbars on already opened plots
  • fix re-positioning of already created InsetMaps
  • fix handling of matplotlib-inline backends
  • raise an error if geod_circles are used without providing a radius
  • fix altering colorbar/histogram scaling with + and - keys
  • fix issues when trying to fetch wms submenus for non-accessible servers

- Python
Published by raphaelquast almost 3 years ago

eomaps - EOmaps v6.1

A minor release that fixes remaining issues with v6.0.x and adds functionalities for grid-lines!

๐ŸŒณ New

  • The LayoutEditor now supports undo/redo of recent events via control + z and control + y
  • There is a new method m.new_map() to simplify adding new maps to existing figures
  • InsetMaps now have a new method m.get_inset_position() to get the current position and size
  • There is a new function m.add_gridlines() that can be used to add GridLines to the map!

๐Ÿ”จ Fixes

  • fix ReferenceErrors if the parent-map variable is overridden while the figure is still open
  • fix performance issues caused by unnecessary updates in the companion widget
  • avoid triggering "onlayerchange" actions if the layer is already active
  • make sure the selected "pick-map" does not automatically reset in the companion-widget
  • only attempt to close an opened file if opening was actually successful
  • add support for the "frameon" kwarg when creating new Maps-objects
  • fix "pick-only" datasets should not attempt to plot a collection
  • fix misplaced axes-frames when adding colorbars on already opened plots
  • fix re-positioning of already created InsetMaps
  • fix handling of matplotlib-inline backends
  • raise an error if geod_circles are used without providing a radius
  • fix altering colorbar/histogram scaling with + and - keys
  • fix issues when trying to fetch wms submenus for non-accessible servers

- Python
Published by raphaelquast almost 3 years ago

eomaps - EOmaps v6.0.3

A third series of minor bug fixes for EOmaps v6.0

โ— Make sure to check the release-notes for EOmaps v6.0 (There are possibly breaking changes with respect to EOmaps v5.x)

๐Ÿ”จ Fixes

  • fix shape "n" should not use auto-value if it has been explicitly set
  • implement temporary fix for srs identification of wms that require reprojection
  • fix issues with the clip-shape for WebMap layers on fast pan/zoom-events
  • fix layer assignment for temporary artists
  • allow overriding layer assignment for temporary artists
  • fix keypress modifiers for peek-layer callbacks cause glitches
  • fix updating layer editor tabs in companion widget when adding features and webmaps
  • make sure a proper layer is activated on layer-deletion in the widget
  • clear new-layer input after layer creation
  • port WebMap patches to cartopy and drop them for cartopy>=0.21.2
  • fix warn-message when using the default shape with large datasets

- Python
Published by raphaelquast about 3 years ago

eomaps - EOmaps v6.0.2

Another series of bugfixes for EOmaps v6.0

โ— Make sure to check the release-notes for EOmaps v6.0 โ—

There are possibly breaking changes with respect to EOmaps v5.x An overview of the most important changes is provided here: โš™ From EOmaps v5.x to v6.x

๐ŸŒณ New

  • Using m.new_layer_from_file.GeoTIFF or Maps.from_file.GeoTIFF now attempts to parse color-assignments provided in the file if no explicit colormap was provided.

๐Ÿ”จ fixes

  • fix performance issues for large RGB / RGBA composites
  • fix removing deleted layer tabs in the companion widget
  • fix identification of picked values when using "shade_raster"
  • fix treatment of explicit colors (e.g. for rgb composits etc.)
  • make sure to use "base" as the default layer for file-layers
  • fix codecov integration (e.g. use app)

- Python
Published by raphaelquast about 3 years ago

eomaps - EOmaps v6.0.1

A first series of bugfixes for EOmaps v6.0

โ— Make sure to check the release-notes for EOmaps v6.0 โ—

There are possibly breaking changes with respect to EOmaps v5.x (... and a lot of old syntax from v3.x, v4.x and v5.x has been removed) - An overview of the most important changes is provided here: โš™ From EOmaps v5.x to v6.x

๐ŸŒณ New

  • m.add_colorbar(extend=...) now has an explicit kwarg to override the extension-arrow behavior
  • It is now possible to use m.redraw("layer1", "layer2") to trigger a re-draw of specific layers

๐Ÿ”จ Fixes

  • fix infinite recursions with Compass objects on zoom events
  • fix updating Scalebar background patches on move
  • fix recursions in m.on_layer_activation() callbacks
  • fix inherited Colorbar axis positions if extension arrows are present
  • fix performance issues with the companion-widget for large number of layers
  • fix sizing of companion-widget layer-tabs
  • make sure a draw-event is triggered if limits are set on data-plot
  • make sure adding a Colorbar triggers associated layer-re-draws
  • fix axis limits when updating layers for existing Slider widgets
  • fix performance issues with Colorbar and Compass objects
  • make sure to update if artist props are changed with the companion-widget
  • avoid unnecessary re-draws of unaffected already cached backgrounds
  • fix dynamic artist identification on transparent layer-overlays

- Python
Published by raphaelquast about 3 years ago

eomaps - EOmaps v6.0

A new major-release that comes with a lot of updates, performance improvements and some very nice new features!

โ— There are possibly breaking changes with respect to EOmaps v5.x โ— (... and a lot of old syntax from v3.x, v4.x and v5.x has been removed) - An overview of the most important changes is provided here: โš™ From EOmaps v5.x to v6.x

๐ŸŒณ New

๐ŸŒด Performance improvements!

EOmaps v6.0 represents a major change in the internals for layer and data management.

โ—ฐ Data Management

๐ŸŒŸ Data is now dynamically pre-selected based on the visible extent prior to plotting, which provides a huge speed-up for: - Zoom/pan on plots of very large datasets - Initial startup of plots that show only a subset of the assigned datasets

If you don't need to see the whole extent of the data, make sure to set the desired extent before calling m.plot_map() via - m.set.extent() - m.set_extent_to_location()

โง‰ Composing layers

๐ŸŒŸ The interface to combine, stack or overlay layers has been greatly improved in terms of speed and usability. - To overlay the layer "B" on top of the layer "A", simply use m.show_layer("A", "B") - To overlay a layer with a global transparency, provide a tuple of (<layer-name>, <transparency>) e.g.: m.show_layer("A", ("B", 0.5)) will overlay the layer "B" with 50% transparency - Associated ๐Ÿงฐ Companion Widget updates - The order at which layers are selected in the layer-dropdown now determines the stacking order of the layers - To change the stacking order, simply re-arrange the (movable) layer-tabs in the Compare and Edit views!). rearrange_layers

๐ŸŒฒ new functionalities

  • m.set_extent(): set the map extent
  • m.inherit_classification: use the classification of a given Maps object (useful to avoid costly classifications for zoomed-in plots that show only a fraction of the data)
  • m.inherit_data(): share the data between Maps objects
  • m.text() add plain text
  • peek-layer callbacks now support "round" peek-shapes in addition to rectangles!
  • Control the behavior of WebMap services if the size of the axes or figure is changing
    • m.refetch_wms_on_size_change(): toggle global behavior for WebMap services
    • use m.savefig(refetch_wms=False) to avoid re-fetching WebMaps if you save figures at different dpi!

๐Ÿ”จ Fixes

  • fix val_color for forwarded pick callbacks
  • estimate shape radius for x- and y- direction separately when using 2D datasets
  • fix transparency for cached background layers
  • handle possible exceptions in companion-widget drawer tab
  • make sure companion-widget dropdown does not close on layer-changes
  • fix attaching pick callbacks prior to plotting datasets
  • fix triggering re-draws of layers if artists are added to the "all" layer
  • fix treatment of animated axes in layout editor
  • fix cancelling save-file dialog
  • fix compass behavior on figure size changes
  • fix compass position and size on figure dpi changes
  • fix handling of spines
  • make sure inset-maps are always drawn above other maps
  • avoid re-drawing the background when drawing shapes
  • use annotation_clip=True for annotations by default
  • adjust default zorders of shapes and webmaps

- Python
Published by raphaelquast about 3 years ago

eomaps - EOmaps v5.4

A minor release with some awesome new features!

๐ŸŒฆ๏ธ changes

  • โ— m.plot_map(pick_distance=...) is depreciated, use m.cb.pick.set_props(search_radius=...) instead โ—

๐ŸŒณ New

๐ŸŒฒ Improvements for PICK callbacks

The internals for pick-callbacks have been re-worked to improve performance and incorporate some new features. - you can now use m.cb.pick.set_props(...) to set the picking behavior for each Maps-object

๐ŸŒฑ Pick N nearest neighbors

  • Starting with EOmaps v5.4 it is possible to pick N nearest neighbors instead of a single point!
  • Checkout the docs for more details: ๐ŸญPicking N nearest neighbours python m = Maps() m.set_data([1,2,3,4,5], [1,2,3,4,5], [1,2,3,4,5]) m.plot_map() m.cb.pick.set_props(n=3, pick_relative_to_closest=True, consecutive_pick=False) m.cb.pick.attach.mark(fc="none", ec="r")

๐ŸŒฒ Improvements for shapes

๐ŸŒฑ There is a new plot-shape: m.set_shape.scatter_points

  • basically the same as using plt.scatter() but supercharged so that EOmaps functionalities work as expected
  • use it to draw datapoints with dimensions defined in (figure-points)ยฒ (rather than actual physical dimensions) python m = Maps() m.add_feature.preset.coastline() m.set_data([1, 2, 3], [-45, 20, 52], [-10, 20, 30]) m.set_shape.scatter_points(size=[200, 50, 500], marker="*") m.plot_map(cmap="tab10")

๐ŸŒฑ The shape-radius can now be defined for each datapoint individually!

  • The radius argument of the shapes ellipses, rectangles and geod_circles now properly broadcasts multiple values (e.g. you can assign an individual radius for each datapoint) python m = Maps() m.add_feature.preset.coastline() m.set_data([1, 2, 3], [-45, 20, 52], [-10, 20, 30]) m.set_shape.ellipses(radius=[1, 2, 3], radius_crs=4326) m.plot_map()

๐Ÿ”จ fixes

  • fix parsing n=None as shape-argument in the companion-widget
  • allow using the companion-widget with matplotlibs "QtAgg" backend
  • fix performance issues with m.get_crs
  • fix using m.BM.blit_artist if the renderer is not yet cached
  • make evaluation of scalebar background patch size more robust
  • ensure that scalebar is correctly updated if properties change
  • switch to mambaforge to avoid installation-issues in github-actions
  • lazily initialize pick-search tree only if a pick callback is attached
    (provides a nice speedup for large datasets if no pick callbacks are assigned)
  • allow passing None to m._decode_values
  • fix picking GeoDataFrames if no value-column was assigned (e.g. when using m.add_gdf(column=None))
  • remove obsolete dependencies and unused requirements.txt from the docs

- Python
Published by raphaelquast about 3 years ago

eomaps - EOmaps v5.3

A minor release with a lot of bugfixes and some nice improvements

โ— Changes

Classifications of NaturalEarth features into scale-categories have been depreciated to simplify the interface. (the old syntax is still functional but will be removed in future releases) - m.add_feature.cultural_10m.urban_areas() $\rightarrow$ m.add_feature.cultural.urban_areas(scale=10) - m.add_feature.physical_50m.coastline() $\rightarrow$ m.add_feature.physical.coastline(scale=50) - m.add_feature.physical_110m.coastline() $\rightarrow$ m.add_feature.physical.coastline(scale=110)

๐ŸŒณ New

  • using m.plot_map(vmin=..., vmax=...) now respects the encoding of the data (if applicable) (e.g. values are provided as actual data values and internally converted to respect the data-encoding)
  • โœ๏ธ drawing-capabilities have been re-worked to get rid of performance issues.
  • ๐Ÿงญ The compass (or North-arrow) implementation has been re-worked
    • The last known valid angle is used if compass is placed at a position where the angle could not be determined
    • Use c.set_ignore_invalid_angles(True) to ignore warnings if angle could not be determined
    • It is now possible to add a compass to a specific layer with m.add_compass(layer=...)
    • If you pick the compass with the mouse, it can be resized by simultaneously turning the mouse-wheel
  • The interface for ๐ŸŒต NaturalEarth features has been improved and simplified
    • Features are now only grouped by category and the scale is provided as argument m.add_feature.physical_10m.coastline $\rightarrow$ m.add_feature.physcial.coastline(scale=10)
    • If the provided scale is not available, the next available scale is used!
    • By default, all features determine the appropriate scale automatically and are added via cartopy's feature-interface.
    • To get a geopandas.GeoDataFrame containing all geometries and metadata of a feature, use m.add_feature.physcial.coastline.get_gdf(scale=10)
  • Maps-objects can now be used as context-managers to free memory when the object is no longer needed. (particularly useful to render video-frames etc.)

python # Maps-objects can be used as context-managers to free memory after usage with Maps(...) as m: ... # this also works for new layers on existing maps! m = Maps() with m.new_layer("my_layer") as m2: ...

## minor (non-breaking) changes - annotations now use the picked color as edgecolor by default. (use m.cb.click.attach.annotate(bbox=dict(ec="k")) to get the initial behaviour, e.g. a black edgecolor) - if a picker is used with m.add_gdf, the picked value is obtained from the column assigned via column=... by default. You can override this by using val_key=...

๐Ÿ”จ Fixes

  • Fix dragging the companion-widget on Linux
  • Avoid re-drawing on savefig if dpi settings did not change
  • Improve cleanup methods
  • Fix activating the Layout-manager if no artists are present
  • Fix finishing draw-events if multiple drawers are present
  • Fix performance issues with the drawer
  • Avoid updating the figure on move-events without move callbacks
  • Don't use defaultdicts for callback-containers
  • Fix setting vmin and vmax with encoded data
  • Fix caching of wms-layers in the companion-widget
  • Avoid using defaultdicts
  • Indicate if the compass rotation-angle is invalid
  • Fix "cartopy" based GeoDataFrame reprojections
  • Fix clearing outdated cached layers
  • Avoid setting map-extent when adding markers
  • Fix setting the clip-path for WebMap services on non-rectangular axes
  • Use preset-styles in Companion-widget when adding preset-features
  • fix lazy import of mapclassify
  • fix re-positioning of webmap legends
  • fix fetching values from geo-data-frames

- Python
Published by raphaelquast about 3 years ago

eomaps - EOmaps v5.2.1

A quick bugfix release for v5.2 to address issues with the companion-widget.

โ— Make sure to check the updates for EOmaps v5.2 as well โ—

๐ŸŒณ New

  • Austria WebMap services are now accessible via the companion-widget

๐Ÿ”จ Fixes

  • fix populating WebMap layer sub-menus in the companion-widget
  • use a file-cache for WebMap layer names

- Python
Published by raphaelquast over 3 years ago

eomaps - EOmaps v5.2

A new minor releases with a lot of bugfixes and some awesome usability upgrades.

๐ŸŒณ New

Some internals of EOmaps have been re-structured to make it easier to add Maps-objects to existing matplotlib-figures! Check the docs for more details: ๐Ÿฑ Adding Maps to existing figures python f = plt.figure() ax = f.add_subplot(211) m = Maps(f=f, ax=212)

๐ŸŒฆ๏ธ Changes

๐Ÿ’ง General

  • When using m.savefig(dpi=...) with the plot-shapes "shade_points" or "shade_raster" the shading-pipeline is now automatically adjusted to reflect the dpi of the saved figure (e.g. exporting higher dpi figures will also result in more detailed shading of the data).

  • The ๐Ÿงฐ Companion-Widget has some new functionalities! (e.g. basic click/pick callbacks)

๐Ÿ’ง Syntax

  • Maps(gs_ax=...) has been re-named to Maps(ax=...)
  • โ— Usage of the m.figure.<...> accessor is depreciated!
    • Objects are now directly accessible via m.f, m.ax, m.coll and m.colorbar.ax_cb m.colorbar.ax_cb_plot

๐Ÿ’ง Updates for keypress callbacks

  • keypress callbacks are now triggered irrespective of the mouse-position (as long as the figure is active)
  • It is now also possible to create callbacks that trigger on any key by using key=None. (the actually used key is passed to the callback via the key kwarg)

๐Ÿ’ง Updates for layer sliders

  • There's a new function slider.set_layers() to updates the layers targeted by an existing slider
  • The slider-label now shows the currently visible layer-name in red if the active layer is not targeted by the slider

๐Ÿ’ง Updates for logos

  • It is now possible to fix the logo-position relative to the map with m.add_logo(fix_position=True) (the default is False so that logos can be re-positioned with the layout-editor!)
  • Checkout the new ๐Ÿ‘ฝ logos section in the docs for more details!

๐Ÿ”จ Fixes

  • fix issues when adding Maps-objects to existing figures
  • fix issues when setting the map-extent to the data-extent
  • speed up opening datasets with the companion widget (avoid scaling to retrieve info)
  • allow adding MapsGrid objects to existing figures
  • make "switch_layer" keypress callbacks accept only strings as layer-names
  • update github actions to address depreciation warnings
  • fix registering of transparent colormaps
  • fix issues with boundary-pixels for "raster" shape
  • fix using layer-names that contain double-underscores
  • make sure the figure is closed if Maps is used as context-manager
  • fix handling of long layer-names in companion-widget
  • assign n for shapes based on dataset-size (if not specified explicitly)
  • remove cached background layers of deleted layers
  • adjust shading pipeline on figure resize
  • adjust shading pipeline on m.savefig if dpi is changed
  • fix re-fetching of xyz webmap services if axis size changed
  • fix issues when adding new webmap layers via the companion widget
  • avoid keeping companion-widget "always-on-top"
  • fix logos reset position at next draw event

- Python
Published by raphaelquast over 3 years ago

eomaps - EOmaps v5.1

A first minor release for EOmaps v5.x with a lot of bugfixes, some improvements for speed and memory-management and new functionalities for the colorbar!

Make sure to check the new features introduced in EOmaps v5.0 as well!

๐ŸŒณ New

  • new WebMap service: m.add_wms.DLR_basemaps
  • improved speed and memory-management for very large datasets

๐ŸŒˆ Updates for the colorbar

New convenience function m.colorbar.set_bin_labels() to simplify labeling individual bins of the colorbar with custom names.

Check the ๐Ÿ“– documentation for more details!

  • ... ordinary colorbar (for classified data):
  • ... the colorbar after using m.colorbar.set_bin_labels() to set custom labels at the center of the specified bins

๐Ÿ”จ Fixes

  • allow using (equal-length) 1D datasets for m.set_shape.raster
  • fix close button callback for companion-widget popups
  • fix utility widgets for multiple maps in one figure
  • fix layer assignment for WebMap legends
  • fix providing custom colorbar ticks for classified data
  • fix issues with colorbar tick formatter
  • avoid memory-intense index-creations for very large datasets
  • avoid re-shaping for very large 2D datasets with 1D coordinates
  • add some basic unittests for plotting from files
  • fix colormap usage for classified datasets

- Python
Published by raphaelquast over 3 years ago

eomaps - EOmaps v5.0

A new major release that brings a lot of very nice features and updates ๐Ÿฅณ

โ— (possibly) breaking changes to v4.x โ—

New layer-name convention:

  • All layer-names are now parsed as string! (any non-string object passed as layer-name will be converted to string and a warning is shown)

  • The "|" character is used as a separator for multi-layers (see new โง‰ Multi Layers feature below) (a layer-name such as "first|second" now represents the combined artists for the layers "first" and "second")

Changes for the colorbar

The implementation of the colorbar has been re-worked and several changes have been introduced:

  • Colorbars are now accessible via m.colorbar
    • Some arguments of m.add_colorbar(...) have changed! Check the docstring for details!
    • The individual colorbar-axes are accessible via m.colorbar.ax_cb and m.colorbar.ax_cb_plot
    • To set the size of the colorbar, use m.colorbar.set_position(...)
    • To remove a colorbar, use m.colorbar.remove()

๐ŸŒณ New

๐Ÿงฐ Companion widget

Starting with v5.0, EOmaps provides an awesome companion-widget to speed up data-comparisons and analysis.

NOTE: Using the widget is only possible if you use matplotlibs "PyQt5" backend!

  • To open the widget, simply press w on the keyboard while the mouse-pointer is hoovering the map.
  • The ? button on the top left can be used to activate showing help-tooltips if you hoover over the controls explain their functionalities.

๐Ÿ“– Checkout the corresponding section in the docs for more details! ๐Ÿงฐ Companion Widget

โœ๏ธ Draw shapes on the map

There is a new functionality to draw simple (geo-coded) shapes on the map!

๐Ÿ“– Checkout the corresponding section in the docs for more details! โœ๏ธ Draw shapes on the map

โง‰ Multi Layers

It is now possible to create "multi-layers" which inherit their artists from existing layers. The layer-name hereby consists of existing layer-names separated by "|".

To show the layers "first" and "second" at the same time, use:

python m.show_layer("first|second")

  • If you view a multi-layer, ALL artists from the constituting layers will be shown!
    • E.g.: "first|second|third" will show all artists of the layers "first", "second" and "third"
  • The "vertical stacking order" for plotting is still exclusively determined by the zorder property of the artists!
    • (artists at the same zorder are ordered with respect to the creation-time)
  • It is possible (however rarely useful) to create a Maps object representing multi-layers
    • Its artists will then only be shown if all constituting layers are visible

๐Ÿ“– Checkout the corresponding section in the docs for more details! ๐Ÿš€ Basics/Layers

๐Ÿ—๏ธ Updates for the Layout Editor

  • Select (and edit) multiple axes by holding shift while clicking on the axes
  • Scaling the axes-size (with the scroll-wheel or the +/- buttons) now preserves the center of the axis
  • If you hold down control while a colorbar is selected, the scroll wheel (or the +/- buttons) will adjust the relative size between the colorbar and the histogram
  • If you hold down h (or v) the scroll-wheel adjusts only the horizontal (or vertical) size of the axes

๐Ÿ“– Checkout the corresponding section in the docs for more details! ๐Ÿ—๏ธ Layout Editor

๐Ÿ—บ๏ธ Set map-extent via OpenStreetMap Nominatim query

  • There is now a method to set the extent of the map via a OSM query. python m = Maps() m.set_extent_to_location("Austria") m.add_wms.OpenStreetMap.add_layer.default() ## ๐Ÿ“ท Snapshots for JupyterNotebooks
  • The new m.shapshot() functionality allows you to plot static snapshots of a map in Jupyter Notebooks (or in the IPython console) irrespective of the used backend.

๐Ÿ‘“ Updates for peek-layer callbacks:

  • It is now possible to use transparency when peeking on a layer! m.cb.click.attach.peek_layer(layer="some layer", alpha=.5)
  • There's a new option how="full" to overlay another layer on the whole axis
  • The size of the square used for peeking (e.g. how=0.5) is now always with respect to the smallest axis-dimension

... additional new features ...

  • Equi7Grid projections can now be accessed via explicit names (e.g.: Equi7_EU, Equi7_AF...)
  • Any colormap created by EOmaps during runtime is now always registered as a matplotlib colormap
  • It is now possible to add logos to specific layers by using: m.add_logo(layer=...)
  • ๐Ÿ›ฐ๏ธ New WebMap services
    • m.add_wms.OpenStreetMap.OSM_wms
    • m.add_wms.OpenStreetMap.OSM_landuse

Dynamic artists are now layer-sensitive!

  • annotations and markers can now be added to specific layers: m.add_annotation(layer=...) and m.add_marker(layer=...)
  • To add dynamic artists on specific layers, simply use m.BM.add_artist(<artist>, layer=...) (to make the artist visible on all layers, simply use layer="all")

๐ŸŒฆ๏ธ (non-breaking) Changes

  • obsolete arguments radius and radius_crs have been removed from m.set_shape.raster()
  • the default radius for m.set_shape.geod_circles has been set to 1km

๐Ÿ”จ Fixes

  • fix default style kwarg for wms layers
  • remove obsolete shape arguments
  • fix custom args for feature presets
  • fix onlayer_change actions
  • fix fetching wmts services
  • fix passing kwargs to wms and wmts services added to the active layer
  • fix updating background layers on add/remove of artists
  • fix handling of encoded NetCDF data

- Python
Published by raphaelquast over 3 years ago

eomaps - EOmaps v4.4.3

Just a hotfix release

๐Ÿ”จ fixes

  • fix ImportError for TriMesh when using matpltolib >= 3.6

- Python
Published by raphaelquast over 3 years ago

eomaps - EOmaps v4.4.2

Another bugfix release.

๐ŸŒณ New

  • Make sure to also have a look at the new features added in EOmaps v4.4!
  • There is now an option to draw a an "outline" on top of the colorbar-histogram with:
    • m.add_colorbar(show_outline=True) (for a black outline with linewidth 1)
    • m.add_colorbar(show_outline=dict(color="b", linewidth=2)) (for a custom outline)

image

๐Ÿ”จ Fixes

  • fix using m.cb.pick callbacks with datasets assigned to the "all" layer
  • raise error if undefined objects are passed to NetCDF and GeoTIFF readers
  • fix using the LayoutEditor to move colorbars with "arrow-keys"
  • fix default styles must be provided as list for wms and wmts services!

- Python
Published by raphaelquast over 3 years ago

eomaps - EOmaps v4.4.1

A quick bugfix release

๐Ÿ”จ Fixes

  • fix providing kwargs to WebMap services (time, styles etc.)

EOmaps v4.4

A release that introduces 2 new functionalities: m.add_line, m.cb.move and the ability to use keypress-modifiers for callbacks!

๐ŸŒณ New

๐Ÿšฒ A new method to quickly draw paths on a map!

  • โญ m.add_line(): connect points via geodesic (or straight) lines!
    • specify number of intermediate points per line-segment

๐Ÿ›ธ New features for callbacks!

๐Ÿ‘พ Keypress-modifiers

It is now possible to assign multiple callbacks to the same mouse-button and use keyboard-shortcuts to switch between the assigned callbacks! (e.g. the callback will only be executed if the corresponding button is pressed on the keyboard)

  • ๐ŸŒŸ simply provide the modifier of choice with the modifier=... argument!
    • e.g.: m.cb.click.attach.annotate(modifier="a") : this callback will only be executed if the "a" key is pressed
  • ๐ŸŒŸ You can make modifiers "sticky" (e.g. to keep them activated after the button is released) by using:

    • m.cb.click.set_sticky_modifiers("a", "b", "c")
    • "sticky modifiers" are assigned separately for click, pick and move callbacks
    • to release a "sticky modifier" press ctrl + <modifier key> or escape
  • checkout the corresponding section in the ๐Ÿ“– documentation!

โญ move callbacks

There's now an explicit container to attach callbacks that are executed on mouse movement if NO button is clicked

  • NOTE: use m.cb.click.attach... to execute callbacks on mouse-movement if a button is clicked!
    • and set on_motion=False to avoid executing the click-callback on mouse-movements

python m = Maps() m.add_feature.preset.coastline() m.cb.move.attach.annotate() m.cb.move.attach.mark(modifier=1, radius=2, radius_crs=4326, fc="none", ec="r")

๐ŸŒฆ๏ธ Changes

  • โ— m.cb.click.attach.mark() now uses permanent=False by default

  • ๐Ÿž๏ธ NaturalEarth features have been updated

    click for a list of new features ```python { 10m_cultural: {'admin_0_countries_iso', 'parks_and_protected_lands', 'admin_0_countries_tlc'} 10m_physical: {'bathymetry_G_4000', 'graticules_20', 'bathymetry_K_200', 'bathymetry_E_6000', 'graticules_1', 'bathymetry_A_10000', 'bathymetry_F_5000', 'bathymetry_C_8000', 'bathymetry_B_9000', 'bathymetry_L_0', 'bathymetry_H_3000', 'bathymetry_I_2000', 'wgs84_bounding_box', 'bathymetry_J_1000', 'graticules_5', 'bathymetry_D_7000', 'graticules_30', 'graticules_10', 'graticules_15'} 110m_physical: {'graticules_15', 'graticules_20', 'graticules_1', 'wgs84_bounding_box', 'graticules_5', 'graticules_30', 'graticules_10'} 50m_physical: {'graticules_20', 'graticules_1', 'wgs84_bounding_box', 'graticules_5', 'graticules_30', 'graticules_10', 'graticules_15'} } ```

๐Ÿ”จ Fixes

  • fix sharing boundary and inset-marker properties for inset-maps
  • fix issues with invalid clipping shapes
  • fix issues with geometries that cannot be exploded
  • make sure temporary artists are cleared prior to executing callbacks
  • fix issues with dynamically updated legends and temporary artists
  • fix error when trying to update colorbar-arrows without a colorbar
  • avoid re-fetching WebMap tiles if extent remains the same
  • fix unnecessary re-draws of artists after overlay-actions

- Python
Published by raphaelquast over 3 years ago

eomaps - EOmaps v4.4

A release that introduces 2 new functionalities: m.add_line, m.cb.move and the ability to use keypress-modifiers for callbacks!

๐ŸŒณ New

๐Ÿšฒ A new method to quickly draw paths on a map!

  • โญ m.add_line(): connect points via geodesic (or straight) lines!
    • specify number of intermediate points per line-segment

๐Ÿ›ธ New features for callbacks!

๐Ÿ‘พ Keypress-modifiers

It is now possible to assign multiple callbacks to the same mouse-button and use keyboard-shortcuts to switch between the assigned callbacks! (e.g. the callback will only be executed if the corresponding button is pressed on the keyboard)

  • ๐ŸŒŸ simply provide the modifier of choice with the modifier=... argument!
    • e.g.: m.cb.click.attach.annotate(modifier="a") : this callback will only be executed if the "a" key is pressed
  • ๐ŸŒŸ You can make modifiers "sticky" (e.g. to keep them activated after the button is released) by using:

    • m.cb.click.set_sticky_modifiers("a", "b", "c")
    • "sticky modifiers" are assigned separately for click, pick and move callbacks
    • to release a "sticky modifier" press ctrl + <modifier key> or escape
  • checkout the corresponding section in the ๐Ÿ“– documentation!

โญ move callbacks

There's now an explicit container to attach callbacks that are executed on mouse movement if NO button is clicked

  • NOTE: use m.cb.click.attach... to execute callbacks on mouse-movement if a button is clicked!
    • and set on_motion=False to avoid executing the click-callback on mouse-movements

python m = Maps() m.add_feature.preset.coastline() m.cb.move.attach.annotate() m.cb.move.attach.mark(modifier=1, radius=2, radius_crs=4326, fc="none", ec="r")

๐ŸŒฆ๏ธ Changes

  • โ— m.cb.click.attach.mark() now uses permanent=False by default

  • ๐Ÿž๏ธ NaturalEarth features have been updated

    click for a list of new features ```python { 10m_cultural: {'admin_0_countries_iso', 'parks_and_protected_lands', 'admin_0_countries_tlc'} 10m_physical: {'bathymetry_G_4000', 'graticules_20', 'bathymetry_K_200', 'bathymetry_E_6000', 'graticules_1', 'bathymetry_A_10000', 'bathymetry_F_5000', 'bathymetry_C_8000', 'bathymetry_B_9000', 'bathymetry_L_0', 'bathymetry_H_3000', 'bathymetry_I_2000', 'wgs84_bounding_box', 'bathymetry_J_1000', 'graticules_5', 'bathymetry_D_7000', 'graticules_30', 'graticules_10', 'graticules_15'} 110m_physical: {'graticules_15', 'graticules_20', 'graticules_1', 'wgs84_bounding_box', 'graticules_5', 'graticules_30', 'graticules_10'} 50m_physical: {'graticules_20', 'graticules_1', 'wgs84_bounding_box', 'graticules_5', 'graticules_30', 'graticules_10', 'graticules_15'} } ```

๐Ÿ”จ Fixes

  • fix sharing boundary and inset-marker properties for inset-maps
  • fix issues with invalid clipping shapes
  • fix issues with geometries that cannot be exploded
  • make sure temporary artists are cleared prior to executing callbacks
  • fix issues with dynamically updated legends and temporary artists
  • fix error when trying to update colorbar-arrows without a colorbar
  • avoid re-fetching WebMap tiles if extent remains the same
  • fix unnecessary re-draws of artists after overlay-actions

- Python
Published by raphaelquast over 3 years ago

eomaps - EOmaps v4.3

A new release that brings some nice updates and an awesome new Layout-Editor!

๐ŸŒฆ๏ธ Changes

  • ๐Ÿƒ utility-widgets now auto-update themselves if new layers are added to the map!
    • to show only a subset of the available layers, use m.util.layer_selector(layers=["layer1", ...])
  • ๐Ÿƒ coastlines are no longer added by default when creating new layers from files (e.g. NetCDF, GeoTIFF etc.)
    • (use coastlines=True or explicitly call m.add_feature.preset.coastline() to add coastlines!)
  • ๐Ÿƒ m.add_gdf now allows using a path to a file that can be read with geopandas.read_file instead of providing the geopandas.GeoDataFrame directly
  • โ— keyword-arguments for m.new_inset_map have changed!
    • edgecolor and linewidth are depreciated and will be removed in next major versions!
    • to set the properties of the boundary-polygon, use m.new_inset_map(boundary=dict(fc="r", lw=1) instead
  • โ— m.cb.dynamic has been removed ## ๐ŸŒณ New

โญ New accessor for classification schemes

The new classification-schemes accessor ๐ŸŒŸ m.set_classify provides autocompletion and proper docstrings! (you can use it just as you would use m.set_classify_specs)

Just select the scheme you want to use and call it with the relevant parameters: ```python m = Maps() m.setdata(...) m.setclassify.Quantiles(k=5) m.plot_map(...)

alternative (old) way to set the classification:

m.setclassifyspecs(scheme="Quantiles", k=5)

```

โญ There's a new ๐Ÿ—๏ธ Layout Editor to quickly re-arrange the subplots of a figure!

The Layout Editor can be used to quickly re-arrange the position of all axes in the figure. (works for maps, colorbars, inset-maps, ordinary matplotlib plots etc.) - You can save and re-apply a layout with: - ๐ŸŒŸm.get_layout(): get the current layout (or dump the layout as a json-file) - ๐ŸŒŸm.apply_layout(): apply a given layout (or load and apply the layout from a json-file) - ๐ŸŒŸm.edit_layout(filepath=...): enter LayoutEditor and (optionally) save layout as a json-file on exit

To quickly enter/exit Layout Editor, simply use the assigned keyboard-shortcuts: - press ALT + L to enter the LayoutEditor mode - press ALT + L again or escape to exit the LayoutEditor

Have a look at the new section in the ๐Ÿ“– documentation for more details!

๐Ÿ”จ Fixes

  • fix recognizing the parent layer when initializing utility-widgets from the parent Maps object
  • fix layer-selectors should indicate no active layer if the active layer is not part of the widget
  • updates for inset-maps
  • add fix for reprojection issues with certain projections
  • fix reprojection sometimes masks certain shapes

- Python
Published by raphaelquast over 3 years ago

eomaps - EOmaps v4.2.3

A minor bugfix release.

๐ŸŒณ new

  • there is now an option to completely disable extension arrows when adding a colorbar (e.g. with m.add_colorbar(add_extend_arrows=False))

  • it is now possible to set the "layer" of an inset-map on initialization (e.g. m.new_inset_map(layer="adsf") (by default, the "all" layer is used for inset-maps!)

๐Ÿ”จ fixes

  • fix using alpha-transparency with wms and wmts services (e.g. m.add_wms.<service>.add_layer.<layer>(alpha=0.5))
  • fix colors of histogram-bins if the bins extend over more than one colorbar-split
  • fix position of colorbar extension-arrows after using m.subplots_adjust
  • fix appearance of "vertical" colorbar extension arrows

- Python
Published by raphaelquast over 3 years ago

eomaps - EOmaps v4.2.2

A minor bugfix release.

๐ŸŒณ new

  • To address issues when plotting 2D raster-data with unsorted coordinates, there is now an option to force sorting the data by coordinates prior to plotting with m.plot_map(assume_sorted=False)
    • only works if coordinates are provided as 1D arrays and the data is provided as a 2D array
    • sorting is only relevant for raster and shade_raster shapes (other shapes don't require sorting)
    • by default no sorting is performed! ## ๐ŸŒฆ๏ธ changes
  • The pick-radius used to identify clicked pixels can now be set in 2 ways m.plot_map(pick_distance=...):
    • if a number is provided, it is used as a multiplier for the dataset-radius e.g. pick-radius = pick_distance * radius_in_plot_crs)
    • if a string is provided, it is directly used as the pick-radius in units of the plotcrs e.g. `pick-radius = float(pickdistance)` ## ๐Ÿ”จ fixes
  • โ— fix using "pick" callbacks with m.set_shape.raster() and 2D input-coordinates
  • make radius-estimation more robust (fallback to nearest-neighbor if 2D estimation fails)
  • fallback to np.inf for pick_distance if radius estimation fails
  • fix delaunay_triangulation does not need to estimate the radius if masked=False
  • fix issues with registering pandas

- Python
Published by raphaelquast over 3 years ago

eomaps - EOmaps v4.2.1

A bugfix release that greatly reduces import time!

๐ŸŒฆ๏ธ changes

  • ๐Ÿ• greatly reduced "plain" import-time
    • "heavy" modules such as 'datashader', 'xarray' etc. are now lazily imported only when needed
    • this reduces runtime of from eomaps import Maps in a fresh terminal from ~5sec to ~1sec
  • ๐Ÿƒ m.add_marker(...) now supports the "layer" kwarg
  • ๐Ÿƒ m.show() now automatically calls plt.show() to actually draw the figure if matplotlib is in non-interactive mode

๐Ÿ”จ fixes

  • legends for WebMap services are now updated based on the visible layer
  • m.add_marker now only draws newly added markers (instead of updating all dynamic artists)
  • avoid using pkg_resources to identify package-version (use explicit _version.py instead)

- Python
Published by raphaelquast over 3 years ago

eomaps - EOmaps v4.2

๐ŸŒณ New

  • โญ there's a new function m.fetch_layers()
    • ...to fetch (and cache) all layers of a map so that switching layers (with buttons & sliders) is fast
    • a associated callback m.cb.keypress.attach.fetch_layers() is also available
  • โญ there's a new pre-defined WebMap service for the "Copernicus Atmosphere Monitoring Service"
    • accessible via m.add_wms.CAMS (see ECMWF CAMS for details )
  • ๐Ÿ“ƒ docs on WebMap services have been updated with examples on how to
    • use custom service-urls
    • pass arguments (time, style etc.) to the service

๐ŸŒฆ๏ธ Changes

  • ๐Ÿƒ m.set_shape.raster() can now be used with 1D pandas.DataFrames as well! (DataFrames will be re-structured internally based on unique values of the coordinate-columns)
  • ๐Ÿƒ .add_legend() for WebMap services can now properly recognizes the used map-style m.add_wms.<SERVICE>.....add_layer.<LAYER>.add_legend()

๐Ÿ”จ Fixes

  • โ— fix pixel centers shifted by half pixel-size with m.set_shape.raster()
  • speedup m.set_shape.raster() (remove unnecessary calculations)
  • fix identification of picked ID if pandas.Series objects are used as coordinates
  • allow setting shade-aggregator via strings (e.g. "mean", "min", "max" etc.) for m.shade_points
  • fix colorbar kwargs assertions should intercept before axes are created
  • add fix for QuadMesh performance issues for older matplotlib versions (e.g. < v3.5.2)
  • fix issues with updating WebMaps when using m.util.layer_slider()
  • fix re-using WebMap objects with different kwargs
  • fix fetching WebMap legends for different styles

- Python
Published by raphaelquast over 3 years ago

eomaps - EOmaps v4.1.1

A bugfix release that brings some nice updates for the colorbar.

๐ŸŒˆ updates for the colorbar

  • โญ Colorbars now have proper extension-arrows to indicate values outside the colorbar-range
  • โญ m.add_colorbar() supports some new arguments to further customize the colorbar:
    • histogram_size : set the relative height of the histogram in relation to the height of the colorbar (use 0 for a plain colorbar and 999 for a plain histogram)
    • extend_frac: set the relative size of the extension-arrows
    • add_extend_arrows: toggle drawing extension-arrows (by default arrows are only drawn if there are values outside the [vmin, vmax] range)

๐ŸŒฆ๏ธ changes

  • setting vmin/vmax no longer clips data-values (e.g. callbacks now always retrieve actual data-values independent of vmin/vmax)

๐Ÿ”จ fixes

  • fix setting zorder for WebMap layers
  • make sure the default zorder for m.plot_map() is 1 for all shapes
  • fix test-action issues (use mamba + updated version of conda-incubator)
  • fix adding static annotations by dataset-ID with m.add_annotation()
  • fix some issues with draggable axes
  • fix sorting of callback-execution order

- Python
Published by raphaelquast almost 4 years ago

eomaps - EOmaps v4.1

A minor release that brings an awesome new feature and some bugfixes.

๐Ÿ”ฌ New feature: Inset-maps!

  • Quickly create zoomed-in views on selected regions of a map with m.new_inset_map()

Checkout the docs for more details: ๐Ÿ”ฌ Inset-maps - zoom-in on interesting areas

test

๐Ÿ”จ fixes

  • allow using a scalar radius for calculating ellipse and rectangle points
  • make sure the blit-manager always uses the correct figure object
  • make histogram plot background visible (but set boundary color to none)
  • fix wrong error-catching for layer-slider
  • fix issues with colored histograms for discrete colormaps

- Python
Published by raphaelquast almost 4 years ago

eomaps - EOmaps v4.0

A new major release that brings some nice new features, a lot of updates and some outstanding api-changes.

๐ŸŒฉ changes

โ— There are breaking changes to EOmaps v3.x โ— ๐ŸŒž For a quick-guide on how to port existing scripts to v4.x see: โš™๏ธ port script from v3.x to v4.x

[or click on the text below for details!]

๐Ÿ”ธ m.plot_specs and m.set_plot_specs(...) have been removed - **"vmin", "vmax"** and **"cmap"** are now set when calling `m.plot_map(...)` - **"density", "tick_precision", "histbins"** and **"label"** are now set when calling `m.add_colorbar(...)` - **"cpos"** and **"cpos_radius"** are now set with `m.set_data_specs(...)`
๐Ÿ”ธ voroni_diagram is now correctly called voronoi_diagram This just fixes the typo in the name. ```python # --- OLD --- m.set_shape.voroni_diagram() # --- NEW --- m.set_shape.voronoi_diagram() ```
๐Ÿ”ธ The data-specs xcoord and ycoord have been renamed to x and y This change is optional and will only raise a depreciation warning for now... The old naming-convention will however be removed in future releases so it's highly recommended to use the new (shorter and more intuitive๐Ÿ™‚) `x` and `y` variable names. ```python # --- OLD --- m.set_data(data=..., xcoord=..., ycoord=..., ...) m.data_specs.xcoord # --- NEW --- m.set_data(data=..., x=..., y=..., ...) m.data_specs.x ```
๐Ÿ”ธ Custom callback functions now have a slightly different call-signature > This removes the contra-intuitive "binding" of functions to the `Maps`-objects and ensures that class-methods can be used as callbacks without unwanted side-effects. - The first argument is no longer identified automatically as the `Maps`-object! (if you need access to the underlying `Maps`-object, simply pass it as an argument!) ```python m = Maps() def cb(m, **kwargs): pos = kwargs["pos"] print("the Maps-object:", m) print("the click-position is", pos) m.cb.click.attach(cb, m=m) ```
๐Ÿ‘พ [click to show] how to get back the old behaviour To get back the old behavior you have to "bind" the callback functions to the Maps-object, e.g: ```python m = Maps() def cb(self, **kwargs): ... m.cb.click.attach(cb.__get__(m)) ``` or simply pass the Maps-object as kwarg, e.g.: ```python m = Maps() def cb(self, **kwargs): ... m.cb.click.attach(cb self=m) ```

๐ŸŒณ NEW

  • โญ The Sentinel-2 cloudless WebMap service can now be used via m.add_wms.s2_cloudless
  • ๐ŸŒŸ It is now possible to set "coordinate-only" datasets!

    • This is particularly useful if you want to manually assign colors python m.set_data(None, [1,2,3], [1,2,3]) m.plot_map(fc=["r", "g", "b"]) ### ๐Ÿš€ there's a new plot shape! m.set_shape.raster A fast way to plot 2D datasets.
      [click to show] ๐Ÿ”ธ details
  • it's quite similar to plt.imshow (e.g. a QuadMesh is used to speed up plotting of 2D datasets)

  • the differences to shade_raster are:

    • the whole dataset is always plotted (so for very very large datasets shade_raster is much faster!)
    • it supports manual color specifications (shade_raster does not)
  • the differences between rectangles and raster are:

    • raster does not take the curvature of the edges into account
    • raster determines the pixel-size based on neighboring pixels, rectangles allows arbitrary pixel-dimensions

๐ŸŒˆ there have been some major improvements for manual color specifications!

Checkout the ๐ŸŒŽ Customizing the plot section of the docs for details!

Colors can now be set manually with all shapes (except shade shapes) using m.plot_map(fc=[...]) (or facecolor= or color=)!

[click to show] ๐Ÿ”ธ Possible ways to specify colors. - a single value (RGB/RGBA tuple, a matplotlib color-name or a hex-color) - a tuple of 3/4 arrays in the same shape as the coordinates (identified as RGB/RGBA values) - a list/array of RGB tuples, e.g. `[(1, 0, 0.25), (0.3, 0.4, 0.5), ....]` - a list/array of RGBA tuples, e.g.: `[(1, 0, 0.25, 0.15), (0.3, 0.4, 0.5, 0.25), ....]` - a list/array of matplotlib named-colors, e.g. `["r", "olive", "darkblue", ...]` - a list/array of hex-colors, e.g.: `['#ff0040', '#4c6680', ...]` For example: ```python m = Maps() m.set_data(None, [1,2,3,4,5], [1,2,3,4,5]) # use named colors m.plot_map(ec="k", fc=["r", "olive", "darkblue", "orange", "indigo"]) # or RGB tuples m.plot_map(color=[(1, 0, 0), (.4, .5, .6), (.2, .7, .2), (.45, .12, .98), (.94, .45, .56)]) # or a single color for all datapoints m.plot_map(facecolor="g", edgecolor="r") # or use 3 individual arrays that should be identified as RGB values m.plot_map(fc=([0.1,0.2,0.3,0.4,0.5], [0.1,0.2,0.3,0.4,0.5], [0.1,0.2,0.3,0.4,0.5]) ```

โ˜๏ธ minor (non-breaking) changes

  • the default radius_crs for the mark callback is now determined based on the radius_crs assigned in the plot-shape ... this definition allows using m.cb.pick.attach.mark(buffer=3) directly without having to worry about the crs (previously in, e.g. the input-crs was used by default)
  • the background patch of the compass is now by default set to None

๐Ÿ”จ fixes

  • fix issues with manual color specifications for various plot-shapes (e.g. when providing explicit color-arrays via m.plot_map(color=[...]) )
  • fix issues with shapes close to crs-bounds
  • support estimation of different x- and y- radius for 2D datasets
  • warn if datapoints are masked or if datapoints are outside the CRS-bounds
  • cache shape transformers (so they are not re-initialized all the time)

- Python
Published by raphaelquast almost 4 years ago

eomaps - EOmaps v3.5

๐Ÿš€ updates

โญ EOmaps now properly handles encoded datasets!

  • This saves a lot of memory and provides a huge speedup when plotting integer-encoded datasets!
  • If you plot GeoTIFFs or NetCDFs with the functions Maps.read_data, Maps.from_file or m.new_layer_from_file, the data is now kept in the encoded dtype and conversions are only performed "on demand" (e.g. when adding colorbars or in pick-callbacks)
    • (if you really want to immediately convert all data-values, use mask_and_scale=True )
  • The encoding information can be get/set via m.data_specs.encoding or m.set_data_specs(encoding=...)

```python m = Maps() m.setdata(data=[1,2,3], xcoord=[1,2,3], ycoord=[1,2,3], encoding=dict(scalefactor=0.01, add_offset=1))

the "decoding" of the values is evaluated via "addoffset" + "scalefactor" * x

e.g.: in this case the actual data-values are : [1.01, 1.02, 1.03]

```

๐ŸŒณ New

  • โญ The colorbar can now be used as a dynamic shade indicator with m.add_colorbar(dynamic_shade_indicator=True)

    • it is dynamically updated based on the distribution of shaded pixels in the current field of view. (only possible with m.set_shape.shade_raster() or m.set_shape.shade_points() )

  • โญ There is now a way to use pick callbacks on datasets without plotting the data first.

    • To make a "pick-only" dataset, use m.set_data(...) to assign the dataset and then call m.make_dataset_pickable() to initialize all required information to make the dataset pickable.
    • This is useful if you want to indicate certain informations "on click" without plotting the data

โš™๏ธ changes

  • The default plot-shape is now determined based on the size of the assigned dataset.
    • <500k datapoints: m.set_shape.ellipses()
    • >500k datapoints: m.set_shape.shade_raster()
  • Maps.from_file and m.new_layer_from_file now no longer attempt multiple shapes for plotting in case the first attempt fails (the default shape is used if no explicit shape-name is provided)

๐Ÿ”จ fixes

  • Fix typo in m.add_colorbar
  • Fix some typos in the docs
  • Fix unnecessary dtype conversions in "shaderaster" and "shadepoints"
  • Avoid dtype conversions when reading NetCDFs and GeoTIFFs

- Python
Published by raphaelquast almost 4 years ago

eomaps - EOmaps v3.4.1

[hotfix release to fix issues with multiple maps in one figure]

... EOmaps v3.4

A release that brings a lot of updates on speed and memory management and some very nice (but possibly breaking) changes compared previous versions of EOmaps.

โ— IMPORTANT CHANGES โ—

โญ Starting with EOmaps v3.4 all callbacks and colorbars are layer-specific !

This means that callbacks only trigger if the layer of the associated Maps object is visible! (...and colorbars are only visible if the associated layer is visible)

  • To trigger callbacks or add features & datasets independent of the visible layer, use m.all.cb. ...
    (or attach them to a Maps object on the "all" layer)
  • Note: pick callbacks now always react to the visible collection! (except for the ones on the "all" layer)

    ```python m = Maps(layer=0) m.cb.click.attach.annotate() # this callback is ONLY executed if the layer 0 is visible

    m1 = m.new_layer(layer=1) m1.cb.click.attach.mark() # this callback is ONLY executed if the layer 1 is visible

    m.all.cb.click.attach.annotate() # this callback is executed independent of the visible layer! ```

๐Ÿƒ removed arguments

  • the obsolete "orientation" argument has been removed from Maps(...) (it set the colorbar-orientation which is now specified via m.add_colorbar(orientation=...) ---

๐ŸŒณ NEW

  • โญ m.show() can be used to make the associated layer visible. (a shortcut for m.show_layer(m.layer)
  • โญ m.BM.on_layer(...) can be used to trigger functions if the visible layer changes.
  • ๐ŸŒŸ WebMap layers are now lazily evaluated and only added to the map if the corresponding layer is actually visible.
  • ๐ŸŒŸ [experimental feature] memory-mapping can now be used to avoid using up a lot of ram for very large datasets
    • Intermediate datasets are stored as memory-mapped files in a temp-folder on disk to release memory
    • By default memory-mapping is disabled! (to activate it, use: m.plot_map(memmap=False) )

๐ŸŒฆ๏ธ changes

  • Adding data from files (e.g. m.from_file or m.new_layer_from_file) now always uses "shade_raster" as the default plot-shape (since EOmaps v3.3.2, raster-shading works perfectly fine with re-projected rasters as well)
  • If a file with >2M data-points is plotted, only "shade" shapes are attempted by default to avoid overloading memory.
  • only one colorbar is allowed for Maps objects (use multiple objects for multiple colorbars)

๐Ÿ”จ fixes

  • Fix several issues with memory-leaks and garbage-collection of objects
  • Fix autoscalefraction not recognized when using preset="bw" in `m.addscalebar`
  • Maps objects are now properly garbage-collected
  • Fix auto-scaling of scalebars for very small scales
  • Maps.from_file now properly handles pathlib.Path objects
  • Fix utility widget start-layer should be the currently visible layer
  • Fix pick-events should only identify points on visible layers
  • Fix m.add_colorbar(log=True) for horizontal colorbars
  • Fix colorbar limit autoscaling
  • Fix logo size changes on zoom
  • Remove obsolete layer kwarg from m.add_logo
  • Fix incorrect color-normalization for shade_raster or shade_points if vmin/vmax outside the data-range are used (thanks to @maxhollmann)

๐Ÿ”ฅ hotfix EOmaps v3.4.1

  • fix issues with delayed WebMap services on multiple maps in one figure
  • fix issues with m.all for multiple maps in one figure

- Python
Published by raphaelquast almost 4 years ago

eomaps - EOmaps v3.4

A release that brings a lot of updates on speed and memory management and some very nice (but possibly breaking) changes compared previous versions of EOmaps.

โ— IMPORTANT CHANGES โ—

โญ Starting with EOmaps v3.4 all callbacks and colorbars are layer-specific !

This means that callbacks only trigger if the layer of the associated Maps object is visible! (...and colorbars are only visible if the associated layer is visible)

  • To trigger callbacks or add features & datasets independent of the visible layer, use m.all.cb. ...
    (or attach them to a Maps object on the "all" layer)
  • Note: pick callbacks now always react to the visible collection! (except for the ones on the "all" layer)

    ```python m = Maps(layer=0) m.cb.click.attach.annotate() # this callback is ONLY executed if the layer 0 is visible

    m1 = m.new_layer(layer=1) m1.cb.click.attach.mark() # this callback is ONLY executed if the layer 1 is visible

    m.all.cb.click.attach.annotate() # this callback is executed independent of the visible layer! ```

๐Ÿƒ removed arguments

  • the obsolete "orientation" argument has been removed from Maps(...) (it set the colorbar-orientation which is now specified via m.add_colorbar(orientation=...) ---

๐ŸŒณ NEW

  • โญ m.show() can be used to make the associated layer visible. (a shortcut for m.show_layer(m.layer)
  • โญ m.BM.on_layer(...) can be used to trigger functions if the visible layer changes.
  • ๐ŸŒŸ WebMap layers are now lazily evaluated and only added to the map if the corresponding layer is actually visible.
  • ๐ŸŒŸ [experimental feature] memory-mapping can now be used to avoid using up a lot of ram for very large datasets
    • Intermediate datasets are stored as memory-mapped files in a temp-folder on disk to release memory
    • By default memory-mapping is disabled! (to activate it, use: m.plot_map(memmap=False) )

๐ŸŒฆ๏ธ changes

  • Adding data from files (e.g. m.from_file or m.new_layer_from_file) now always uses "shade_raster" as the default plot-shape (since EOmaps v3.3.2, raster-shading works perfectly fine with re-projected rasters as well)
  • If a file with >2M data-points is plotted, only "shade" shapes are attempted by default to avoid overloading memory.
  • only one colorbar is allowed for Maps objects (use multiple objects for multiple colorbars)

๐Ÿ”จ fixes

  • Fix several issues with memory-leaks and garbage-collection of objects
  • Fix autoscalefraction not recognized when using preset="bw" in `m.addscalebar`
  • Maps objects are now properly garbage-collected
  • Fix auto-scaling of scalebars for very small scales
  • Maps.from_file now properly handles pathlib.Path objects
  • Fix utility widget start-layer should be the currently visible layer
  • Fix pick-events should only identify points on visible layers
  • Fix m.add_colorbar(log=True) for horizontal colorbars
  • Fix colorbar limit autoscaling
  • Fix logo size changes on zoom
  • Remove obsolete layer kwarg from m.add_logo
  • Fix incorrect color-normalization for shade_raster or shade_points if vmin/vmax outside the data-range are used (thanks to @maxhollmann)

- Python
Published by raphaelquast almost 4 years ago

eomaps - EOmaps v3.3.2

A minor bugfix release that brings some nice updates for raster-shading!

๐ŸŒณ NEW

  • โญ Raster-shading with m.set_shape.shade_raster() can now finally be used with re-projected datasets as well!
    • The previous limitation plot_crs == data_crs is now gone for good ๐Ÿฅณ

๐Ÿ”จ fixes

  • fix issues for m.util.layer_slider when switching between xyz-WebMap layers if axis-extent changed
  • fix glitches of dynamic artists during pan/zoom
  • fix image parsing in github-pages jekyll parser

- Python
Published by raphaelquast almost 4 years ago

eomaps - EOmaps v3.3.1

A minor bugfix release (that also brings some miscellaneous convenience functions)

๐ŸŒณ NEW

(โญ: new feature, ๐Ÿƒ: new functionality for existing feature) - โญ there's a new function m.subplots_adjust() for Maps and MapsGrid objects to quickly set the margins of the plots as well as the horizontal and vertical spacing between subplots: python m = Maps() m.subplots_adjust(left=0.2, right=0.8, top=0.9, bottom=0.1) python mg = MapsGrid() mg.subplots_adjust(left=0.2, right=0.8, top=0.9, bottom=0.1, hspace=0.05, wspace=0.15) (these are just shortcuts for m.figure.gridspec.update() + m.redraw()) - ๐Ÿƒ m.add_colorbar now has an additional kwarg log=True/False to make the y-axis of the histogram logarithmic. - ๐Ÿƒ m.add_scalebar now provides style-presets via preset="<preset-name>" - at the moment there's only 1 preset... more to come in future releases! - "bw": a simple black-and-white style without a background

๐Ÿ”จ fixes

  • fix m.savefig with different dpi-settings requres a re-draw
  • fix m.plot_map with dynamic=True does not require a update
  • incorporated some updates to ensure that layers are only re-drawn if necessary
  • make sure cached backgrounds are always re-drawn if new artists are added
  • fix annotation in example 9 (still used old syntax)

- Python
Published by raphaelquast almost 4 years ago

eomaps - EOmaps v3.3

A release with some nice new features and a lot of usability updates and fixes. โ— note that there is a breaking change compared to <v3.2 (only affecting the ambiguous "layer" kwarg of dynamic artists (see ๐ŸŒฆ๏ธ changes below for details) )

๐ŸŒณ NEW

(โญ: new feature, ๐Ÿƒ: new functionalities for existing features) - โญ There's a new pre-defined WebMap service: m.add_wms.GEBCO that provides nice underwater topography (https://www.gebco.net/) - โญ Theres a new function m.redraw() that can be used to force a re-draw of the entire figure - โญ shortcuts for mg.redraw and mg.util have been added to MapsGrid - ๐Ÿƒ m.add_wms. ... <layer>.set_extent_to_bbox() now supports a new kwarg shrink which can be used to set the extent to a "shrinked" bbox (useful to avoid request-errors for tiles outside the bbox) - ๐Ÿƒ m.add_colorbar can now be used to add individual colorbars for different plot-layers (the colorbars will always reflect the currently displayed layer) - ๐Ÿƒthe peek_layer callback can now be used to either view one (or more) layers or to overlay one (or more) layers on top of the current background layer. - ๐Ÿƒ some major improvements have been implemented for fetching WebTiles from xyz-TileServer links. - m.add_wms.get_service now supports using custom wms, wmts, restAPI or xyz services

๐ŸŒฆ๏ธ changes

  • the ambiguous (and misleading) layer kwarg has finally been removed from dynamic artists. (note this "layer" was NOT referring to the actual plot-layer but to the stacking of dynamic artists!)
    • layer now always refers to the background layer name and not to the stack-order of dynamic artists!
    • โ— the plot-order of multiple artists on the same layer is now determined by matplotlib's zorder property.
      • โ• old: m.cb.click.attach.mark(layer=5) โžก๏ธ new: m.cb.click.attach.mark(zorder=5)
      • โ• old: m.cb.click.attach.annotate(layer=5) โžก๏ธ new: m.cb.click.attach.annotate(zorder=5)
      • โ• old: m.BM.add_artist(art, layer=5) โžก๏ธ new: m.BM.add_artist(art) + art.set_zorder(5)
    • all examples have been updated accordingly

๐Ÿ”จ fixes

  • fix _onrelease() missing 1 required positional argument
  • fix issues with nbagg and ipympl backends (e.g. jupyter notebooks)
  • fix plt.show should only be called if we're in an interactive backend!
  • fix some issues with the scalebar and colorbar
  • re-work of draggable_axes
  • fix maxzoom for stamen_watercolor layer

- Python
Published by raphaelquast almost 4 years ago

eomaps - EOmaps v3.2

A release with some nice new features and a lot of fixes & improvements. ... Note: many parts of the ๐Ÿ“š documentation have been updated with small code-examples and images!

๐ŸŒณ New

  • โญ m.add_annotation and m.add_marker now support adding multiple objects in one go!
  • โญ raster-shading with datashader now supports 2D arrays for values and coordinates (e.g. curvilinear QuadMeshes)
  • โญ there's a new function m.show_layer(name) that provides a shortcut for switching the currently displayed layer
  • โญ layer-names can now be arbitrary strings! (e.g. Maps(layer=...) or m.plot_map(layer=...))
    • โ— The layer-name "all", has a special meaning: all features on this layer will be visible in ALL other layers!

โญ ๐Ÿฆœ Utility widgets !

EOmaps now has a slot for utility widgets that provides some nice tools to simplify common tasks. - Utilities are accessible via m.util.<...>

At the moment, there are 2 utilities that simplify switching between layers: - โญ m.util.layer_selector() : get a "legend-like" object with buttons that can be used to switch between layers - โญ m.util.layer_slider() : get a slider that can be used to switch between layers

Checkout the ๐Ÿฆœ Utility widgets section in the docs and the updated example: ๐Ÿ›ฐ WebMap services and layer-switching


โญ๐ŸŒˆ Updates for the scalebar

The scalebar has been re-worked for a much improved "out-of-the-box" usability. - By default, the scalebar is now automatically re-scaled on pan/zoom events based on the current extent of the map. - the new autoscale_fraction argument can be used to set the relative size of the (autoscaled) scalebar - the new auto_position argument can be used to set the position targeted for automatic re-positioning on pan/zoom events. - The background patch is now automatically scaled to enclose the labels. - When dragging the scalebar with the mouse, it is now immediately released if you release the mouse-button.

python m.add_scalebar() # get a scalebar that autoscales itself on pan/zoom events m.add_scaleblar(scale=10000) # get a scalebar with a fixed segment-separation of 10km


๐ŸŒฆ๏ธ changes

  • some changes to m.new_layer :
    • It now supports the additional layer kwarg
    • โ— By default ONLY the "plot-shape" is now copied to the new layer.
    • this avoids side-effects from unintentional copying of plot-specs (vmin vmax etc.)
    • you can still copy plot-specs by using m.new_layer(copy_plot_specs=True)
  • Maps.from_file and Maps.read_file and m.new_layer_from_file now support using already opened NetCDF and GeoTIFF files

โš™๏ธ fixes

  • fix treatment of colorbar orientation in m.figure.set_colorbar_position
  • fix reprojection of wms-layers with a native crs specified as "EPSG:3857"
  • fix sorting of layer-names
  • avoid identification of pixel-ID if no pick-callback is attached
  • fix label-axis should not respond to navigation events
  • fix adding multiple markers in one go
  • fallback to WSG84 boundary in wms_layer.set_bbox_to_extent()

- Python
Published by raphaelquast almost 4 years ago

eomaps - EOmaps v3.1.4

a minor bugfix release that introduces a new (optional) kwarg for m.plot_map()

๐ŸŒณ New

  • Checkout the new example! ๐Ÿงฎ Select 1D slices of 2D datasets (as suggested in #54)
  • โญ There is a new (optional) kwarg set_extent for m.plot_map(set_extent=True)
    • set_extent=True : set the plot-extent to the data extent
    • set_extent=False : keep the plot-extent as it was before

๐Ÿ”จ fixes

  • fix m.new_layer() when parent layer uses shade_raster or shade_points (fixes __call__() got an unexpected keyword argument 'glyph')
    • allow overriding the permanent kwarg in m.add_annotationn m.add_annotation

- Python
Published by raphaelquast about 4 years ago

eomaps - EOmaps v3.1.3

... another bugfix release

๐ŸŒฆ๏ธ changes

  • an AssertionError is now raised if data- and coordinate dimensions do not match (to avoid treating datasets with equal size but different shape as valid 1D inputs)

๐Ÿ”จ fixes

  • fix re-projection of data provided with 1D coordinates and 2D data-values (e.g. raster-data)
  • fix treatment of nan-values for datashader plots
  • update docs for NaturalEarth features and GeoDataFrames

- Python
Published by raphaelquast about 4 years ago

eomaps - EOmaps v3.1.2

... some more quick fixes

๐Ÿ”จ fixes

  • fix rotation angle of ellipses
  • remove unnecessary print command
  • fix treatment of plotspecs kwargs (vmin, vmax, cmap etc...) in Maps.fromfile
  • fix defaultargs in add_gdf

- Python
Published by raphaelquast about 4 years ago

eomaps - EOmaps v3.1.1

A minor bugfix release

๐ŸŒฆ๏ธ changes

  • ๐Ÿš€ major speedup and reduced memory consumption for very large datasets
  • new way for indexing picked pixels (uses much less ram with similar performance)
  • the pick_distance argument of Maps() now specifies the search-rectangle for identifying picked pixels
    • a rectangle of radius * pick_distance x radius * pick_distance around the center of the clicked pixel is used

๐Ÿ”จ fixes

  • fix deleting callbacks from within a callback
  • fix automatic identification of Equi7Grid crs
  • fix treatment of numerical wms-layer names
  • fix intersection of gdf with crs domain
  • fix Maps.read_file should be a classmethod
  • fix deleting data_specs when figure is closed

- Python
Published by raphaelquast about 4 years ago

eomaps - EOmaps v3.1

๐ŸŒณ New

โญ New bindings for the awesome datashader library!

  • Particularly useful to speed up plotting of extremely large datasets (>10M datapoints)
  • Requires datashader to be installed (e.g. conda install -c conda-forge datashader)
  • To use "datashader" for rendering the map, set the plot-shape to:
    • m.set_shape.shade_points(...) : use datashader to "shade" the data with infinitesimal points
    • m.set_shape.shade_raster(...) : (only for rectangular datasets with datacrs=plotcrs) use datashader to "shade" the data as a dynamically updated QuadMesh

โญ It is now possible to add a Compass (or a North-Arrow) to the map!

  • simply use c = m.add_compass(...)
  • the compass is dynamically updated on zoom events and can be dragged around with the mouse! asdf

โญ EOmaps now has some basic readers for common data-types (NetCDF, GeoTIFF, CSV)

  • Requires xarray, rioxarray and pandas
  • Use gdf = m.read_file.NetCDF(...) to read all relevant data
  • Use m = Maps.from_file.NetCDF(...) to directly initialize a Maps-object from a file
  • Use m2 = m.new_layer_from_file.NetCDF(...) to add a new layer to an existing Maps object from a file

โญ Support for Equi7Grid projection

  • EOmaps now provides a cartopy-compatible crs for Equi7Grid projections!
  • Requires equi7grid to be installed (e.g. pip install equi7grid) python from eomaps.projections import Equi7Grid_projection m = Maps(Equi7Grid_projection("EU") asdf2

โญ New clipping & re-projection methods for GeoDataFrames

  • m.add_gdf() and m.add_feature() now have 2 new arguments: reproject and clip (useful to avoid re-projection issues):
    • reproject lets you select between geopandas (="gpd") and "cartopy" for re-projecting the geometries
    • clip lets you select multiple ways for clipping the data prior to plotting
    • "crs", "crsbounds", "extent", "gdalSymmetricDifference", "gdalIntersection" and "gdalDifference"

๐ŸŒฆ๏ธ changes

  • The pixel-radius is now estimated using a more robust method if no explicit radius is provided.
    • it's based on the median of the nearest-neighbour distances for the first 100k datapoints
    • the number of datapoints used to estimate the radius can be adjusted by setting m.set_shape.radius_estimation_range
  • The title argument of m.set_plot_specs is now depreciated... use m.ax.set_title() instead!

โš™๏ธ fixes

  • fix MapsGrid crs-specifications with pyproj and numpy-dtypes
  • fix skipping re-projection if "in-crs" == "plot_crs"
  • fix MapsGrid has no attribute preferred_wms_service
  • fix 'radius' estimation for shapes that do not explicitly require a radius
  • fix background-layers need to be re-fetched if the figure canvas is resized
  • clear data from memory if the figure is closed
  • fix masking of nan-values prior to plotting
  • m.add_colorbar() now supports setting the number of bins used to draw the histogram via the histbins kwarg
  • make sure that zoom and close callbacks are only attached once to the figure
  • fix delayed fetching of RestAPI services

- Python
Published by raphaelquast about 4 years ago

eomaps - EOmaps v3.0

EOmaps v3.0 comes with a lot of usability improvements and some nice new features!

โ— NOTE: There are breaking changes compared to EOmaps v2.x

... if you used EOmaps before, make sure to take a quick look at the list below! (or check the examples in the doc which have been updated accordingly)

โ— details on breaking changes with respect to EOmaps v2.x - [click to expand] - Removed functions and properties: `m.add_overlay`, `m.add_coastlines`, `m.crs_list` - Changed arguments and/or behavior: `Maps`, `MapsGrid`, `m.copy`, `m.plot_map`, `m.add_gdf`, `m.add_colorbar` - New functions: `m.new_layer`, `m.add_feature`, `m.add_logo`, `m.cb.pick.highlight_geometry` - โ— `m.add_overlay` and `m.add_coastlines` have been removed in favor of `m.add_feature` - โญ use `m.add_feature..( ... )` instead - โ— the `coastlines` as well as the `colorbar` argument for `m.plot_map()` have been removed - โญ use `m.add_feature.preset.coastline()` or `m.ax.coastlines()` instead - โญ use `m.add_colorbar()` after calling `m.plot_map()` to add a colorbar for an existing map - โ— the arguments and behavior of `m.copy(...)` have changed (note that most of the time users anyway will want the new โญ`m.new_layer()` function) - all arguments of `m.copy` are now without the "copy_" prefix, e.g.: "data" instead of "copy_data" etc. - โ— the first argument of `Maps` is now the plot-crs (e.g. `Maps(crs=3857)` is the same as `m.plot_specs.crs=3857` ) and additional `kwargs` are forwarded to the initialization of the matplotlib-figure (e.g. `plt.figure`)

๐ŸŒณ New

โญ the plot coordinate-system is now specified directly on initialization of Maps object

  • โ— NOTE: this replaces m.set_plot_specs(crs=...) as well as m.plot_specs.crs=...
  • additional kwargs are passed to the initialization of the matplotlib figure python m=Maps(crs=4326, figsize=(10,5))

โญ there's a new function m.new_layer() that simplifies adding new layers to a map

  • it simply returns a new Maps object that shares the figure and plot-axes.

โญ EOmaps now supports multiple ways for providing datasets!

  • a single pandas.DataFrame containing both values and coordinates (the only option for EOmaps < v2.4.2)
  • individual pandas.Series for data-values and coordinates
  • individual 1D or 2D numpy.arrays for data-values and coordinates
  • individual 1D lists for data-values and coordinates

โญ The new m.add_feature container provides direct access to ALL NaturalEarth features!

  • โ— NOTE: this replaces m.add_overlay and m.add_coastlines
  • autocompletion helps with identifying the relevant NaturalEarth features
    • e.g. m.add_feature.physical_10m.<...feature...>(...) or m.add_feature.cultural_50m.<...feature...>(...)
  • with geopandas installed, NaturalEarth features can be interactive too!
    (adding static layers works also without geopandas)

```python

access specific NaturalEarth layers:

m.addfeature.cultural50m.admin0countries(fc="red", ec="k", alpha=0.5)

there are some presets to quickly add commonly used features

m.add_feature.preset.ocean() # (coastline, land, countries)

make the layers interactive (requires geopandas)!

m.addfeature.cultural50m.admin0countries(fc="none", ec="k", pickername="countries") m.cb.pick["countries"].attach.highlightgeometry(fc="r") ```

โญ there's a new function m.add_logo that can be used to add images to the map

  • particularly useful to add a smal logo in the corner of a plot

โญ a lot of improvements to m.add_gdf

  • it is now possible to pick a geometry based on the closest "centroids" or based on a "contains" query
    • with this, picking now also works for lines and points! python # for picking lines and points m.add_gdf(gdf, picker_name="pickername", pick_method="centroids") m.cb.pick["pickername"].attach.<...> # for picking polygons m.add_gdf(gdf, picker_name="pickername2", pick_method="contains") m.cb.pick["pickername2"].attach.<...>

โญ there's a new pre-defined callback m.cb.pick[<name>].highlight_geometries

  • this callback is exclusive to geopandas.GeoDataFrames and allows highlighting a shape when you click on it!

โญ m.add_colorbar() can now be used to add colorbars to existing Maps!

  • โ— NOTE: this replaces the old colorbar-argument of m.plot_map()

โญ MapsGrid now supports additional functionalities

  • use MapsGrid(crs=...) to specify the crs (unique crs for each Maps-objects can be specified by passing lists or dicts)
  • there are a lot of new convenience-functions to execute actions on all Maps objects on the grid:
    • mgrid.add_feature, mgrid.add_wms, mgrid.add_colorbar, mgrid.set_shape, mgrid.add_logo

โญ the plot-axis can now be accessed directly via m.ax

โญ possible crs for plotting are now accessible via Maps.CRS and possible classifiers are accessible via Maps.CLASSIFIERS

๐Ÿ”ง fixes

  • fix m.cb.pick.plot callback
  • fix forwarding of event attributes
  • treatment of point- or line-like NaturalEarth features
  • fix layer kwarg for m.add_gdf
  • a lot more unittests!
  • allow positional arguments for m.set_data (or m.set_data_specs)

- Python
Published by raphaelquast about 4 years ago

eomaps - EOmaps v2.4.1

A minor bugfix release

๐Ÿ”ง fixes

  • fix nested copying of Maps objects with "connect=True"
  • fix EEA_DiscoMap WMS service
  • fix toolbar-action check if no toolbar exists
  • fix m.cb.dynamic.indicate_extent() does not show extent right away
  • ... update some warnings, remove obsolete functions and print-statements

โš™๏ธ updates

  • ... a lot of new unittests
    • all examples from the doc are run during the unittests
    • added tests for WebMap services
    • added tests for interactive capabilities (scalebar, draggable axes, etc.)

- Python
Published by raphaelquast about 4 years ago

eomaps - EOmaps v2.4

๐ŸŒณ New

๐ŸŒป NEW functionalities for eomaps.MapsGrid !

  • It is now possible to use Maps objects alongside ordinary matplotlib axes with MapsGrid !
    • 2 additional kwargs (m_inits and ax_inits) provide full control over the initialization of the MapsGrid object.

For example: python from eomaps import MapsGrid mgrid = MapsGrid(2, 2, m_inits=dict(top_row=(0, slice(0, 2)), bottom_left=(1, 0)), ax_inits=dict(bottom_right=(1,1)) ) mgrid.m_top_row # A Maps object whose axis spans over the entire top-row of the grid mgrid.m_bottom_left # A Maps object with an axis in the bottom left corner of the grid mgrid.ax_bottom_right # An ordinary matplotlib axis in the bottom right corner of the grid


๐Ÿ”จ updates and fixes

  • the creation of a colorbar-axes is now omitted in case plot_map is called without a dataset
  • some doc updates
  • from now on, a warning to install geopandas is only shown if a function that actually requires geopandas is called (e.g. add_overlay and add_gdf)
  • it is now possible to partially re-create an already closed figure
    • attached callbacks are automatically re-assigned to the newly created figure
    • all properties that are not related to the figure object remain unchanged in case the figure is closed
    • ... however, any plot-functions (plot_map, add_marker, add_wms etc. ) must be called again!
  • fix sharing of click events
  • disable arrows in colorbar (for now) to ensure that the limits are correct

- Python
Published by raphaelquast about 4 years ago

eomaps - EOmaps v2.3

๐Ÿ“๐Ÿ“๐Ÿ“ There's an awesome new (fully customizable) scalebar feature available!

Checkout the new example in the docs! >> Adding scalebars << - You can now add a scalebar to the map via m.add_scalebar() - works on any cartopy projection! - Use mouse & keyboard to adjust the scalebar directly inside the plot - drag the scalebar with the mouse! - rotate it with the + and - keys - remove it by pressing the delete key - change the frame-width with the arrow-keys

๐Ÿ”งFixes

  • remove unnecessary print in m.add_gdf
  • better testing for event-forwarding

- Python
Published by raphaelquast about 4 years ago

eomaps - EOmaps v2.2

some fixes and a new feature: pickable geopandas.GeoDataFrames >> checkout the new example !

๐ŸŒณ new

  • It is now possible to use geopandas.GeoDataFrames for picking!
    • first, use m.add_gdf(picker_name="MyPicker") to make the GeoDataFrame pickable
    • then you can attach callbacks via m.cb.MyPicker... or m.cb.pick["MyPicker"]...
  • you can also assign custom pickers for arbitrary artists via m.cb.add_picker
  • callback-artists can now easily be made "temporary" via m.cb.[click/pick].add_temporary_artist() ### ๐Ÿ”จ fixes
  • fix docstring issue with S1GBM wms service on python 3.10
  • fix typo in MapsGrid when accessing individual objects via mg[0,0] instead of mg.m_0_0
  • fix issues with shared callbacks for non-global projections
  • always use the shape of the Maps object as default for markers (if possible)

- Python
Published by raphaelquast about 4 years ago

eomaps - EOmaps v2.1.1

just some minor bugfixes

๐Ÿ”จ fixes

  • fix some issues with the crs-specification in m.add_gdf()
  • automatically activate matplotlib's interactive mode using plt.ion() and call plt.show() when a map is created
  • include wms dependencies in setup.py
  • the default radius for m.add_marker no longer requires a dataset
  • add support for using a custom picker (work-in-progress)

- Python
Published by raphaelquast about 4 years ago

eomaps - EOmaps v2.1

... there are a lot of documentation updates!

๐ŸŒณ new

  • axes-specifications can now be passed to the initialization of a MapsGrid object
  • there are new WebMap layers!
    • OSM default style (https://openstreetmap.org)
    • OSM german default style (https://openstreetmap.de)
    • OpenTopoMap (https://opentopomap.org)
    • OSM stamen toner (standard, lite, lines, labels, background, hybrid) (http://maps.stamen.com/#toner)
    • OSM stamen terrain (standard, lines, labels, background) (http://maps.stamen.com/#terrain)
    • OSM stamen watercolor (http://maps.stamen.com/#watercolor)

๐Ÿ›changes

  • adding WebMap services now works exclusively via m.add_wms independent of the service-type (m.add_wmts has been removed)
    • for services that allow multiple access possibilities (e.g. WMS, WMTS, etc.), the preferred way of accessing the WebMap service can be set on the initialization of the Maps-object via m = Maps(preferred_wms_service="wmts")

๐Ÿ”จ fixes

  • positional arguments are now properly forwarded when callbacks are attached (e.g. m.cb.click.peek_layer(1) now works as expected)
  • generalized access to xyz-tile-server
  • kwargs passed to MapsGrid are now forwarded to GridSpec

- Python
Published by raphaelquast about 4 years ago

eomaps - EOmaps v2.0.2

another minor bugfix release

๐ŸŒณ new

  • There's a new example on how to use WebMap services in the doc!

๐Ÿ”จ fixes

  • make sure WebMap services are put on the assigned default layer
  • avoid initializing axes on S1GBM wms-collection initialization
  • make sure to update S1GBM layer if "home" or "left/right" toolbar buttons are pressed

- Python
Published by raphaelquast about 4 years ago

eomaps - EOmaps v2.0.1

... just a minor bugfix release

- Python
Published by raphaelquast over 4 years ago

eomaps - EOmaps v2.0

This release represents a complete re-work compared to EOmaps v1.x.x !

๐ŸŒผ A documentation is now available on readthedocs! >>> check it out here

๐ŸŒณ new

๐ŸŒด WMS and WMTS capabilities

  • โ— requires optional dependency owslib
  • WMTS (or WMS) layers can be added via:
    • m.add_wmts.<COLELCTION>.add_layer.<LAYER>(**kwargs)
    • m.add_wmts.<COLELCTION>[<LAYER>](**kwargs)
  • pre-defined layers include interfaces to
    • ESA Copernicus & WorldCover layers
    • Sentinel-1 Global Backscatter Model
    • EEA Discomap layers
    • NASA GIBS
    • Austrian basemaps (basemap.at & Vienna)
    • ... and more!

๐ŸŒต re-arrange plot-axes via drag & drop

  • press alt + d to activate / deactivate "axis-arrangement" mode
    • use the mouse to select the axis you want to change
    • use "left/right/up/down" or the mouse to move the selected layer
    • use "alt+left/right/up/down" to move the layer quicker
    • use "ctrl+up/down" to show/hide colorbars & histograms

๐ŸŒฒ share callback-events between multiple Maps objects

  • e.g.: click on one map to trigger a callback on multiple connected maps!
    • to connect maps-objects, provide a "parent"-object on initialization m = Maps(parent=m0)
    • forward callback-triggers from one Maps object to others via: m.cb.click.forward_events(m1, m2, m3)
    • ... or join the callback-events "both-ways" via m.cb.click.share_events(m1, m2, m3)

๐ŸŒฑ... and some more:

  • there's a new MapsGrid object to quickly initialize a grid of Maps-objects m1, m2, m3, m4 = MapsGrid(2, 2)
  • join zoom-limits between multiple axes (with the same crs) m.join_limits(m1, m2, m3)

๐Ÿฆ changes

  • f, gs_ax and orientation are now set on initialization of the Maps-object!
    (they are no longer arguments of m.plot_map())

  • callbacks are now accessed differently

    • instead of m.cb.attach() and m.cb_click.attach there's now
      • m.cb.click : trigger callbacks when clicking anywhere on the map
      • m.cb.pick : trigger callbacks when clicking on a point of the plotted dataset
      • m.cb.keypress : trigger callbacks when pressing a key
      • m.cb.dynamic : trigger callbacks on events (e.g. zoom)

๐Ÿ”จ fixes

  • make sure shapes are properly copied on m.copy()
  • make sure geod_circles only takes numbers as radius
  • sharing callbacks now works across coordinate-systems!
  • multiple temporary markers & annotations are now supported

- Python
Published by raphaelquast over 4 years ago

eomaps - EOmaps v1.0.2

๐ŸŒณ new

  • m.set_shape.rectangles(radius, radius_crs, n) now supports an additional n keyword to calculate intermediate points on the edges (e.g. useful to draw "curved" projected rectangles) ### ๐Ÿ›ธ fixes
  • allow setting n also in the mark-callback

- Python
Published by raphaelquast over 4 years ago

eomaps - EOmaps v1.0.1

a minor bugfix release

๐ŸŒณ new

  • a new method m.indicate_masked_points() is added to indicate points that have been masked

๐Ÿ›ธ fixes

  • fix repr-string of the callback-container
  • fix adding markers if "geod_circles" have been plotted
  • avoid transforming "out-of-bounds" for rectangles
  • don't create markers with radius="pixel" if the shape does not set a radius

๐ŸŒ checkout the README, the example-notebook and the docstrings for usage-details!

- Python
Published by raphaelquast over 4 years ago

eomaps - EOmaps v1.0

  • major updates and breaking changes compared to EOmaps v0.x.x

๐ŸŒ checkout the README, the example-notebook or the docstrings for usage-details!

- Python
Published by raphaelquast over 4 years ago

eomaps - EOmaps v0.1.7

new

there are 2 new plot-types:

"delauney_triangulation"

  • ... e.g. plot a (continuous) triangulation-shading of irregularly distributed points
  • it supports additional customization by adding a suffix to the "shape"-name:
    • _flat: plot actual polygons (with mean-values) instead of a mesh that interpolates values
    • _masked: use the defined "radius" to mask any triangle for which the distance between the centroid and the vertices exceeds (2 * radius) (particularly useful for densely sampled data-points whose exterior is a a concave shape)
    • _flat_masked: a combination of the above options

"Voroni"

  • create a voroni-diagram
  • similar as with the Delauney triangulation, any polygon whose defining data-point is farther than (2 * radius) away from any vertex of the Voroni-diagram is masked

fixes

  • cache the background on first draw of the map so that callbacks can immediately trigger

- Python
Published by raphaelquast over 4 years ago

eomaps - EOmaps v0.1.6

new

  • example notebook updated to show most of the implemented functionalities
  • markers & annotations now support permanent=True/False
  • there's now an option m.set_plot_specs(histbins="bins") to use the bins calculated by the data-classification for the histogram! (...only possible if a classification is used!)
  • you can now specify "layers" for dynamic plot components (e.g. markers, annotations etc)
  • option "radius_crs" added to m.cb.mark to specify the radius of the marker in an arbitrary crs #### new functions:
  • m.cb.clear_annotations() and m.cb.clear_markers() to clear all annotations and markers
  • m.figure.set_colorbar_position() to manually change the position of the colorbar & histogram
  • m.add_overlay_legend() to quickly customize the legend for map-overlays ## fixes
  • "rectangle"-marker can now be properly "buffered"
  • fix setting "vmin" and "vmax" in plot_specs
  • major improvements on blitting implementation
  • use explicit cleanup functions to clear markers & annotations separately
  • set "double_click=False" as the default for callbacks (to avoid the open issue that double-clicks are not recognized in ipympl for Jupyter-Notebooks )
  • ensure histogram is always properly positioned on top of the colorbar
  • fix rotation and size of markers
  • allow multiple callbacks (with same button) for "marker" and "annotation"
  • fix initialization of subgrids if a GridSpec is passed to m.plot_map
  • always overwrite all classify_specs to avoid mixing kwargs

- Python
Published by raphaelquast over 4 years ago

eomaps - EOmaps v0.1.5

fixes

  • fix #16 (e.g. install issues with VERSION file)
  • fix issues when coordinates are provided as integer-arrays and radius is estimated as float
  • execute callbacks only if point is identified

- Python
Published by raphaelquast over 4 years ago

eomaps - EOmaps v0.1.4

fixes

  • there were some issues when specifying "radius_crs" in conjunction with "cpos" that are fixed now
    • "radius_crs" can be one of "in", "out" or any crs-specification recognized by pyproj
    • "cpos" can be one of "c", "ul", "ur", "ll", "lr"
  • fix typo in README: xcoord="lon" and ycoord="lat"
  • use explicit "VERSION" file to specify module-version in one place

- Python
Published by raphaelquast over 4 years ago

eomaps - EOmaps v0.1.3

new

  • trimesh_rectangles has been added as a possible plot-shape (e.g. m.set_plot_specs(shape="trimesh_rectangles") (it uses a triangular mesh for plotting which is useful for contour-plots since pixel-boundaries are invisible)
  • option to copy the data with m.copy(copy_data=True) has been added

fixes

  • copy now performs a deep-copy of all properties
  • make geopandas an optional import (basic functions do not require geopandas)
  • add pyepsg as dependency
  • use xcoord and ycoord as labels for annotations
  • cleanup callbacks if figure is closed

- Python
Published by raphaelquast over 4 years ago

eomaps - EOmaps v0.1.2

new

  • add_marker() function added to manually add markers
  • add_annotations() function added to manually add annotations
  • annotate can now be used on multiple buttons
  • add text argument to m.cb.annotate to manually specify the text
  • add m.cb.clear_annotations() function to delete annotations
  • add savefig function to save the image ### fixes
  • fix permanent annotations
  • + more fixes + more unittests

- Python
Published by raphaelquast over 4 years ago

eomaps - EOmaps v0.1.1

new

  • allow multiple callbacks of the same function (using different mouse-button assignments)
  • add option to make annotations permanent m.cb.annotate(... , permanent=True)
  • add option to format annotation display via m.cb.annotate(..., val_fmt=<callable>)
  • add m.cb.mark callback (e.g. to overlay markers around selected points)
  • all callback-returns are now accessible via m.cb...
  • add m.cb.cb_list (e.g. a hardcoded list of available callback functions) ## fixes
  • better fetching of background for blitting (now also works with multiple callbacks)

- Python
Published by raphaelquast over 4 years ago

eomaps - EOmaps v0.1

This is a first (beta) release... use with care!

- Python
Published by raphaelquast over 4 years ago