Skip to main content

A Python package for creating interactive maps with anywidget and TypeScript

Project description

anymap-ts

A Python package for creating interactive maps with anywidget using TypeScript. Supports multiple mapping libraries including MapLibre GL JS, Mapbox GL JS, Leaflet, OpenLayers, DeckGL, Cesium, KeplerGL, and Potree.

image notebook-link image image image Conda Downloads Conda Recipe npm version image

Supported Libraries

Library Description Use Case
MapLibre GL JS Open-source vector maps Default, general-purpose mapping
Mapbox GL JS Commercial vector maps Advanced styling, 3D terrain
Leaflet Lightweight, mobile-friendly Simple maps, broad compatibility
OpenLayers Feature-rich, enterprise WMS/WMTS, projections
DeckGL GPU-accelerated Large-scale data visualization
Cesium 3D globe 3D Tiles, terrain, global views
KeplerGL Data exploration Interactive data analysis
Potree Point clouds LiDAR visualization

Features

  • Interactive maps in Jupyter notebooks
  • Bidirectional Python-JavaScript communication via anywidget
  • Drawing and geometry editing with maplibre-gl-geo-editor
  • Layer control with maplibre-gl-layer-control
  • Multiple basemap providers via xyzservices
  • Export to standalone HTML
  • TypeScript-based frontend for type safety and maintainability

Installation

From PyPI (when published)

pip install anymap-ts

From conda-forge

conda install -c conda-forge anymap-ts

From source (development)

git clone https://github.com/opengeos/anymap-ts.git
cd anymap-ts
pip install -e ".[dev]"

Optional dependencies

# For vector data support (GeoDataFrame)
pip install anymap-ts[vector]

# For local raster support (localtileserver)
pip install anymap-ts[raster]

# All optional dependencies
pip install anymap-ts[all]

Quick Start

MapLibre GL JS (Default)

from anymap_ts import Map

# Create a map centered on a location
m = Map(center=[-122.4, 37.8], zoom=10)
m.add_basemap("OpenStreetMap")
m.add_draw_control()
m

Mapbox GL JS

import os
from anymap_ts import MapboxMap

# Set your Mapbox token (or use MAPBOX_TOKEN env var)
m = MapboxMap(center=[-122.4, 37.8], zoom=10)
m.add_basemap("OpenStreetMap")
m

Leaflet

from anymap_ts import LeafletMap

m = LeafletMap(center=[-122.4, 37.8], zoom=10)
m.add_basemap("OpenStreetMap")
m.add_marker(-122.4194, 37.7749, popup="San Francisco")
m

OpenLayers

from anymap_ts import OpenLayersMap

m = OpenLayersMap(center=[-122.4, 37.8], zoom=10)
m.add_basemap("OpenStreetMap")

# Add WMS layer
m.add_wms_layer(
    url="https://example.com/wms",
    layers="layer_name",
    name="WMS Layer"
)
m

DeckGL

from anymap_ts import DeckGLMap

m = DeckGLMap(center=[-122.4, 37.8], zoom=10)
m.add_basemap("CartoDB.DarkMatter")

# Add scatterplot layer
points = [{"coordinates": [-122.4, 37.8], "value": 100}]
m.add_scatterplot_layer(data=points, get_radius=100)

# Add hexagon aggregation
m.add_hexagon_layer(data=points, radius=500, extruded=True)
m

Cesium (3D Globe)

from anymap_ts import CesiumMap

# Set CESIUM_TOKEN env var for terrain/3D Tiles
m = CesiumMap(center=[-122.4, 37.8], zoom=10)
m.add_basemap("OpenStreetMap")
m.set_terrain()  # Enable Cesium World Terrain
m.fly_to(-122.4194, 37.7749, height=50000, heading=45, pitch=-45)
m

KeplerGL

from anymap_ts import KeplerGLMap
import pandas as pd

m = KeplerGLMap(center=[-122.4, 37.8], zoom=10)

# Add DataFrame data
df = pd.DataFrame({
    'latitude': [37.7749, 37.8044],
    'longitude': [-122.4194, -122.2712],
    'value': [100, 200]
})
m.add_data(df, name='points')
m

Potree (Point Clouds)

from anymap_ts import PotreeViewer

viewer = PotreeViewer(
    point_budget=1000000,
    edl_enabled=True
)
viewer.load_point_cloud("path/to/pointcloud/cloud.js", name="lidar")
viewer

Common Features

Add Vector Data

geojson = {
    "type": "FeatureCollection",
    "features": [
        {
            "type": "Feature",
            "geometry": {"type": "Point", "coordinates": [-122.4, 37.8]},
            "properties": {"name": "San Francisco"}
        }
    ]
}

# Works with MapLibre, Mapbox, Leaflet, OpenLayers
m.add_vector(geojson, name="points")

# Or with GeoDataFrame (requires geopandas)
import geopandas as gpd
gdf = gpd.read_file("path/to/data.geojson")
m.add_vector(gdf, name="polygons")

Map Navigation

# Fly to location with animation
m.fly_to(-122.4, 37.8, zoom=14)

# Fit to bounds [west, south, east, north]
m.fit_bounds([-123, 37, -122, 38])

Export to HTML

# All map types support HTML export
m.to_html("map.html", title="My Map")

Environment Variables

Variable Library Description
MAPBOX_TOKEN Mapbox, KeplerGL Mapbox access token
CESIUM_TOKEN Cesium Cesium Ion access token

API Reference

Map Classes

Class Base Library Key Features
Map / MapLibreMap MapLibre GL JS Vector tiles, drawing, layer control
MapboxMap Mapbox GL JS 3D terrain, Mapbox styles
LeafletMap Leaflet Lightweight, plugins
OpenLayersMap OpenLayers WMS/WMTS, projections
DeckGLMap DeckGL + MapLibre GPU layers, aggregations
CesiumMap Cesium 3D globe, terrain, 3D Tiles
KeplerGLMap KeplerGL Data exploration UI
PotreeViewer Potree Point cloud visualization

Common Methods

Method Description
add_basemap(name) Add a basemap layer
add_vector(data, name) Add vector data (GeoJSON/GeoDataFrame)
add_geojson(data, name) Add GeoJSON data
add_tile_layer(url, name) Add XYZ tile layer
fly_to(lng, lat, zoom) Fly to location
fit_bounds(bounds) Fit map to bounds
set_visibility(layer, visible) Set layer visibility
set_opacity(layer, opacity) Set layer opacity
to_html(filepath) Export to HTML

DeckGL-Specific Layers

Method Description
add_scatterplot_layer() Point visualization
add_arc_layer() Origin-destination arcs
add_path_layer() Polylines
add_polygon_layer() Polygons
add_hexagon_layer() Hexbin aggregation
add_heatmap_layer() Density heatmap
add_grid_layer() Grid aggregation
add_geojson_layer() GeoJSON rendering

Cesium-Specific Methods

Method Description
set_terrain() Enable terrain
add_3d_tileset(url) Add 3D Tiles
add_imagery_layer(url) Add imagery
set_camera(lng, lat, height) Set camera position

Potree-Specific Methods

Method Description
load_point_cloud(url) Load point cloud
set_point_budget(budget) Set max points
add_measurement_tool(type) Add measurement
add_annotation(position, title) Add annotation

Examples

See the examples/ folder for Jupyter notebooks demonstrating each library:

  • maplibre.ipynb - MapLibre GL JS basics
  • mapbox.ipynb - Mapbox GL JS with terrain
  • leaflet.ipynb - Leaflet markers and GeoJSON
  • openlayers.ipynb - OpenLayers and WMS
  • deckgl.ipynb - DeckGL visualization layers
  • cesium.ipynb - Cesium 3D globe
  • keplergl.ipynb - KeplerGL data exploration
  • potree.ipynb - Potree point clouds

Development

Prerequisites

  • Python 3.10+
  • Node.js 18+
  • npm

Setup

git clone https://github.com/opengeos/anymap-ts.git
cd anymap-ts
pip install -e ".[dev]"
npm install --legacy-peer-deps

Build

# Build all libraries
npm run build:all

# Build specific library
npm run build:maplibre
npm run build:mapbox
npm run build:leaflet
npm run build:deckgl
npm run build:openlayers
npm run build:cesium

# Watch mode
npm run watch

Project Structure

anymap-ts/
├── src/                    # TypeScript source
│   ├── core/               # Base classes
│   ├── maplibre/           # MapLibre implementation
│   ├── mapbox/             # Mapbox implementation
│   ├── leaflet/            # Leaflet implementation
│   ├── openlayers/         # OpenLayers implementation
│   ├── deckgl/             # DeckGL implementation
│   ├── cesium/             # Cesium implementation
│   └── types/              # Type definitions
├── anymap_ts/              # Python package
│   ├── maplibre.py         # MapLibreMap class
│   ├── mapbox.py           # MapboxMap class
│   ├── leaflet.py          # LeafletMap class
│   ├── openlayers.py       # OpenLayersMap class
│   ├── deckgl.py           # DeckGLMap class
│   ├── cesium.py           # CesiumMap class
│   ├── keplergl.py         # KeplerGLMap class
│   ├── potree.py           # PotreeViewer class
│   ├── static/             # Built JS/CSS
│   └── templates/          # HTML export templates
└── examples/               # Example notebooks

License

MIT License - see LICENSE for details.

Credits

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

anymap_ts-0.17.1.tar.gz (272.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

anymap_ts-0.17.1-py3-none-any.whl (15.2 MB view details)

Uploaded Python 3

File details

Details for the file anymap_ts-0.17.1.tar.gz.

File metadata

  • Download URL: anymap_ts-0.17.1.tar.gz
  • Upload date:
  • Size: 272.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for anymap_ts-0.17.1.tar.gz
Algorithm Hash digest
SHA256 4c7923567bdf4b43e39563f8ee7abdc82e4675a8ed9fd45e074ffcae29729f37
MD5 2f4b070f52ed00963de828a203697243
BLAKE2b-256 0b0202f7380cbd1bceb460efd811fd604f53a8224025a1650757741070012228

See more details on using hashes here.

File details

Details for the file anymap_ts-0.17.1-py3-none-any.whl.

File metadata

  • Download URL: anymap_ts-0.17.1-py3-none-any.whl
  • Upload date:
  • Size: 15.2 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for anymap_ts-0.17.1-py3-none-any.whl
Algorithm Hash digest
SHA256 349140181fd3a2bf0e5c94e1c8d9a1455d726b33e5154c3e826b1a25d4403125
MD5 a15351ca6e540eb8c34315fa14607339
BLAKE2b-256 dc93f9bb896987d10ba031bbb1d1b0eb02b395ee140b9bdb699f30e85e4562a2

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page