Simple, concise geographical visualization in Python

Overview



Geographic visualizations for HoloViews.

Build Status Linux/MacOS/Windows Build Status
Coverage codecov
Latest dev release Github tag
Latest release Github release PyPI version geoviews version conda-forge version defaults version
Docs gh-pages site

What is it?

GeoViews is a Python library that makes it easy to explore and visualize any data that includes geographic locations. It has particularly powerful support for multidimensional meteorological and oceanographic datasets, such as those used in weather, climate, and remote sensing research, but is useful for almost anything that you would want to plot on a map! You can see lots of example notebooks at geoviews.org, and a good overview is in our blog post announcement.

GeoViews is built on the HoloViews library for building flexible visualizations of multidimensional data. GeoViews adds a family of geographic plot types based on the Cartopy library, plotted using either the Matplotlib or Bokeh packages.

Each of the new GeoElement plot types is a new HoloViews Element that has an associated geographic projection based on cartopy.crs. The GeoElements currently include Feature, WMTS, Tiles, Points, Contours, Image, QuadMesh, TriMesh, RGB, HSV, Labels, Graph, HexTiles, VectorField and Text objects, each of which can easily be overlaid in the same plots. E.g. an object with temperature data can be overlaid with coastline data using an expression like gv.Image(temperature) * gv.Feature(cartopy.feature.COASTLINE). Each GeoElement can also be freely combined in layouts with any other HoloViews Element , making it simple to make even complex multi-figure layouts of overlaid objects.

Installation

If you want the latest GeoViews, you will need an up-to-date environment. Updating is never risk-free, but it is a good idea in general and the commands conda list --revisions and conda install --revision N can usually recover from updates gone awry.

conda update --all

You can then install GeoViews and all of its dependencies with the following:

conda install -c pyviz geoviews

Alternatively you can install the geoviews-core package, which only installs the minimal dependencies required to run geoviews:

conda install -c pyviz geoviews-core

In certain circumstances proj6 issues may prevent installation or cause issues (particularly with cartopy<=0.17). If you encounter these issues ensure you also pin proj4::

conda install proj4<6

Once installed you can copy the examples into the current directory using the geoviews command and run them using the Jupyter notebook:

geoviews examples
cd geoviews-examples
jupyter notebook

(Here geoviews examples is a shorthand for geoviews copy-examples --path geoviews-examples && geoviews fetch-data --path geoviews-examples.)

In the classic Jupyter notebook environment and JupyterLab, first make sure to load the gv.extension(). GeoViews objects will then render themselves if they are the last item in a notebook cell. For versions of jupyterlab>=3.0 the necessary extension is automatically bundled in the pyviz_comms package, which must be >=2.0. However note that for version of jupyterlab<3.0 you must also manually install the JupyterLab extension with:

jupyter labextension install @pyviz/jupyterlab_pyviz

Once you have installed JupyterLab and the extension launch it with:

jupyter-lab

If you want to try out the latest features between releases, you can get the latest dev release by specifying -c pyviz/label/dev in place of -c pyviz.

Additional dependencies

If you need to install libraries only available from conda-forge, such as Iris (to use data stored in Iris cubes) or xesmf, you should install from conda-forge:

conda create -n env-name -c pyviz -c conda-forge geoviews iris xesmf
conda activate env-name

GeoViews itself is also installable using pip, but to do that you will first need to have installed the dependencies of cartopy, or else have set up your system to be able to build them.

Comments
  • Geoviews Import Error

    Geoviews Import Error

    Hello, I'm running Python 3.6.3 via Conda and I can not import GeoViews into a notebook. I've successfully run "conda install -c conda-forge -c ioam holoviews geoviews" in command line. But whenever I go to a notebook to import GeoViews I get the error below.

    [1] Import GeoViews


    ImportError Traceback (most recent call last) in () ----> 1 import geoviews

    C:\Program Files\Anaconda3\lib\site-packages\geoviews_init_.py in () 7 import param 8 ----> 9 from .element import (_Element, Feature, Tiles, # noqa (API import) 10 WMTS, LineContours, FilledContours, Text, Image, 11 Points, Path, Polygons, Shape, Dataset, RGB,

    C:\Program Files\Anaconda3\lib\site-packages\geoviews\element_init_.py in () 1 from holoviews.element import ElementConversion, Points as HvPoints 2 ----> 3 from .geo import (_Element, Feature, Tiles, is_geographic, # noqa (API import) 4 WMTS, Points, Image, Text, LineContours, RGB, 5 FilledContours, Path, Polygons, Shape, Dataset,

    C:\Program Files\Anaconda3\lib\site-packages\geoviews\element\geo.py in () 3 from cartopy import crs as ccrs 4 from cartopy.feature import Feature as cFeature ----> 5 from cartopy.io.img_tiles import GoogleTiles as cGoogleTiles 6 from cartopy.io.shapereader import Reader 7 from holoviews.core import Element2D, Dimension, Dataset as HvDataset, NdOverlay

    C:\Program Files\Anaconda3\lib\site-packages\cartopy\io\img_tiles.py in () 30 from future import (absolute_import, division, print_function) 31 ---> 32 from PIL import Image 33 import shapely.geometry as sgeom 34 import numpy as np

    C:\Program Files\Anaconda3\lib\site-packages\PIL\Image.py in () 56 # Also note that Image.core is not a publicly documented interface, 57 # and should be considered private and subject to change. ---> 58 from . import _imaging as core 59 if PILLOW_VERSION != getattr(core, 'PILLOW_VERSION', None): 60 raise ImportError("The _imaging extension was built for another "

    ImportError: DLL load failed: The specified module could not be found.

    opened by CodeDC93 21
  • Python 3.6 installation issues related to geoviews, holoviews, datashader stack

    Python 3.6 installation issues related to geoviews, holoviews, datashader stack

    I attempted to make a Python 3.6 environment inclusive of datashader, holoviews, geoviews, and related dependencies. Here are the commands I ran:

    conda create --name ds36 python=3.6
    source activate ds36
    conda install -c ioam/label/dev holoviews
    conda install datashader
    cd $C/datashader
    python setup.py develop
    conda install -c ioam paramnb
    conda install -c scitools/label/dev -c conda-forge iris cartopy
    conda install xarray
    conda install -c conda-forge -c ioam holoviews>=1.6.2 geoviews
    

    On the last line of that sequence of commands, I got the following error:

    UnsatisfiableError: The following specifications were found to be in conflict:
      - geoviews -> python 2.7*
      - python 3.6*
    Use "conda info <package>" to see the dependencies for each package.
    

    Here's the ds36 at the time of that final failure:

    appnope                   0.1.0                    py36_0
    biggus                    0.15.0                   py36_0    conda-forge
    bleach                    1.5.0                    py36_0
    bokeh                     0.12.4                   py36_0
    cartopy                   0.15.0              np112py36_0    conda-forge
    cf_units                  1.1.3                    py36_1    conda-forge
    chest                     0.2.3                    py36_0
    cloudpickle               0.2.2                    py36_0
    curl                      7.52.1                        0    conda-forge
    cycler                    0.10.0                   py36_0
    dask                      0.14.0                   py36_0
    datashader                0.4.0                    py36_0
    datashape                 0.5.4                    py36_0
    decorator                 4.0.11                   py36_0
    entrypoints               0.2.2                    py36_1
    expat                     2.1.0                         2    conda-forge
    freetype                  2.7                           1    conda-forge
    geos                      3.5.1                         1    conda-forge
    hdf4                      4.2.12                        0    conda-forge
    hdf5                      1.8.17                        9    conda-forge
    heapdict                  1.0.0                    py36_1
    holoviews                 1.7dev6                  py36_0    ioam/label/dev
    html5lib                  0.999                    py36_0
    icu                       54.1                          0
    ipykernel                 4.5.2                    py36_0
    ipython                   5.3.0                    py36_0
    ipython_genutils          0.1.0                    py36_0
    ipywidgets                5.2.2                    py36_1
    iris                      1.12.0                   py36_1    conda-forge
    jbig                      2.1                           0
    jinja2                    2.9.5                    py36_0
    jpeg                      9b                            0
    jsonschema                2.5.1                    py36_0
    jupyter                   1.0.0                    py36_3
    jupyter_client            5.0.0                    py36_0
    jupyter_console           5.1.0                    py36_0
    jupyter_core              4.3.0                    py36_0
    libgfortran               3.0.0                         0    conda-forge
    libiconv                  1.14                          4    conda-forge
    libmo_unpack              3.0                           1    conda-forge
    libnetcdf                 4.4.1.1                       2    conda-forge
    libpng                    1.6.28                        0    conda-forge
    libtiff                   4.0.6                         3
    libxml2                   2.9.4                         0
    libxslt                   1.1.29                        3    conda-forge
    llvmlite                  0.16.0                   py36_0
    locket                    0.2.0                    py36_1
    lxml                      3.7.2                    py36_1    conda-forge
    markupsafe                0.23                     py36_2
    matplotlib                1.5.3               np112py36_7    conda-forge
    mistune                   0.7.3                    py36_1
    mkl                       2017.0.1                      0
    mo_pack                   0.2.0               np112py36_0    conda-forge
    multipledispatch          0.4.9                    py36_0
    nbconvert                 5.1.1                    py36_0
    nbformat                  4.3.0                    py36_0
    nc_time_axis              1.0.1                    py36_0    conda-forge
    netcdf4                   1.2.4               np112py36_3    conda-forge
    networkx                  1.11                     py36_0
    notebook                  4.3.1                    py36_0
    numba                     0.31.0              np112py36_0
    numpy                     1.12.0                   py36_0
    odo                       0.5.0                    py36_1
    olefile                   0.44                     py36_0
    openssl                   1.0.2k                        0
    owslib                    0.14.0                   py36_0    conda-forge
    pandas                    0.19.2              np112py36_1
    pandocfilters             1.4.1                    py36_0
    param                     1.5.0                    py36_0    ioam
    paramnb                   2.0.1                    py36_0    ioam
    partd                     0.3.7                    py36_0
    path.py                   10.1                     py36_0
    pexpect                   4.2.1                    py36_0
    pickleshare               0.7.4                    py36_0
    pillow                    4.0.0                    py36_2    conda-forge
    pip                       9.0.1                    py36_1
    proj4                     4.9.3                         2    conda-forge
    prompt_toolkit            1.0.9                    py36_0
    ptyprocess                0.5.1                    py36_0
    pyepsg                    0.3.1                    py36_0    conda-forge
    pygments                  2.2.0                    py36_0
    pyke                      1.1.1                    py36_0    conda-forge
    pyparsing                 2.1.4                    py36_0
    pyproj                    1.9.5.1                  py36_0    conda-forge
    pyqt                      5.6.0                    py36_2
    pyshp                     1.2.10                   py36_0    conda-forge
    python                    3.6.0                         0
    python-dateutil           2.6.0                    py36_0
    pytz                      2016.10                  py36_0
    pyyaml                    3.12                     py36_0
    pyzmq                     16.0.2                   py36_0
    qt                        5.6.2                         0
    qtconsole                 4.2.1                    py36_1
    readline                  6.2                           2
    requests                  2.13.0                   py36_0
    scipy                     0.18.1              np112py36_1
    setuptools                27.2.0                   py36_0
    shapely                   1.5.17              np112py36_2    conda-forge
    simplegeneric             0.8.1                    py36_1
    sip                       4.18                     py36_0
    six                       1.10.0                   py36_0
    sqlite                    3.13.0                        0
    terminado                 0.6                      py36_0
    testpath                  0.3                      py36_0
    tk                        8.5.18                        0
    toolz                     0.8.2                    py36_0
    tornado                   4.4.2                    py36_0
    traitlets                 4.3.2                    py36_0
    udunits2                  2.2.23                        0    conda-forge
    wcwidth                   0.1.7                    py36_0
    wheel                     0.29.0                   py36_0
    widgetsnbextension        1.2.6                    py36_0
    xarray                    0.9.1                    py36_0
    xz                        5.2.2                         1
    yaml                      0.1.6                         0
    zlib                      1.2.8                         3
    

    I ran a similar sequence of commands for Python 2.7, 3.4, and 3.5 and the commands ran okay (I'm still now checking in those other Pythons envs if those envs actually work).

    opened by PeterDSteinberg 20
  • Add support for crs on holoviews datashader operations

    Add support for crs on holoviews datashader operations

    Datashader is very useful when working with geospatial data and holoviews now offers datashader operations. One major issue is that these operations do not currently handle a crs, which makes it difficult to work with them. The main obstacle here is that a) there is no geoviews RGB type, which could be used to hold the output of datashade and b) that projecting on every datashader plot update is very inefficient. I'd therefore suggest a temporary approach to make this work is to offer an operation that projects any Element type to a new crs and secondly to add a crs-aware RGB type to geoviews.

    type: enhancement 
    opened by philippjfr 20
  • Bugs/issues when creating choropleth map from shapefile

    Bugs/issues when creating choropleth map from shapefile

    I have some bugs/issues when creating maps from shapefile. Here I use the UK referendum as an example to reproduce these issues.

    (1) If there are missing values, the corresponding spatial unit on the map will not be displayed. it would be better to have an option to automatically fill the missing value to display all the spatial unit even though they don't . case2

    (2)If the data type is integer. The map will not show color correctly. case1

    (3) When the data value contains nan, the map looks good. But when these nan values are filled by 0. the resulting map is totally incorrect. (Here I manually assign three nan and fill them by zero) case3

    (4) Latitude and longitude on the map also seem to be problematic.
    case3

    (5) Better to have way to set color range for these maps. I am affected mostly by the third issue, because in my study I have to fill some values, otherwise it will become the first issue.

    Hope these issues can be fixed or improved.

    Code to reproduce these issues is attached. I don't know how to upload jupyter notebook.

    import pandas as pd
    import numpy as np
    import holoviews as hv
    import geoviews as gv
    import cartopy
    from cartopy import crs as ccrs
    %pylab
    
    hv.notebook_extension('bokeh','matplotlib')
    
    shapefile = 'boundaries/boundaries.shp'
    shapes = cartopy.io.shapereader.Reader(shapefile)
    
    referendum = pd.read_csv('referendum.csv')
    referendum['value1'] = referendum['leaveVoteshare']
    
    %%output backend='bokeh'
    %%opts Shape (cmap='viridis') [xaxis=None yaxis=None tools=['hover'] width=400 height=500]
    
    # Case 1: set referendum value is interger
    referendum_modified = referendum.copy()
    referendum_modified['value1'] = referendum_modified['value1'].apply(np.int)
    
    data = hv.Dataset(referendum_modified)
    
    gv.Shape.from_records(shapes.records(), data, on='code', value='value1',
                         index=['name', 'regionName'], crs=ccrs.PlateCarree())
    
    %%output backend='bokeh'
    %%opts Shape (cmap='viridis') [xaxis=None yaxis=None tools=['hover'] width=400 height=500]
    
    # Case 2: If referendem values are missing for some counties
    referendum_modified = referendum.copy()
    
    referendum_modified = referendum_modified.iloc[0:100,:]
    
    data = hv.Dataset(referendum_modified)
    
    gv.Shape.from_records(shapes.records(), data, on='code', value='value1',
                         index=['name', 'regionName'], crs=ccrs.PlateCarree())
    
    %%output backend='bokeh'
    %%opts Shape (cmap='viridis') [xaxis=None yaxis=None tools=['hover'] width=400 height=500]
    
    # Case 3: Here set the fist three rows to nan and fill them with 0   
    referendum_modified = referendum.copy()
    referendum_modified['value1'][0:3]=np.nan
    referendum_modified['value1'] = referendum_modified['value1'].fillna(0)
    
    data = hv.Dataset(referendum_modified)
    
        
    gv.Shape.from_records(shapes.records(), data, on='code', value='value1',
                         index=['name', 'regionName'], crs=ccrs.PlateCarree())
    
    opened by pkmn99 19
  • Speeding up projected maps in geoviews?

    Speeding up projected maps in geoviews?

    I'm visualizing public Landsat data with hvplot.xarray but I think this is likely a geoviews issue.

    It takes about 3 seconds to render an image when not using the crs: 2018-09-19_17-11-28

    It takes about 3 minutes to render an image when using the crs: 2018-09-19_17-12-26

    Without crs it's using my dask cluster, but with crs it does not use the cluster.

    This is the code I'm using:

    import rasterio 
    import xarray as xr
    import hvplot.xarray
    from dask.distributed import Client, progress
    import cartopy.crs as ccrs
    
    client = Client()
    
    image_url = 'https://storage.googleapis.com/gcp-public-data-landsat/LC08/01/047/027/LC08_L1TP_047027_20130421_20170310_01_T1/LC08_L1TP_047027_20130421_20170310_01_T1_B4.TIF'
    
    da = xr.open_rasterio(image_url, chunks={'band': 1, 'x': 2048, 'y': 2048})
    
    band1 = da.sel(band=1).persist()
    
    display(band1.hvplot(rasterize=True, width=600, height=400, cmap='viridis'))
    
    crs = ccrs.UTM(zone='10n')
    display(band1.hvplot(crs=crs, rasterize=True, width=600, height=400, cmap='viridis'))
    

    Here is the notebook.

    Is this expected?

    Is there anything I can do to speed up visualization with crs specified?

    opened by rsignell-usgs 18
  • Added GeoPandas data interface

    Added GeoPandas data interface

    Adds a GeoPandas interface allowing Path and Polygon types to wrap around geopandas dataframes directly. Here is a basic example:

    https://anaconda.org/philippjfr/geopandas/notebook

    Requires holoviews master and will likely be released at the same time as HoloViews 1.9.

    type: enhancement 
    opened by philippjfr 17
  • Installation problems

    Installation problems

    I'm trying to install geoviews on a linux machine. I created a new conda environment to try it out and ran the following commands successfully:

    conda create --name geoviews jupyter
    conda install -c scitools/label/dev -c conda-forge iris cartopy
    conda install xarray
    conda install -c ioam holoviews
    

    However when trying to install geoviews I found a problem:

    conda install -c ioam geoviews
    Fetching package metadata: ......
    Solving package specifications: ....................................................
    Error: Could not find some dependencies for geoviews: cartopy
    

    I can confirm that cartopy is installed:

    conda list
    ...
    cartopy                   0.14.2              np111py27_1    conda-forge
    ...
    

    so I'm not sure what the problem is?

    opened by DamienIrving 16
  • Confusion with geopandas dataframe as Polygons input

    Confusion with geopandas dataframe as Polygons input

    I have a GDF that I've created by overlaying a few other GDF's (state district data for various offices). I want to plot that on top of tile data.

    Plotting the GDF with matplotlib via geopandas seems to work OK:

    travis

    but creating a Polygons object seems to go wrong:

    screen shot 2018-08-12 at 12 54 45

    My ultimate goal is a colorized map with a hover tool: each district's color represents a unique combination of districts that cover that area, and the hover tool will tell you which districts cover a given area. In Travis County, there are 58 such combinations, so a legend is not really feasible. Color-coding would still be nice, though, to make the separations more clear.

    I'm happy to supply the GDF - please suggest the best way to do so.

    opened by msarahan 15
  • WIP: website

    WIP: website

    https://ioam.github.io/geoviews/ is built on pushing to this PR.

    To do:

    • [x] Fill in placeholder content, making coherent
    • [x] ensure haven't removed anything from existing site

    Before merging:

    • [x] squash
    • [x] update travis file to e.g. build site on tag only
    opened by ceball 15
  • Trouble creating conda envs with geoviews=1.8.1

    Trouble creating conda envs with geoviews=1.8.1

    Since the recent upgrade to Holoviews=1.13.1, Geoviews=1.8..1 and Bokeh=2.0.0, I have frequent trouble to create and pinning envs with these packages.

    The following somehow works:

    conda install -c pyviz -c conda-forge geopandas fiona jupyterlab geoviews holoviews nbconvert descartes numpy mapclassify bokeh jupyter_contrib_nbextensions
    

    but it will install Geoviews 1.6.6 and pyproj=2.6.0.

    This also doesn't work:

    conda install -c pyviz -c conda-forge geopandas fiona jupyterlab "geoviews=1.8.1" holoviews nbconvert descartes numpy mapclassify bokeh jupyter_contrib_nbextensions
    

    It will install pyproj=1.9.6, it also falls back to flexible solve and takes really long.

    I was wondering if there's an explanation for this behavior? How can I pin geoviews to 1.8.1 from the pyviz channel?

    When using -c pyviz/label/dev, conda also falls back to flexible solve. The results seem to change pretty much every day.

    I've tried with fewer packages, but still - solving the environment takes very long and it almost always falls back to flexible solve (my env is set to strict).

    Here's the complete order of steps to reproduce:

    conda create -n geoviews_env python=3.7 -c pyviz -c conda-forge
    conda activate geoviews_env 
    conda config --env --set channel_priority strict
    conda config --show channel_priority # verify
    conda install -c pyviz -c conda-forge geopandas fiona jupyterlab geoviews holoviews nbconvert descartes numpy mapclassify bokeh jupyter_contrib_nbextensions
    

    The documentation is very short when it comes to installation instructions, but I often encounter problems like these. Ideally, I want to provide a guide to the readers of my notebooks so that they can re-create an env that will be guaranteed compatible to the code in the Notebook.

    • running conda 4.8.3 in Linux (WSL)
    opened by Sieboldianus 14
  • Projection sometimes required in .opts

    Projection sometimes required in .opts

    I have a local jupyter lab instance where this code works just fine:

    import geoviews as gv
    import cartopy.crs as ccrs
    gv.extension('bokeh')
    
    poly = [
        (-95.777304976205, 29.70081935868131),
        (-95.777131944776, 29.70009523405696),
        (-95.780067725666, 29.69971579007273),
        (-95.780184253531, 29.70061729352786),
        (-95.778716019600, 29.70071746836681),
        (-95.777304976205, 29.70081935868131)
    ]
    gv.Polygons([poly], crs=ccrs.PlateCarree())
    

    Then I have a JupyterHub instance with the same holoviz packages, but the above code produces a warning about the projection being wrong and results in an empty plot. While projecting a Polygons element from a PlateCarree coordinate reference system (crs) to a Mercator projection none of the projected paths were contained within the bounds specified by the projection.

    If I add the projection to .opts, e.g.:
    gv.Polygons([poly], crs=ccrs.PlateCarree()).opts(projection=ccrs.PlateCarree())
    it will work properly on JHub. Any idea why the extra projection specification is required for my JHub instance?

    geoviews=1.6.4 from conda-forge

    type: bug 
    opened by kcpevey 14
  • Support numpy 1.24

    Support numpy 1.24

    With the release of numpy 1.24, the warning for inhomogeneous shape is now a ValueError.

    For Geoviews to work with the new numpy version, https://github.com/holoviz/holoviews/pull/5581 is also needed.

    np_123

    np_124

    TODO

    • [x] Need to check if examples can run
    opened by Hoxbro 0
  • Update CI test to use holoviz_tasks/install

    Update CI test to use holoviz_tasks/install

    This PR does two thing

    1. Switch to holoviz_tasks/install.
    2. Remove doit_test_flakes as the pre-commit already does this

    I have pinned numpy because version 1.24 now raises an error when an inhomogeneous shape is passed to np.array/np.asarray

    np_123

    np_124

    opened by Hoxbro 0
  • gv.feature.states - TypeError: 'MultiPolygon' object is not iterable

    gv.feature.states - TypeError: 'MultiPolygon' object is not iterable

    Software version info:

    geoviews=1.9.5
    holoviews=1.15.3
    bokeh=2.4.3
    python=3.8.15
    jupyterlab=3.5.2
    shapely=2.0.0
    

    I can plot every other feature geometry just fine in my notebook but just gf.states as a singular command in its own cell throws an error from trying to iterate through a MultiPolygon:

    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/IPython/core/formatters.py:972, in MimeBundleFormatter.__call__(self, obj, include, exclude)
        969     method = get_real_method(obj, self.print_method)
        971     if method is not None:
    --> 972         return method(include=include, exclude=exclude)
        973     return None
        974 else:
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/core/dimension.py:1293, in Dimensioned._repr_mimebundle_(self, include, exclude)
       1286 def _repr_mimebundle_(self, include=None, exclude=None):
       1287     """
       1288     Resolves the class hierarchy for the class rendering the
       1289     object using any display hooks registered on Store.display
       1290     hooks.  The output of all registered display_hooks is then
       1291     combined and returned.
       1292     """
    -> 1293     return Store.render(self)
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/core/options.py:1426, in Store.render(cls, obj)
       1424 data, metadata = {}, {}
       1425 for hook in hooks:
    -> 1426     ret = hook(obj)
       1427     if ret is None:
       1428         continue
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/ipython/display_hooks.py:277, in pprint_display(obj)
        275 if not ip.display_formatter.formatters['text/plain'].pprint:
        276     return None
    --> 277 return display(obj, raw_output=True)
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/ipython/display_hooks.py:247, in display(obj, raw_output, **kwargs)
        245 elif isinstance(obj, (CompositeOverlay, ViewableElement)):
        246     with option_state(obj):
    --> 247         output = element_display(obj)
        248 elif isinstance(obj, (Layout, NdLayout, AdjointLayout)):
        249     with option_state(obj):
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/ipython/display_hooks.py:141, in display_hook.<locals>.wrapped(element)
        139 try:
        140     max_frames = OutputSettings.options['max_frames']
    --> 141     mimebundle = fn(element, max_frames=max_frames)
        142     if mimebundle is None:
        143         return {}, {}
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/ipython/display_hooks.py:187, in element_display(element, max_frames)
        184 if type(element) not in Store.registry[backend]:
        185     return None
    --> 187 return render(element)
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/ipython/display_hooks.py:68, in render(obj, **kwargs)
         65 if renderer.fig == 'pdf':
         66     renderer = renderer.instance(fig='png')
    ---> 68 return renderer.components(obj, **kwargs)
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/plotting/renderer.py:398, in Renderer.components(self, obj, fmt, comm, **kwargs)
        395 embed = (not (dynamic or streams or self.widget_mode == 'live') or config.embed)
        397 if embed or config.comms == 'default':
    --> 398     return self._render_panel(plot, embed, comm)
        399 return self._render_ipywidget(plot)
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/plotting/renderer.py:405, in Renderer._render_panel(self, plot, embed, comm)
        403 doc = Document()
        404 with config.set(embed=embed):
    --> 405     model = plot.layout._render_model(doc, comm)
        406 if embed:
        407     return render_model(model, comm)
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/panel/viewable.py:508, in Renderable._render_model(self, doc, comm)
        506 if comm is None:
        507     comm = state._comm_manager.get_server_comm()
    --> 508 model = self.get_root(doc, comm)
        510 if config.embed:
        511     embed_state(self, model, doc,
        512                 json=config.embed_json,
        513                 json_prefix=config.embed_json_prefix,
        514                 save_path=config.embed_save_path,
        515                 load_path=config.embed_load_path,
        516                 progress=False)
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/panel/viewable.py:559, in Renderable.get_root(self, doc, comm, preprocess)
        542 """
        543 Returns the root model and applies pre-processing hooks
        544 
       (...)
        556 Returns the bokeh model corresponding to this panel object
        557 """
        558 doc = init_doc(doc)
    --> 559 root = self._get_model(doc, comm=comm)
        560 if preprocess:
        561     self._preprocess(root)
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/panel/layout/base.py:146, in Panel._get_model(self, doc, root, parent, comm)
        144 if root is None:
        145     root = model
    --> 146 objects = self._get_objects(model, [], doc, root, comm)
        147 props = dict(self._init_params(), objects=objects)
        148 model.update(**self._process_param_change(props))
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/panel/layout/base.py:131, in Panel._get_objects(self, model, old_objects, doc, root, comm)
        129 else:
        130     try:
    --> 131         child = pane._get_model(doc, root, model, comm)
        132     except RerenderError:
        133         return self._get_objects(model, current_objects[:i], doc, root, comm)
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/panel/pane/holoviews.py:265, in HoloViews._get_model(self, doc, root, parent, comm)
        263     plot = self.object
        264 else:
    --> 265     plot = self._render(doc, comm, root)
        267 plot.pane = self
        268 backend = plot.renderer.backend
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/panel/pane/holoviews.py:342, in HoloViews._render(self, doc, comm, root)
        339     if comm:
        340         kwargs['comm'] = comm
    --> 342 return renderer.get_plot(self.object, **kwargs)
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/plotting/bokeh/renderer.py:70, in BokehRenderer.get_plot(self_or_cls, obj, doc, renderer, **kwargs)
         63 @bothmethod
         64 def get_plot(self_or_cls, obj, doc=None, renderer=None, **kwargs):
         65     """
         66     Given a HoloViews Viewable return a corresponding plot instance.
         67     Allows supplying a document attach the plot to, useful when
         68     combining the bokeh model with another plot.
         69     """
    ---> 70     plot = super().get_plot(obj, doc, renderer, **kwargs)
         71     if plot.document is None:
         72         plot.document = Document() if self_or_cls.notebook_context else curdoc()
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/plotting/renderer.py:240, in Renderer.get_plot(self_or_cls, obj, doc, renderer, comm, **kwargs)
        237     defaults = [kd.default for kd in plot.dimensions]
        238     init_key = tuple(v if d is None else d for v, d in
        239                      zip(plot.keys[0], defaults))
    --> 240     plot.update(init_key)
        241 else:
        242     plot = obj
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/plotting/plot.py:948, in DimensionedPlot.update(self, key)
        946 def update(self, key):
        947     if len(self) == 1 and ((key == 0) or (key == self.keys[0])) and not self.drawn:
    --> 948         return self.initialize_plot()
        949     item = self.__getitem__(key)
        950     self.traverse(lambda x: setattr(x, '_updated', True))
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/geoviews/plotting/bokeh/plot.py:111, in GeoPlot.initialize_plot(self, ranges, plot, plots, source)
        109 def initialize_plot(self, ranges=None, plot=None, plots=None, source=None):
        110     opts = {} if isinstance(self, HvOverlayPlot) else {'source': source}
    --> 111     fig = super(GeoPlot, self).initialize_plot(ranges, plot, plots, **opts)
        112     if self.geographic and self.show_bounds and not self.overlaid:
        113         from . import GeoShapePlot
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/plotting/bokeh/element.py:1397, in ElementPlot.initialize_plot(self, ranges, plot, plots, source)
       1394     self.handles['y_range'] = plot.y_range
       1395 self.handles['plot'] = plot
    -> 1397 self._init_glyphs(plot, element, ranges, source)
       1398 if not self.overlaid:
       1399     self._update_plot(key, plot, style_element)
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/plotting/bokeh/element.py:1341, in ElementPlot._init_glyphs(self, plot, element, ranges, source)
       1339 else:
       1340     style = self.style[self.cyclic_index]
    -> 1341     data, mapping, style = self.get_data(element, ranges, style)
       1342     current_id = element._plot_id
       1344 with abbreviated_exception():
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/geoviews/plotting/bokeh/__init__.py:237, in FeaturePlot.get_data(self, element, ranges, style)
        235     el_type = Polygons
        236 polys = el_type(geoms, crs=element.crs, **util.get_param_values(element))
    --> 237 return super(FeaturePlot, self).get_data(polys, ranges, style)
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/geoviews/plotting/bokeh/plot.py:170, in GeoPlot.get_data(self, element, ranges, style)
        168 def get_data(self, element, ranges, style):
        169     if self._project_operation and self.geographic:
    --> 170         element = self._project_operation(element, projection=self.projection)
        171     return super(GeoPlot, self).get_data(element, ranges, style)
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/param/parameterized.py:3658, in ParameterizedFunction.__new__(class_, *args, **params)
       3656 inst = class_.instance()
       3657 inst.param._set_name(class_.__name__)
    -> 3658 return inst.__call__(*args,**params)
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/core/operation.py:220, in Operation.__call__(self, element, **kwargs)
        218 kwargs['link_dataset'] = self._propagate_dataset
        219 kwargs['link_inputs'] = self.p.link_inputs
    --> 220 return element.apply(self, **kwargs)
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/core/accessors.py:45, in AccessorPipelineMeta.pipelined.<locals>.pipelined_call(*args, **kwargs)
         42     inst._obj._in_method = True
         44 try:
    ---> 45     result = __call__(*args, **kwargs)
         47     if not in_method:
         48         init_op = factory.instance(
         49             output_type=type(inst),
         50             kwargs={'mode': getattr(inst, 'mode', None)},
         51         )
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/core/accessors.py:202, in Apply.__call__(self, apply_function, streams, link_inputs, link_dataset, dynamic, per_element, **kwargs)
        200 if hasattr(apply_function, 'dynamic'):
        201     inner_kwargs['dynamic'] = False
    --> 202 new_obj = apply_function(self._obj, **inner_kwargs)
        203 if (link_dataset and isinstance(self._obj, Dataset) and
        204     isinstance(new_obj, Dataset) and new_obj._dataset is None):
        205     new_obj._dataset = self._obj.dataset
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/core/operation.py:214, in Operation.__call__(self, element, **kwargs)
        210         return element.clone([(k, self._apply(el, key=k))
        211                               for k, el in element.items()])
        212     elif ((self._per_element and isinstance(element, Element)) or
        213           (not self._per_element and isinstance(element, ViewableElement))):
    --> 214         return self._apply(element)
        215 elif 'streams' not in kwargs:
        216     kwargs['streams'] = self.p.streams
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/core/operation.py:141, in Operation._apply(self, element, key)
        139     if not in_method:
        140         element._in_method = True
    --> 141 ret = self._process(element, key)
        142 if hasattr(element, '_in_method') and not in_method:
        143     element._in_method = in_method
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/geoviews/operation/projection.py:40, in _project_operation._process(self, element, key)
         39 def _process(self, element, key=None):
    ---> 40     return element.map(self._process_element, self.supported_types)
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/core/data/__init__.py:204, in PipelineMeta.pipelined.<locals>.pipelined_fn(*args, **kwargs)
        201     inst._in_method = True
        203 try:
    --> 204     result = method_fn(*args, **kwargs)
        205     if PipelineMeta.disable:
        206         return result
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/core/data/__init__.py:1216, in Dataset.map(self, *args, **kwargs)
       1214 @wraps(LabelledData.map)
       1215 def map(self, *args, **kwargs):
    -> 1216     return super(Dataset, self).map(*args, **kwargs)
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/holoviews/core/dimension.py:700, in LabelledData.map(self, map_fn, specs, clone)
        698     return deep_mapped
        699 else:
    --> 700     return map_fn(self) if applies else self
    
    File /storage/work/c/cnd5285/mambaforge/envs/uviz/lib/python3.8/site-packages/geoviews/operation/projection.py:79, in project_path._process_element(self, element)
         77     continue
         78 elif isinstance(geom, MultiPolygon):
    ---> 79     polys = [g for g in geom if g.area > 1e-15]
         80     if not polys:
         81         continue
    
    TypeError: 'MultiPolygon' object is not iterable
    
    opened by cdeciampa 2
  • shapely 2 support

    shapely 2 support

    Fixes #592

    References:

    • https://shapely.readthedocs.io/en/latest/release/2.x.html
    • https://shapely.readthedocs.io/en/latest/migration_pygeos.html
    • https://github.com/SciTools/iris/issues/3528
    • https://github.com/pangeo-data/xESMF/pull/214
    opened by Hoxbro 1
  • Issue with resample_geometry + regridded Image/RGB with non-lat/lon bounds

    Issue with resample_geometry + regridded Image/RGB with non-lat/lon bounds

    ALL software version info

    GeoViews 1.9.5, HoloViews 1.15.1 on Linux

    The code provided below is executed in a notebook (jupyter_client 7.0.6, jupyter_core 4.8.1, jupyter_server 1.11.1, notebook 6.4.4) but I'm getting the same bug in a server (Panel 0.14.0).

    This is not a regression as I've experienced this issue for more than a year with various versions.

    Description of expected behavior and the observed behavior

    When working in geostationary projection (or orthographic and presumably others) with Image or RGB elements, it is preferable to provide bounds calculated in the projection coordinates instead of lat/lon. This is because the corners of the element may not fit within the globe and therefore may not correspond to a valid (lat, lon) pair:

    drawing

    When the image is large, regridding using hd.regrid allows to drastically reduce rendering time. Likewise, using resample_geometry on Feature objects (coastline typically) also helps.

    However you can't use both at the same time. If you do, the plot does render, but the moment you pan or zoom, one of the element disappears (geometry or image, depending on their order in the overlay). The same thing happens if you use hv.Image/hv.RGB instead of their gv counterparts, which I do (it's a bit faster).

    So in this case you have to choose between image regridding and feature resampling. Apparently the bug does not occur if you provide bounds in lat/lon.

    Complete, minimal, self-contained example code that reproduces the issue

    import numpy as np
    import geoviews as gv
    import holoviews.operation.datashader as hd
    import cartopy.crs as ccrs
    
    gv.extension('bokeh')
    
    coastline = gv.feature.coastline.geoms('10m').opts(color='black')
    resampled_coastline = gv.operation.resample_geometry(coastline)
    
    projection = ccrs.Orthographic()
    opts = dict(projection=projection, width=400, height=400)
    
    ls = np.linspace(0, 10, 2000)
    xx, yy = np.meshgrid(ls, ls)
    
    # In separate cells:
    latlon_bounds = (-20, -10, 20, 10)
    latlon_img = gv.Image(np.sin(2*xx)*np.cos(yy), bounds=latlon_bounds)
    regrid_latlon_img = hd.regrid(latlon_img)
    (regrid_latlon_img*resampled_coastline).opts(**opts) # Works fine
    
    # and
    geo_bounds = (-2000000, -1000000, 2000000, 1000000)
    geo_img = gv.Image(np.sin(2*xx)*np.cos(yy), bounds=geo_bounds, crs=projection)
    # or geo_img = hv.Image(np.sin(2*xx)*np.cos(yy), bounds=geo_bounds)
    regrid_geo_img = hd.regrid(geo_img)
    (regrid_geo_img*resampled_coastline).opts(**opts) # Coastline will disappear as soon as you pan or zoom
    

    Stack traceback and/or browser JavaScript console output

    Nothing is logged in standard output or in the browser console

    Screenshots or screencasts of the bug in action

    https://user-images.githubusercontent.com/49269671/195110736-d1e23249-6e91-4859-8268-ecb1dead9bb1.mp4

    type: bug 
    opened by TheoMathurin 4
Releases(v1.9.5)
  • v1.9.5(Mar 8, 2022)

  • v1.9.4(Feb 17, 2022)

    This is a micro release with a small number of bug fixes and compatibility fixes with HoloViews 1.14.8 and support for Python 3.10.

    Bug fixes:

    • Fix handling of 3-channel RGB element (#558)
    • Add support for pandas Float64Array (#559)

    Compatibility:

    • Compatibility with HoloViews 1.14.8 (#556)
    • Compatibility with Python 3.10 by replacing LooseVersion with packaging.Version (#555)
    Source code(tar.gz)
    Source code(zip)
  • v1.9.3(Dec 25, 2021)

    This release contains a few bug fixes and improvements, and adds compatibility with Shapely 1.8 and the upcoming version 2.0. Thanks to @philippjfr, @maximlt and @ahuang11 for contributing to this release.

    Bug fixes and minor improvements:

    • Add missing _process_msg method to GeoPolyEditCallback (https://github.com/holoviz/geoviews/pull/539)
    • Accept lowercase xmin/ymin/xmax/ymax in WMTS URL templates (https://github.com/holoviz/geoviews/pull/542)
    • Support GeoDataframe with a geometry column not named geometry (https://github.com/holoviz/geoviews/pull/545)
    • Add opentopomap as a tile source (https://github.com/holoviz/geoviews/pull/514)

    Compatibility:

    • Adapt to shapely 1.8.0 and 2.0 (https://github.com/holoviz/geoviews/pull/543)

    Docs improvements:

    • Update the CSS of links (https://github.com/holoviz/geoviews/pull/544)
    Source code(tar.gz)
    Source code(zip)
  • v1.9.2(Sep 30, 2021)

    Minor release by Philipp Rudiger for Bokeh 2.4 compatibility:

    • Rebuild extensions for Bokeh >=2.4 (#525)
    • Require cartopy>=0.18 to match conda-forge recipe
    • Fix compatibility with upcoming HoloViews 2.0
    • Switch website to pydata_sphinx_theme (#528)
    Source code(tar.gz)
    Source code(zip)
  • v1.9.1(Mar 13, 2021)

  • v1.9.0(Mar 13, 2021)

    This GeoViews release primarily provides compatibility with the latest releases of Cartopy (0.18), Bokeh (2.3), HoloViews (1.14.x) and fixes a number of other issues.

    Features:

    • Add utility to download tile RGB (#458)

    Compatibility:

    • Compatibility with Bokeh 2.3 (#487)
    • Compatibility for regridding with latest xesmf (#488)
    • Compatibility with HoloViews 1.14.x for resampling operation and stream callback (#488)
    • Compatibility with latest Cartopy 0.18 (#488)

    Bug fixes:

    • Allow using geopandas interface without using geometry column (#464)
    • Fix Hover tooltip projection (#490)
    • Use the set geometry column on Geopandas DataFrames (#489)
    • Fix xesmf regridding file_pattern parameter (#491)
    Source code(tar.gz)
    Source code(zip)
  • v1.8.2(Sep 23, 2020)

    Minor bugfix release. Includes contributions from: @philippjfr

    Bug fixes and minor improvements:

    • Bump geoviews.js version and bokeh requirements (#473)
    • Handle proj4.js API change in Hover formatter (#472)
    Source code(tar.gz)
    Source code(zip)
  • v1.8.1(May 5, 2020)

    Minor bugfix release. Includes contributions from: @philippjfr, @jbednar, @kebowen730

    Bug fixes and minor improvements:

    • Docs updates (#457)
    • Misc iris fixes (#453)
    • Updated dependency requirements
    Source code(tar.gz)
    Source code(zip)
  • v1.8.0(Sep 23, 2020)

  • v1.7.0(Mar 26, 2020)

    This GeoViews release provides compatibility with HoloViews 1.13, including support for the major new features provided in that release. This is also the last release with support for Python 2. Many thanks for the many people who contributed by filing issues and our contributors including @ceball, @jsignell, @ahuang11, @jbednar, and @philippjfr.

    Features:

    • Added geographic projection awareness to hv.annotate function (#377, #419)
    • Rewrote geometry interfaces such as geopandas to conform to new HoloViews geometry protocol (#407)
    • Implement consistent .geom method on geometry types (e.g. Path, Polygons, Points) (#424)

    Bug fixes:

    • Allow updating user defined HoverTool instances (#440)
    • Fix for ticks fontsize in matplotlib backend (#402)
    • Fix for xaxis/yaxis='bare' option in matplotlib backend (#401)

    Compatibility:

    • Compatibility with HoloViews 1.13.0 (#429, #430)
    Source code(tar.gz)
    Source code(zip)
  • v1.6.6(Dec 19, 2019)

    This is a minor release with a small number of bug fixes. Thanks to @nickhand, @philippjfr and @jsignell for contributing to this release.

    • Ensure that projecting QuadMesh does not drop options (#367)
    • Fix handling of pyproj strings (#376)
    • Disable fixed_bounds to avoid bug when zooming in bokeh (#390)
    • Add support for geometry columns other than 'geometry' on geopandas DataFrames (#391)
    • Fixed handling of pyproj dependency (#392)
    Source code(tar.gz)
    Source code(zip)
  • v1.6.5(Nov 6, 2019)

    Minor bugfix release. Includes contributions from @philippjfr:

    Bug fixes and minor improvements:

    • Fixed issues with target extents in project_image (#365)
    Source code(tar.gz)
    Source code(zip)
  • v1.6.4(Nov 6, 2019)

    Minor bugfix release. Includes contributions from @philippjfr, @ahuang11, @zassa, and @ceball

    Bug fixes and minor improvements:

    • Ensure that gridline labels are only drawn once (#364)
    • Compatibility with latest HoloViews data interface (#363)
    • Add grid labels (#351)
    • Hardcode the OSM tile source to https (#333)
    • Fix hover formatting for Mercator coordinates (#358)
    Source code(tar.gz)
    Source code(zip)
  • v1.6.3(Oct 8, 2019)

    Minor release, mostly bugfixes. Includes contributions from @philippjfr, @ahuang11, and @rsignell-usgs.

    New features:

    • Add geo features for US states (#312)
    • Add ESRI Ocean tile layers (#320)

    Bug fixes and minor improvements:

    • Add dtype methods to geometry interfaces (#345)
    • Ensure that Line Shape is not filled in matplotlib (#326)
    • Avoid zooming in beyond tile/axis resolution (#325)
    • Fix gridlines for gv matplotlib overlay (#308)
    Source code(tar.gz)
    Source code(zip)
  • v1.6.2(Apr 9, 2019)

    Minor release, mostly bugfixes. Includes contributions from @philippjfr.

    New feature:

    • Add adaptive geometry resampling operation, allowing working with large shape files interactively, increasing their resolution when zooming in (#282)

    Bug fixes and minor improvements:

    • Fixed img project if src and target projection are equal (#288)
    • Added plotting backend load hooks (#286)
    • Do not import regrid operations by default
    • Fixed re-initialization of backend (#284)
    • Improved handling of non-default central longitudes (#281)
    • Small fix for Path longitude wrapping (#279)
    Source code(tar.gz)
    Source code(zip)
  • v1.6.1(Apr 9, 2019)

    Includes contributions from @ahuang11 (unlimit vdims) and @philippjfr.

    Bug fixes and minor improvements:

    • Unlimit the vdims for various elements (#253)
    • Improve handling of geopandas and empty geometries (#278)
    • Updated opts syntax in gallery examples (#277)
    • Fixed bugs projecting Graphs (#276)
    • Ensure backend is initialized on import (#275)
    • Added call method to tile sources, to restore constructor-like behavior from previous versions (#274)
    Source code(tar.gz)
    Source code(zip)
  • v1.6.0(Jan 14, 2019)

    This is a major release with a number of important enhancements and bug fixes:

    Features

    • Complete overhaul of geometry handling including support for geometry with holes and geometry dictionary interface (#244, #249)
    • Support for holoviews FreehandDraw stream (#219)
    • Add gv.load_tiff and gv.RGB.load_tiff helpers (#221, #233)
    • Added support for holoviews padding option (#228)

    Enhancements

    • Drop bokeh save tool when tile source is used (#257)
    • Compatibility with cartopy 0.17 (#254)

    Bug fixes

    • Improved handling of Point geometries in geopandas dataframe (#204)
    • Fixes for projecting draw tool data (#205)
    • Improvements and fixes for handling of QuadMesh projections (#250)
    • Fixes for Image longitude wrapping (#260)
    Source code(tar.gz)
    Source code(zip)
  • v1.5.1(Jun 6, 2018)

    This is a bug fix release which includes a number of important fixes and enhancements.

    Enhancements:

    • Geopandas interface now supports point geometries (#186)
    • Geopandas data now supported in the .to conversion API (#186)

    Fixes:

    • Fixed some issues to do with tile source attributions (#176)
    • Fixed bug projecting rectilinear QuadMesh (#178)
    • Improvements to path/polygon projection and clipping (#179)
    Source code(tar.gz)
    Source code(zip)
  • v1.5.0(May 15, 2018)

    Major feature:

    • The bokeh backend now supports arbitrary geographic projections, no longer just Web Mercator (#170)

    New components:

    • Added Graph element to plot networks of connected nodes (#115)

    • Added TriMesh element and datashading operation to plot small and large irregular triangular meshes (#115)

    • Added QuadMesh element and datashading operation to plot small and large, irregular rectilinear and curvilinear meshes (#116)

    • Added VectorField element and datashading operation to plot small and large quiver plots and other collections of vectors (#122)

    • Added HexTiles element to plot data binned into a hexagonal grid (#147)

    • Added Labels element to plot a large number of text labels at once (as data rather than as annotations) (#147)

    New features:

    • Hover tool now supports displaying geographic coordinates as longitude and latitude (#158)

    • Added a new geoviews.tile_sources module with a predefined set of tile sources (#165)

    • Wrapped the xESMF library as a regridding and interpolation operation for rectilinear and curvilinear grids (#127)

    • HoloViews operations including datashade and rasterize now retain geographic crs coordinate system (#118)

    Enhancements:

    • Overhauled documentation and added a gallery (#121)
    Source code(tar.gz)
    Source code(zip)
  • 1.4.3(Feb 12, 2018)

    Enhancements:

    • Ensured that HoloViews operations such as datashade, aggregate and regrid do not drop the coordinate reference system on the input element (https://github.com/ioam/geoviews/pull/118)
    • Unified WMTS support across backends, bokeh and matplotlib now support rendering {X}_{Y}_{Z} based web tiles (https://github.com/ioam/geoviews/pull/120)
    • Handle projecting of empty Elements (https://github.com/ioam/geoviews/pull/131)
    • Set Image element NaN coloring to transparent (https://github.com/ioam/geoviews/pull/136/commits/f1f29607079f1f86bce56187dd7a98ca2a1d9eff)
    • Overhauled website with new theme (https://github.com/ioam/geoviews/pull/106)
    Source code(tar.gz)
    Source code(zip)
  • 1.4.0(Nov 6, 2017)

    • Allow specifying WMTS element with just the URL (#89)
    • Added GeoPandas interface to plot geometries more easily (#88)
    • Added further projection operations allowing most geographic element types to be explicitly projected (#88)
    • Enabled MercatorTicker on geographic bokeh plots ensuring axes are labelled with latitudes and longitudes (#64)
    Source code(tar.gz)
    Source code(zip)
  • 1.3.2(Aug 22, 2017)

    This is a minor release reapplying a fix which was accidentally reverted in 1.3.1:

    • The WMTS Element now accepts a tile source URL directly for the bokeh backend (PR #83)
    Source code(tar.gz)
    Source code(zip)
  • 1.3.1(Aug 21, 2017)

  • 1.3.0(Jul 2, 2017)

    This release is mostly a compatibility release for HoloViews 1.8. It includes a small number of significant fixes and changes:

    • Introduces a general project operation to project most Element types from one crs to another ( https://github.com/ioam/geoviews/pull/69)
    • Added a gv.RGB Element type useful for representing datashader aggregates and particularly loading GeoTiffs with xarray (https://github.com/ioam/geoviews/pull/75)
    • All geoviews geographic Elements declare a crs, which defaults to PlateCarree() (https://github.com/ioam/geoviews/pull/76)
    • Fix for compatibility with HoloViews 1.8 (https://github.com/ioam/geoviews/pull/77)
    Source code(tar.gz)
    Source code(zip)
  • 1.2.0(Apr 26, 2017)

    This is a minor release mostly to maintain compatibility with the recently released HoloViews 1.7.0.

    Features:

    • Added project_shape operations (https://github.com/ioam/geoviews/commit/c6c5ce261aa725853e00094fbe59ff3650ad1e19)
    • The Shape.from_records function now supports drop_missing option. #63
    • Compatibility with HoloViews (PR #59, #60)
    • Bokeh box_zoom tool now matches aspect on geographic plots (https://github.com/ioam/geoviews/commit/c6c41a979dca928c83d74c3773df458840832907)

    Bug fixes:

    • Fix for Shape Element colormapping (PR #58)
    • Geographic objects did not inherit crs on clone (https://github.com/ioam/geoviews/commit/df0ba893e273e8a143d78419f6491c27ed814fe5)
    Source code(tar.gz)
    Source code(zip)
  • 1.1.0(Aug 26, 2016)

    Minor release to improve usability:

    • Improved layouts, reducing whitespace around non-square plots
    • Added geoviews.features module for simple access to cartopy Features.
    • Improved tutorials
    • Added gv.Dataset class to simplify keeping track of coordinate systems
    Source code(tar.gz)
    Source code(zip)
  • v1.0.0(Aug 26, 2016)

    First stable version, with support for matplotlib and bokeh (web Mercator projection only). Requires HoloViews 1.6+ to be able to use data from xarray or iris.

    Source code(tar.gz)
    Source code(zip)
Owner
HoloViz
High-level tools to simplify visualization in Python
HoloViz
How to use COG's (Cloud optimized GeoTIFFs) with Rasterio

How to use COG's (Cloud optimized GeoTIFFs) with Rasterio According to Cogeo.org: A Cloud Opdtimized GeoTIFF (COG) is a regular GeoTIFF file, aimed at

Marvin Gabler 8 Jul 29, 2022
Calculate & view the trajectory and live position of any earth-orbiting satellite

satellite-visualization A cross-platform application to calculate & view the trajectory and live position of any earth-orbiting satellite in 3D. This

Space Technology and Astronomy Cell - Open Source Society 3 Jan 08, 2022
Yet Another Time Series Model

Yet Another Timeseries Model (YATSM) master v0.6.x-maintenance Build Coverage Docs DOI | About Yet Another Timeseries Model (YATSM) is a Python packag

Chris Holden 60 Sep 13, 2022
Replace MSFS2020's bing map to google map

English verison here 中文 免责声明 本教程提到的方法仅用于研究和学习用途。我不对使用、拓展该教程及方法所造成的任何法律责任和损失负责。 背景 微软模拟飞行2020的地景使用了Bing的卫星地图,然而卫星地图比较老旧,很多地区都是几年前的图设置直接是没有的。这种现象在全球不同地区

hesicong 272 Dec 24, 2022
A Jupyter - Leaflet.js bridge

ipyleaflet A Jupyter / Leaflet bridge enabling interactive maps in the Jupyter notebook. Usage Selecting a basemap for a leaflet map: Loading a geojso

Jupyter Widgets 1.3k Dec 27, 2022
A simple python script that, given a location and a date, uses the Nasa Earth API to show a photo taken by the Landsat 8 satellite. The script must be executed on the command-line.

What does it do? Given a location and a date, it uses the Nasa Earth API to show a photo taken by the Landsat 8 satellite. The script must be executed

Caio 42 Nov 26, 2022
User friendly Rasterio plugin to read raster datasets.

rio-tiler User friendly Rasterio plugin to read raster datasets. Documentation: https://cogeotiff.github.io/rio-tiler/ Source Code: https://github.com

372 Dec 23, 2022
Automated download of LANDSAT data from USGS website

LANDSAT-Download It seems USGS has changed the structure of its data, and so far, I have not been able to find the direct links to the products? Help

Olivier Hagolle 197 Dec 30, 2022
Read and write rasters in parallel using Rasterio and Dask

dask-rasterio dask-rasterio provides some methods for reading and writing rasters in parallel using Rasterio and Dask arrays. Usage Read a multiband r

Dymaxion Labs 85 Aug 30, 2022
Mmdb-server - An open source fast API server to lookup IP addresses for their geographic location

mmdb-server mmdb-server is an open source fast API server to lookup IP addresses

Alexandre Dulaunoy 67 Nov 25, 2022
A bot that tweets info and location map for new bicycle parking added to OpenStreetMap within a GeoJSON boundary.

Bike parking tweepy bot app A twitter bot app that searches for bicycle parking added to OpenStreetMap. Relies on AWS Lambda/S3, Python3, Tweepy, Flas

Angelo Trivisonno 1 Dec 19, 2021
Using SQLAlchemy with spatial databases

GeoAlchemy GIS Support for SQLAlchemy. Introduction GeoAlchemy is an extension of SQLAlchemy. It provides support for Geospatial data types at the ORM

109 Dec 01, 2022
Blender addons to make the bridge between Blender and geographic data

Blender GIS Blender minimal version : 2.8 Mac users warning : currently the addon does not work on Mac with Blender 2.80 to 2.82. Please do not report

5.9k Jan 02, 2023
Search and download Copernicus Sentinel satellite images

sentinelsat Sentinelsat makes searching, downloading and retrieving the metadata of Sentinel satellite images from the Copernicus Open Access Hub easy

837 Dec 28, 2022
Global topography (referenced to sea-level) in a 10 arcminute resolution grid

Earth - Topography grid at 10 arc-minute resolution Global 10 arc-minute resolution grids of topography (ETOPO1 ice-surface) referenced to mean sea-le

Fatiando a Terra Datasets 1 Jan 20, 2022
Track International space station with python

NASA-ISS-tracker Track International space station with python Modules import json import turtle import urllib.request import time import webbrowser i

Nikhil Yadav 8 Aug 12, 2021
WIP: extracting Geometry utilities from datacube-core

odc.geo This is still work in progress. This repository contains geometry related code extracted from Open Datacube. For details and motivation see OD

Open Data Cube 34 Jan 09, 2023
ProjPicker (projection picker) is a Python module that allows the user to select all coordinate reference systems (CRSs)

ProjPicker ProjPicker (projection picker) is a Python module that allows the user to select all coordinate reference systems (CRSs) whose extent compl

Huidae Cho 4 Feb 06, 2022
Geospatial web application developed uisng earthengine, geemap, and streamlit.

geospatial-streamlit Geospatial web applications developed uisng earthengine, geemap, and streamlit. App 1 - Land Surface Temperature A simple, code-f

13 Nov 27, 2022
Django model field that can hold a geoposition, and corresponding widget

django-geoposition A model field that can hold a geoposition (latitude/longitude), and corresponding admin/form widget. Prerequisites Starting with ve

Philipp Bosch 324 Oct 17, 2022