View on GitHub


A library to create interactive maps of geographical datasets

tests codecov       pypi Conda Version       Documentation Status Buy Me A Coffee


A library to create interactive maps of geographical datasets

  1. 🌍 Simple interface to visualize geographical datasets
    • ⬥ a pandas.DataFrame is all you need
    • ⬥ usable also for large datasets with > 1M datapoints
    • ⬥ add WebMap layers, annotations, markers with a single line of code
  2. 🌎 Quickly turn your maps into powerful interactive data-analysis widgets
    • ⬥ use callback functions to interact with the data (or an underlying database)
    • ⬥ compare multiple data-layers, WebMaps

🌲🌳 Checkout the documentation for more details and examples 🌳🌲

🔨 installation

To install EOmaps (and all its dependencies) via the conda package-manager, simply use:

conda install -c conda-forge eomaps

For more information, have a look at the installation instructions in the documentation!

EOmaps example image 2 EOmaps example image 1 EOmaps example image 3 EOmaps example image 1 EOmaps example image 1 EOmaps example image 1

🌳 Basic usage

import pandas as pd
from eomaps import Maps

# the data you want to plot
data = pd.DataFrame(dict(lat=[...], lon=[...], value=[...]))

# initialize Maps object
m = Maps()
# set the data
m.set_data(data=data, xcoord="lon", ycoord="lat", parameter="value", crs=4326)
# set the shapes that you want to use to represent the data-points
m.set_shape.geod_circles(radius=10000) # (e.g. geodetic circles with 10km radius)
# set the appearance of the plot
m.set_plot_specs(crs=Maps.CRS.Orthographic(), cmap="viridis")
# (optionally) classify the data
m.set_classify_specs(scheme=Maps.CLASSIFIERS.Quantiles, k=5)
# plot the map

🌌 advanced usage

[click to show]                       🛸 Checkout the docs! 🛸

🌍 Attach callback functions to interact with the plot
  • Many pre-defined functions for common tasks are available!
    • display coordinates and values, add markers, compare data-layers etc.
    • ... or define your own function and attach it to the plot!
  • Maps objects can be interactively connected to analyze relations between datasets!
# get a nice annotation if you click on a datapoint
# draw a marker if you click on a datapoint
m.cb.pick.attach.mark(facecolor="r", edgecolor="g", shape="rectangles", radius=1, radius_crs=4326)

# show the data-layer `1` in a inset-rectangle (size=20% width of the axes) if you click on the map, layer=1)
#attach some custom function to interact with the map<... a custom function ...>)

# show the data-layer `1` if you press "a" on the keyboard and the layer `0` if you press "q"
m.cb.keypress.attach.switch_layer(layer=0, key="q")
m.cb.keypress.attach.switch_layer(layer=1, key="a")
🌕 Add additional layers and overlays
  • many pre-defined interfaces for WebMap servers exist
    • OpenStreetMap
    • ESA WorldCover
    • Nasa GIBS
    • S1GBM
    • ... and more!
m.add_wms(...)             # add WebMapService layers
m.add_gdf(...)             # add geo-dataframes
m.add_overlay(...)         # add overlay-layers from NaturalEarth

m.add_annotation(...)      # add static annotations
m.add_marker(...)          # add static markers
🪐 Save the figure
m.savefig("oooh_what_a_nice_figure.png", dpi=300)
🌗 Connect Maps-objects to get multiple interactive layers of data
m = Maps()

m2 = Maps(parent=m) # connect Maps to get multiple interactive data-layers
m2.plot_map(layer=2)         # plot another layer of data
m2.cb.attach.peek_layer(layer=2, how=0.25)
🌏 Plot grids of maps
from eomaps import MapsGrid
mgrid = MapsGrid(2, 2, connect=True)

for m in mgrid:
   m.plot_specs.plot_crs = 3857


mgrid.parent.join_limits(*mgrid.children)   # join limits