GISDocument#

The GISDocument class is the main entry point for map creation and editing.

Create a new ephemeral document with map view options#

If you don’t pass a filename as the first positional argument, the document will not be saved to disk.

from jupytergis import GISDocument

doc = GISDocument(
    latitude=47.0,
    longitude=2.0,
    zoom=5,
    projection="EPSG:3857",
)

doc

Open an existing document#

It is possible to open an existing document and start editing it from the Python notebook.

The Python runtime then acts as a collaborator on the document (in the live collaboration sense), so other people can see the modifications being made to the document.

from jupytergis import GISDocument

doc = GISDocument("mydocument.jGIS")

doc

If this document doesn’t exist, it will be created on disk.

Add base layers and vector/raster data#

from jupytergis import GISDocument, constant

doc = GISDocument()

doc.add_raster_layer(
    url="https://tile.openstreetmap.org/{z}/{x}/{y}.png"
)
doc.add_geojson_layer(
    name="Ship Trajectories",
    path="https://openlayers.org/en/latest/examples/data/geojson/ship-trajectories.json",
    symbology=[constant("red").encoding("stroke")]
)
doc.add_geotiff_layer(
    name="Sentinel-2 cloudless",
    url="https://s2downloads.eox.at/demo/EOxCloudless/2020/rgbnir/s2cloudless2020-16bits_sinlge-file_z0-4.tif",
    min=2000,
    max=25000,
)

doc

Add GeoJSON from in-memory data#

from jupytergis import GISDocument, constant

latitude = 48.853757
longitude = 2.358213

doc = GISDocument(zoom=12, latitude=latitude, longitude=longitude)

geojson = {
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "geometry": {"type": "Point", "coordinates": [longitude, latitude]},
            "properties": {"name": "Paris", "mag": 4.2},
        },
    ],
}

doc.add_geojson_layer(
    name="Paris",
    data=geojson,
    symbology=[
        constant("blue").encoding("stroke"),
        constant("red").encoding("fill"),
        constant(3).encoding("circle-stroke-width"),
        constant(20).encoding("radius"),
    ]
)

doc

Image and Video overlays#

from jupytergis import GISDocument

doc = GISDocument(zoom=5, latitude=46.431742, longitude=1.792230)

doc.add_image_layer(
    name="GeoJupyter logo",
    url="https://geojupyter.org/assets/images/logo.png",
    coordinates=[
        [-5.0, 51.0],
        [8.0, 51.0],
        [8.0, 42.0],
        [-5.0, 42.0],
    ],
)

doc

Vector tiles#

from jupytergis import GISDocument, constant

doc = GISDocument(zoom=8, latitude=41.928500, longitude=-87.828527)

doc.add_vectortile_layer(
    name="Buildings",
    url="https://planetarycomputer.microsoft.com/api/data/v1/vector/collections/ms-buildings/tilesets/global-footprints/tiles/{z}/{x}/{y}",
    symbology=[constant("lightblue").encoding("stroke")]
)

doc

WMS#

from jupytergis import GISDocument

doc = GISDocument(zoom=8, latitude=41.928500, longitude=-87.828527)

# Utility function to find available layers
layers = doc.get_wms_available_layers("https://ows.terrestris.de/osm/service")

doc.add_wms_tile_layer(
    url="https://ows.terrestris.de/osm/service",
    layer_name=layers[0]["name"],
    name="WMS layer"
)

doc

OpenEO tile layers#

JupyterGIS supports OpenEO tile layers as long as you can connect to a local or remote tile server that supports OpenEO.

Follow this guide to spawn a OpenEO tile server locally on your machine: https://sentinel-hub.github.io/titiler-openeo/local-setup/#environment-setup

# graph is an OpenEO DataCube graph (see the `openeo` Python library)
doc.add_openeo_tile_layer(
    graph,
    name="OpenEO tiles",
    opacity=0.9,
)

GeoParquet#

from jupytergis import GISDocument, constant

doc = GISDocument(zoom=2, latitude=58.118086, longitude=-98.799263)

doc.add_geoparquet_layer(
    path="https://raw.githubusercontent.com/opengeospatial/geoparquet/main/examples/example.parquet",
    name="Parquet example",
    symbology=[
        constant("blue").encoding("stroke"),
        constant("lightblue").encoding("fill"),
    ]
)

doc

GeoPackage#

from jupytergis import GISDocument, constant

doc = GISDocument(zoom=4, latitude=45.895322, longitude=2.267552)

doc.add_geopackage_vector_layer(
    path="https://raw.githubusercontent.com/richard-thomas/ol-load-geopackage/master/examples/dist/Natural_Earth_QGIS_layers_and_styles.gpkg",
    name="Geopackage example",
    table_names=["Countries", "Rivers + Lake Centrelines"],
    symbology=[
        constant("blue").encoding("stroke"),
        constant("green").encoding("fill"),
    ]
)

doc

Remove layers and inspect document content#

layer_id = doc.add_raster_layer(url="https://tile.openstreetmap.org/{z}/{x}/{y}.png")

doc.remove_layer(layer_id)

You can also inspect convenience properties:

print(doc.layers)      # dict keyed by layer id
print(doc.layer_tree)  # ordered layer ids / groups

Open in a sidecar#

This opens the map next to the notebook in a new JupyterLab tab

doc.sidecar(title="Map", anchor="split-right")