A Python package for creating interactive maps with anywidget and JavaScript mapping libraries
Project description
AnyMap
A Python package for creating interactive maps with anywidget and JavaScript mapping libraries
- GitHub repo: https://github.com/opengeos/anymap
- Documentation: https://anymap.dev
- PyPI: https://pypi.org/project/anymap
- Conda-forge: https://anaconda.org/conda-forge/anymap
- Free software: MIT License
Features
- 🗺️ Interactive Maps: Create beautiful, interactive maps in Jupyter notebooks
- 🔄 Bidirectional Communication: Full Python ↔ JavaScript communication
- 📱 Multi-cell Support: Render maps in multiple notebook cells without conflicts
- 🎯 MapLibre Integration: Built-in support for MapLibre GL JS
- 🛠️ Extensible: Easy to add support for other mapping libraries
- 🚀 Familiar API: Similar to ipyleaflet for easy migration
Installation
pip install anymap
conda install -c conda-forge anymap
Quick Start
from anymap import MapLibreMap
# Create a basic map
m = MapLibreMap(
center=[-122.4194, 37.7749], # San Francisco
zoom=12,
height="600px"
)
m
Basic Usage
Creating Maps
from anymap import MapLibreMap
# Create a map with custom settings
m = MapLibreMap(
center=[-74.0060, 40.7128], # New York City
zoom=13,
height="500px",
bearing=45, # Map rotation
pitch=60 # 3D tilt
)
Adding Markers
# Add a marker with popup and custom styling
m.add_marker(
lat=40.7128,
lng=-74.0060,
popup="<h3>New York City</h3><p>The Big Apple</p>",
options={
"color": "#ff5722",
"draggable": True,
}
)
Working with GeoJSON
# Add GeoJSON data
geojson_data = {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [-74.0060, 40.7128]
},
"properties": {"name": "NYC"}
}
]
}
m.add_geojson_layer(
layer_id="cities",
geojson_data=geojson_data,
layer_type="circle",
paint={
"circle-radius": 8,
"circle-color": "#ff0000"
}
)
Event Handling
def handle_click(event):
lat, lng = event['lngLat']
print(f"Clicked at: {lat:.4f}, {lng:.4f}")
m.on_map_event('click', handle_click)
Dynamic Updates
# Change map properties
m.set_center(-0.1278, 51.5074) # London
m.set_zoom(14)
# Animate to a location
m.fly_to(2.3522, 48.8566, zoom=15) # Paris
Multi-Cell Rendering
AnyMap is designed to work seamlessly across multiple notebook cells:
# Cell 1
m = MapLibreMap(center=[0, 0], zoom=2)
m
# Cell 2 - Same map instance
m.add_marker(0, 0, popup="Origin")
# Cell 3 - Display again
m
Advanced Features
Layer Management
# Add and remove layers
m.add_source("my-source", {
"type": "geojson",
"data": geojson_data
})
m.add_layer("my-layer", {
"id": "my-layer",
"type": "circle",
"source": "my-source",
"paint": {"circle-radius": 5}
})
# Remove layers
m.remove_layer("my-layer")
m.remove_source("my-source")
Custom JavaScript Methods
# Call any MapLibre GL JS method
m.call_js_method('easeTo', {
'center': [lng, lat],
'zoom': 14,
'duration': 2000
})
Examples
Check out the example notebooks in the examples/ directory:
basic_usage.ipynb- Basic map creation and interactionadvanced_features.ipynb- Advanced layer management and stylingmulti_cell_test.ipynb- Multi-cell rendering tests
Development
To set up for development:
git clone https://github.com/opengeos/anymap.git
cd anymap
pip install -e .
Run tests:
python -m unittest tests.test_anymap -v
Roadmap
- ✅ MapLibre GL JS backend
- ✅ Mapbox GL JS backend
- ✅ Leaflet backend
- ✅ OpenLayers backend
- ✅ DeckGL backend
- ✅ KeplerGL backend
- 🔲 Cesium backend
- 🔲 Potree backend
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file anymap-0.11.3.tar.gz.
File metadata
- Download URL: anymap-0.11.3.tar.gz
- Upload date:
- Size: 249.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eb66b140db0c327a19d863020987b6526146fbbb2afcbd4fecdcb4e839df1953
|
|
| MD5 |
652c8f08c53f6653e294c06a9ffb6cd5
|
|
| BLAKE2b-256 |
fe307ab4e9d5ffd937e2892b069b4e9095067ba7d8aa9d43dd4273db31e6d3f6
|
File details
Details for the file anymap-0.11.3-py2.py3-none-any.whl.
File metadata
- Download URL: anymap-0.11.3-py2.py3-none-any.whl
- Upload date:
- Size: 271.9 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9e88e01e836dcbe08849af22ccc0145bdbbd702116473bd84dcd62a7180d1ec4
|
|
| MD5 |
d0f4937e2990c545b1eabaa4d61b0686
|
|
| BLAKE2b-256 |
543b9ef110c8a38b764c07e7daf92e0145acf523f10060d1568e6171c8035753
|