Rust transpilation of pymdu (Python Urban Data Model) - Python bindings
Project description
pymdurs
Rust transpilation of pymdu (Python Urban Data Model).
This project transpiles the Python pymdu library to Rust, using the GeoRust ecosystem for geospatial operations. It provides three deployment targets: native Rust library, Python bindings (PyO3), and WebAssembly (WASM) for browser-based applications.
๐ฏ Project Overview
pymdurs is a comprehensive geospatial data processing library for urban data analysis, providing:
- Native Rust library (
rsmdu) - High-performance geospatial operations - Python bindings (
pymdurs) - Pythonic API with PyO3 - WebAssembly bindings (
rsmdu-wasm) - Browser-based geospatial processing
๐ฆ Project Structure
This project is organized as a Cargo workspace with three main crates:
pymdurs/
โโโ rsmdu/ # Core Rust library
โ โโโ src/
โ โ โโโ geometric/ # Geometric data structures
โ โ โ โโโ building.rs # Building and BuildingCollection
โ โ โ โโโ dem.rs # Digital Elevation Model
โ โ โ โโโ cadastre.rs # Cadastral parcel data
โ โ โ โโโ iris.rs # IRIS statistical units
โ โ โ โโโ lcz.rs # Local Climate Zone
โ โ โ โโโ road.rs # Road segments
โ โ โ โโโ water.rs # Water bodies
โ โ โ โโโ vegetation.rs # Vegetation zones
โ โ โโโ collect/ # Data collection modules
โ โ โ โโโ ign/ # IGN API integration
โ โ โ โ โโโ ign_collect.rs
โ โ โ โโโ global_variables.rs
โ โ โโโ geo_core.rs # Base GeoCore class
โ โ โโโ commons/ # Common utilities
โ โ โโโ lib.rs # Library root
โ โ โโโ main.rs # Binary entry point
โ โโโ examples/ # Rust usage examples
โ
โโโ pymdurs/ # Python bindings (PyO3)
โ โโโ src/
โ โ โโโ bindings/ # PyO3 bindings
โ โโโ examples/ # Python usage examples
โ โโโ tests/ # Python tests
โ
โโโ rsmdu-wasm/ # WebAssembly bindings
โโโ src/
โ โโโ lib.rs # WASM bindings
โโโ examples/ # Browser examples
โโโ index.html # Building visualization
โโโ dem.html # DEM visualization
โจ Features
๐ข Building Data Management
- Building data collection: Load buildings from Shapefiles, GeoJSON, or IGN API
- Geometric operations: Area, centroid, and height calculations
- Data processing: Height processing with fallback to storeys or mean district height
- Height calculation: Automatic height filling using:
- Number of storeys ร default storey height
- Alternative height field (HAUTEUR_2)
- Mean district height (weighted by area)
- DataFrame support: Integration with Polars for tabular operations (equivalent to GeoDataFrame)
- WebAssembly support: Process building data directly in the browser
๐ป Digital Elevation Model (DEM)
- DEM collection: Download DEM data from IGN API via WMS-R
- Raster processing: GeoTIFF handling and validation
- Mask generation: Automatic mask creation for DEM boundaries
- Browser visualization: Interactive DEM viewer with Leaflet.js integration
- IGN API integration: Direct loading from IGN WMS service in browser
๐บ๏ธ Cadastral Data
- Cadastre collection: Download cadastral parcel data from IGN API via WFS
- GeoJSON parsing: Automatic parsing of IGN API responses
- GeoJSON export: Save cadastral data to GeoPackage format
๐ IRIS Statistical Units
- IRIS collection: Download IRIS (statistical units) data from IGN API via WFS
- GeoJSON parsing: Automatic parsing of IGN API responses
- GeoJSON export: Save IRIS data to GeoPackage format
๐ก๏ธ LCZ (Local Climate Zone)
- LCZ collection: Load Local Climate Zone data from external sources
- Color mapping: Built-in LCZ color table (17 LCZ types)
- Spatial filtering: Filter LCZ data by bounding box
- Shapefile support: Load from zip URLs (requires GDAL)
๐ฃ๏ธ Road and Infrastructure
- Road collection: Download road segments from IGN API
- Water bodies: Download water body data from IGN API
- Vegetation zones: Download vegetation data from IGN API
๐ฐ๏ธ LiDAR Processing
- LiDAR data collection: Download LAZ files from IGN WFS service
- Point cloud processing: Load and process LiDAR point clouds
- Raster generation: Create DSM (Digital Surface Model), DTM (Digital Terrain Model), and CHM (Canopy Height Model)
- Classification filtering: Filter points by classification (ground, vegetation, buildings, water, etc.)
- Multi-band GeoTIFF export: Export processed rasters as multi-band GeoTIFF files
- Automatic workflow: Points are automatically fetched and loaded when bounding box is set
๐ IGN API Integration
- WFS (Web Feature Service): Vector data retrieval (buildings, roads, water, etc.)
- WMS (Web Map Service): Raster data retrieval (DEM, orthoimagery, etc.)
- WMS-R endpoint: Optimized raster service endpoint
- OGC compliance: Follows OGC WFS 2.0.0 and WMS 1.3.0 standards
- Browser support: Direct API calls from WebAssembly
๐จ WebAssembly Features
- Building processing: Load and process building GeoJSON in the browser
- DEM visualization: Interactive DEM viewer with color scales
- IGN API integration: Fetch data directly from IGN API in browser
- Leaflet.js integration: Seamless integration with Leaflet maps
- Dynamic bbox: Automatic bounding box updates based on map view
๐ Installation
Python Package
Requirements: Python >= 3.10, pandas >= 2.0.0, numpy >= 2.0.2
Important: Run maturin from the project root (where pyproject.toml is). Maturin uses manifest-path = "pymdurs/Cargo.toml".
1. Clone and setup
git clone https://github.com/rupeelab17/rsmdu.git
cd rsmdu
uv venv .venv --python 3.13
source .venv/bin/activate
uv pip install maturin
uv sync
2. Install GDAL (prerequisite)
| Platform | Command |
|---|---|
| macOS | brew install gdal or ARCHFLAGS="-arch arm64" uv pip install --no-cache-dir gdal |
| Linux | sudo apt-get update && sudo apt-get install -y libgdal-dev gdal-bin libclang-dev |
| Windows | OSGeo4W (GDAL, GEOS, PROJ, SQLite3) + choco install llvm pkgconfiglite sqlite -y + set GDAL_HOME, PKG_CONFIG_PATH, PATH |
3. Build (maturin develop)
| Platform | Target | Command |
|---|---|---|
| macOS (Apple Silicon) | aarch64-apple-darwin |
maturin develop --target aarch64-apple-darwin |
| macOS (Intel) | x86_64-apple-darwin |
maturin develop --target x86_64-apple-darwin |
| Linux (x86_64) | x86_64-unknown-linux-gnu |
maturin develop --target x86_64-unknown-linux-gnu or maturin develop |
| Linux (ARM64) | aarch64-unknown-linux-gnu |
maturin develop --target aarch64-unknown-linux-gnu |
| Windows | x86_64-pc-windows-msvc |
maturin develop --target x86_64-pc-windows-msvc |
With uv: uv run maturin develop --target <target>
macOS: linker can't find GDAL / "library 'gdal' not found"
If you upgraded GDAL or PROJ with Homebrew, the linker may still use old paths. Clean and point pkg-config at the current install, then rebuild:
cd pymdurs && cargo clean && cd ..
export PKG_CONFIG_PATH="/opt/homebrew/lib/pkgconfig"
maturin develop --target aarch64-apple-darwin
4. Verify and release
python -c "import pymdurs; print('OK')"
# Release wheel
maturin build --target <target> --release
Installing Rust
Maturin compiles the Rust extension. If Rust is not installed, follow the instructions for your operating system:
Windows
-
Download and run rustup-init.exe:
- Visit https://rustup.rs/
- Download
rustup-init.exe - Run the installer and follow the prompts
-
Or use PowerShell:
Invoke-WebRequest -Uri https://win.rustup.rs/x86_64 -OutFile rustup-init.exe .\rustup-init.exe
-
Verify installation:
rustc --version cargo --version
-
Install Visual Studio Build Tools (required for Windows):
- Download from: https://visualstudio.microsoft.com/downloads/
- Install "Desktop development with C++" workload
- Or install the lighter "C++ build tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/
Note: On Windows, you may need to restart your terminal after installation for PATH changes to take effect.
macOS
-
Install using Homebrew (recommended):
brew install rust
-
Or use rustup (official installer):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
-
Follow the prompts and restart your terminal
-
Verify installation:
rustc --version cargo --version
Note: On macOS, you may need to install Xcode Command Line Tools:
xcode-select --install
Linux
-
Install using your package manager:
Ubuntu/Debian:
sudo apt update sudo apt install rustc cargo
Fedora:
sudo dnf install rust cargo
Arch Linux:
sudo pacman -S rust
-
Or use rustup (recommended for latest version):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source $HOME/.cargo/env
-
Install build dependencies (required):
Ubuntu/Debian:
sudo apt install build-essential pkg-config libssl-dev
Fedora:
sudo dnf install gcc pkg-config openssl-devel
Arch Linux:
sudo pacman -S base-devel
-
Verify installation:
rustc --version cargo --version
Docker
When building an image that installs pymdurs with uv pip install https://github.com/rupeelab17/rsmdu.git, Rust must be installed in a previous layer. If Rust is not present, maturin installs it on the fly and can hit "Text file busy (os error 26)" when running cargo metadata immediately after.
Fix: install Rust (e.g. with rustup) before the step that runs uv pip install:
# Install Rust so maturin does not auto-install it (avoids "Text file busy")
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable \
&& . "$HOME/.cargo/env" \
&& rustc --version
ENV PATH="/root/.cargo/bin:${PATH}"
# Then install pymdurs (maturin will find cargo and build the wheel)
RUN micromamba run -n umep_pymdu python -m uv pip install https://github.com/rupeelab17/rsmdu.git
Adjust the environment (e.g. micromamba run -n umep_pymdu, or ENV PATH if Rust is installed for another user) to match your image.
WebAssembly
# Install wasm-pack
cargo install wasm-pack
# Add WASM target
rustup target add wasm32-unknown-unknown
# Navigate to WASM package directory
cd rsmdu-wasm
# Fix WASM target (if needed)
./fix-wasm-target.sh
# Build WASM package
./build.sh
See rsmdu-wasm/README.md for detailed WebAssembly setup instructions.
๐ Usage
Rust Library
Building Collection
use rsmdu::geometric::building::BuildingCollection;
// Create BuildingCollection (Python: Building(output_path='./'))
let mut buildings = BuildingCollection::new(
None, // filepath_shp (None = use IGN API)
Some("./output".to_string()), // output_path
3.0, // defaultStoreyHeight
None, // set_crs (None = default EPSG:2154)
)?;
// Set bounding box (Python: buildings.bbox = [...])
buildings.set_bbox(-1.152704, 46.181627, -1.139893, 46.18699)?;
// Run processing (Python: buildings = buildings.run())
let buildings = buildings.run()?;
// Convert to Polars DataFrame (Python: buildings.to_gdf())
let df = buildings.to_polars_df()?;
DEM (Digital Elevation Model)
use rsmdu::geometric::dem::Dem;
// Create Dem instance
let mut dem = Dem::new(Some("./output".to_string()))?;
// Set bounding box
dem.set_bbox(-1.152704, 46.181627, -1.139893, 46.18699);
// Run DEM processing
let dem_result = dem.run(None)?;
// Get output paths
println!("DEM saved to: {:?}", dem_result.get_path_save_tiff());
println!("Mask: {:?}", dem_result.get_path_save_mask());
Python Bindings
import pymdurs
# Create BuildingCollection
buildings = pymdurs.geometric.Building(
output_path="./output",
defaultStoreyHeight=3.0
)
# Set bounding box
buildings.set_bbox(-1.152704, 46.181627, -1.139893, 46.18699)
# Run processing (downloads from IGN API)
buildings = buildings.run()
# Convert to pandas DataFrame
df = buildings.to_pandas()
LiDAR Processing
import pymdurs
# Create Lidar instance
lidar = pymdurs.geometric.Lidar(output_path="./output")
# Set bounding box (automatically fetches LAZ file URLs and loads points)
# Format: min_x, min_y, max_x, max_y (WGS84, EPSG:4326)
lidar.set_bbox(-1.154894, 46.182639, -1.148361, 46.186820)
# Set CRS (optional, defaults to EPSG:2154)
lidar.set_crs(2154)
# Process points to create rasters (DSM, DTM, CHM)
# Classification filter: 2=Ground, 3=Low Vegetation, 4=Medium, 5=High, 6=Building, 9=Water
classification_list = [3, 4, 5, 9] # Vegetation and water
output_path = lidar.run(file_name="CDSM.tif", classification_list=classification_list)
print(f"GeoTIFF saved to: {output_path}")
# File contains 3 bands: DSM, DTM, CHM
WebAssembly (Browser)
Building Processing
import init, { WasmBuildingCollection } from "./pkg/rsmdu_wasm.js";
// Initialize WASM
await init("./pkg/rsmdu_wasm_bg.wasm");
// Load buildings from GeoJSON
const geojson = {
type: "FeatureCollection",
features: [
/* ... */
],
};
const collection = WasmBuildingCollection.from_geojson(
JSON.stringify(geojson),
3.0, // default storey height in meters
);
// Process heights
collection.process_heights();
// Get processed GeoJSON
const processedGeojson = collection.to_geojson();
// Get statistics
const stats = collection.get_stats();
console.log("Building count:", stats.count);
console.log("Total area:", stats.total_area);
console.log("Mean height:", stats.mean_height);
DEM Loading
import init, { WasmDem } from "./pkg/rsmdu_wasm.js";
// Initialize WASM
await init("./pkg/rsmdu_wasm_bg.wasm");
// Load DEM from IGN API
const dem = await WasmDem.from_ign_api(
-1.152704, // min_x
46.181627, // min_y
-1.139893, // max_x
46.18699, // max_y
);
// Get DEM dimensions
console.log("Width:", dem.width());
console.log("Height:", dem.height());
// Get extent
const extent = dem.get_extent();
console.log("Extent:", extent);
See rsmdu-wasm/examples/index.html and rsmdu-wasm/examples/dem.html for complete browser examples.
๐ Examples
Comprehensive examples are available for all three deployment targets:
Rust Examples
Located in rsmdu/examples/:
Building Examples:
building_manual.rs: Minimal example of manually creating buildingsbuilding_from_geojson.rs: Complete example loading from GeoJSONbuilding_from_ign.rs: Example usingrun()method (Python-style)building_from_ign_api.rs: Detailed example loading buildings from IGN APIbuilding_complete.rs: Comprehensive example covering all use cases
Other Examples:
dem_from_ign.rs: Downloading and processing DEM from IGN APIcadastre_from_ign.rs: Downloading and processing cadastral data from IGN APIiris_from_ign.rs: Downloading and processing IRIS statistical units from IGN APIlcz_from_url.rs: Loading and processing LCZ data from URLcosia_from_ign.rs: Downloading COSIA landcover raster from IGN APIrnb_from_api.rs: Downloading RNB (French National Building Reference) data from RNB APIroad_from_ign.rs: Downloading road segments from IGN APIwater_from_ign.rs: Downloading water bodies from IGN APIvegetation_from_ign.rs: Downloading vegetation zones from IGN API
Run Rust examples:
cd rsmdu
cargo run --example building_manual
cargo run --example building_from_geojson
cargo run --example building_from_ign
cargo run --example dem_from_ign
cargo run --example cadastre_from_ign
cargo run --example iris_from_ign
cargo run --example lcz_from_url
cargo run --example cosia_from_ign
cargo run --example rnb_from_api
Python Examples
Located in examples/ (see examples/README.md for full documentation):
building_basic.py: Basic Building usagebuilding_from_ign.py: Load buildings from IGN APIdem_from_ign.py: Download DEM from IGN APIcadastre_from_ign.py: Download cadastral data from IGN APIiris_from_ign.py: Download IRIS statistical units from IGN APIlcz_from_url.py: Load LCZ data from URLcosia_from_ign.py: Complete COSIA workflow - download, vectorize and convert to UMEP formatrnb_from_api.py: Download RNB (French National Building Reference) data from RNB APIlidar_from_wfs.py: Download and process LiDAR data from IGN WFS serviceroad_from_ign.py: Download road segments from IGN APIwater_from_ign.py: Download water bodies from IGN APIvegetation_from_ign.py: Download vegetation zones from IGN APIumep_workflow.py: Complete UMEP workflow for urban climate modeling (SOLWEIG, SVF, etc.)umep_workflow_new.py: Alternative UMEP workflow using solweig (SOLWEIG from UMEP-dev), with GIF export from preview PNGs
Run Python examples (from project root):
python examples/building_basic.py
python examples/building_from_ign.py
python examples/dem_from_ign.py
python examples/cosia_from_ign.py
python examples/umep_workflow.py
python examples/umep_workflow_new.py
WebAssembly Examples
Located in rsmdu-wasm/examples/:
index.html: Interactive building visualization with Leaflet.js- Load buildings from GeoJSON or IGN API
- Dynamic bounding box based on map view
- Building statistics and visualization
dem.html: Interactive DEM visualization with Leaflet.js- Load DEM from local TIFF files or IGN API
- Multiple color scales (terrain, elevation, grayscale)
- Elevation query on click
- Automatic OSM layer opacity adjustment
Run WebAssembly examples:
cd rsmdu-wasm
./build.sh
cd examples
python3 -m http.server 8000
# Open http://localhost:8000/index.html or http://localhost:8000/dem.html
๐ IGN API
The library integrates with the French IGN (Institut Gรฉographique National) Gรฉoplateforme API.
Available Services
Vector Data (WFS):
buildings: Building footprints (BDTOPO_V3:batiment)road: Road segments (BDTOPO_V3:troncon_de_route)water: Water bodies (BDTOPO_V3:plan_d_eau)cadastre: Cadastral parcels (CADASTRALPARCELS.PARCELLAIRE_EXPRESS:parcelle)iris: IRIS statistical units (STATISTICALUNITS.IRIS:contours_iris)lidar: LiDAR point cloud data (IGNF_LIDAR-HD_TA:nuage-dalle)vegetation: Vegetation zoneshydrographique: Hydrographic details
Raster Data (WMS-R):
dem: Digital Elevation Model (ELEVATION.ELEVATIONGRIDCOVERAGE.HIGHRES)dsm: Digital Surface Modelirc: IRC orthoimageryortho: High-resolution orthoimagerycosia: COSIA imagery
API Requirements
- Internet connection: Required for API requests
- Rate limiting: The API may have rate limits
- Coordinate system: Bounding boxes must be in WGS84 (EPSG:4326)
- API keys: For production use, you may need to register at https://geoservices.ign.fr/
- CORS: Browser-based requests require CORS support (available for IGN API)
๐๏ธ Architecture
Workspace Structure
The project uses a Cargo workspace with three crates:
-
rsmdu: Core Rust library with all geospatial functionality- Uses feature flags (
wasm) to conditionally compile WASM-incompatible dependencies - Optional dependencies:
gdal,proj,geos,polars,reqwest, etc.
- Uses feature flags (
-
pymdurs: Python bindings using PyO3- Depends on
rsmducrate - Provides Pythonic API with aliases
- Depends on
-
rsmdu-wasm: WebAssembly bindings- Uses
rsmduwithwasmfeature flag - Only WASM-compatible dependencies (geo, geojson, geotiff, tiff)
- Browser-specific APIs (web-sys, wasm-bindgen)
- Uses
Inheritance Pattern (Python โ Rust)
In Python, Building inherits from IgnCollect, which inherits from GeoCore. In Rust, we use composition:
// Python: class Building(IgnCollect)
// Rust: BuildingCollection contains GeoCore and IgnCollect
pub struct BuildingCollection {
pub geo_core: GeoCore, // Inherits from GeoCore
ign_collect: Option<IgnCollect>, // Inherits from IgnCollect
// ...
}
GeoCore Properties
GeoCore provides base functionality:
epsg: Coordinate Reference System (default: 2154)bbox: Bounding boxoutput_path: Output directoryoutput_path_shp: Shapefile output pathfilename_shp: Shapefile filename
๐ Status
โ Fully Implemented
Core Features:
- โ GeoJSON parsing and building collection
- โ IGN API integration (WFS and WMS)
- โ Building height processing with multiple fallback strategies
- โ DEM collection via WMS-R
- โ Cadastral data collection via WFS
- โ IRIS statistical units collection via WFS
- โ LCZ data structure with color mapping (17 LCZ types)
- โ Road, water, and vegetation data collection
- โ Polars DataFrame conversion
- โ GeoCore base class with all properties
- โ
BuildingCollection with
run()method (Python-style) - โ Coordinate Reference System (CRS) transformations using Proj
Python Bindings (PyO3):
- โ
Complete Python bindings installable via
pip install pymdurs - โ
All geometric classes available:
Building,Dem,Cadastre,Iris,Lcz,Lidar,Road,Water,Vegetation - โ
Geometric submodule (
pymdurs.geometric) for organized class access - โ
Pythonic API with aliases (e.g.,
pymdurs.geometric.Buildinginstead ofPyBuilding) - โ Pandas DataFrame conversion for Building data
- โ GeoJSON export/import
- โ LiDAR processing with automatic point loading
- โ Comprehensive Python examples and tests
WebAssembly Bindings:
- โ Building collection processing in browser
- โ DEM loading from IGN API in browser
- โ DEM loading from local TIFF files
- โ Interactive Leaflet.js visualization
- โ Dynamic bounding box updates
- โ Building statistics
- โ DEM visualization with color scales
- โ Elevation query on map click
- โ OSM layer opacity control
Data Formats:
- โ GeoJSON parsing and generation
- โ GeoTIFF reading and validation
- โ GeoJSON export (simplified, saves as GeoJSON temporarily)
๐ง In Progress / Limitations
Current Limitations:
- โ ๏ธ GDAL Shapefile I/O temporarily disabled (API compatibility issues)
- โ ๏ธ Full GeoJSON export not yet implemented (saves as GeoJSON as workaround)
- โ ๏ธ LCZ shapefile loading from zip URLs requires full GDAL implementation
- โ ๏ธ Raster reprojection simplified (full resampling not yet implemented)
- โ ๏ธ Shapefile export for masks not yet available
- โ ๏ธ DEM pixel data access in WASM (currently metadata only)
Workarounds:
- Use GeoJSON format instead of Shapefiles for input/output
- GeoJSON export currently saves as GeoJSON (full GeoJSON support planned)
- LCZ processing structure ready but full shapefile loading pending GDAL fixes
- DEM visualization uses JavaScript libraries (GeoRasterLayer) for pixel access
๐ Planned Features
Short-term:
- Complete GDAL integration for Shapefile I/O
- Full GeoJSON export with proper layer management
- Full raster reprojection with resampling options
- LCZ shapefile loading from zip URLs
- Full DEM pixel data access in WASM
Long-term:
- Additional geometric operations
- More IGN API services
- Performance optimizations
- Additional output formats
- Enhanced error handling and validation
- 3D visualization capabilities
๐งช Testing
Rust Tests
Run Rust unit tests:
cd rsmdu
cargo test
Python Tests
Run Python tests:
cd pymdurs
pytest tests/
Or manually test the Python bindings:
cd pymdurs
python -c "import pymdurs; print('โ
pymdurs imported successfully')"
python -c "import pymdurs; print('Available classes:', [x for x in dir(pymdurs.geometric) if not x.startswith('_')])"
python -c "import pymdurs; lidar = pymdurs.geometric.Lidar(output_path='./test'); print('โ
Lidar class works')"
WebAssembly Tests
cd rsmdu-wasm
wasm-pack test --headless --firefox
๐ค Contributing
Contributions are welcome! This project follows standard Rust and Python best practices.
Development Setup
-
Clone the repository:
git clone https://github.com/rupeelab17/pymdurs.git cd pymdurs
-
Set up Rust development:
Note: If you haven't installed Rust yet, see the Installing Rust section above.
cd rsmdu cargo build cargo test
-
Set up Python development: See Python Package for platform-specific build instructions.
-
Set up WebAssembly development:
cd rsmdu-wasm rustup target add wasm32-unknown-unknown cargo install wasm-pack ./build.sh
Contribution Guidelines
- Follow Rust naming conventions and style
- Add tests for new features
- Update documentation (README.md) for significant changes
- Ensure all examples still work after changes
- Test all three deployment targets (Rust, Python, WASM)
- Use feature flags for WASM-incompatible code
Reporting Issues
Please use GitHub Issues to report bugs or request features. Include:
- Description of the issue
- Steps to reproduce
- Expected vs actual behavior
- Environment details (OS, Rust version, Python version, browser for WASM)
๐ License
GPL-3.0 (same as pymdu)
โก Performance
This Rust implementation provides significant performance improvements over the original Python version:
- Memory efficiency: Rust's ownership system prevents memory leaks
- Concurrency: Safe parallel processing capabilities
- Speed: Native compilation provides faster execution
- Type safety: Compile-time error checking reduces runtime errors
- WebAssembly: Near-native performance in the browser
๐ Related Projects
- pymdu: Original Python implementation
- GeoRust: Rust geospatial ecosystem
- IGN Gรฉoplateforme: French geospatial data services
- PyO3: Rust bindings for Python
- Maturin: Build tool for Python packages with Rust extensions
- wasm-pack: Build tool for WebAssembly packages
๐ Version
Current version: 0.1.1 (Alpha)
This is an early release. The API may change in future versions. See the Status section for implementation details.
๐ Documentation
- Rust API: Run
cargo doc --openin thersmdudirectory - Python API: See
pymdurs/README.md - WebAssembly API: See
rsmdu-wasm/README.md - Examples: See examples/README.md,
rsmdu/examples/, andrsmdu-wasm/examples/
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 Distributions
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 pymdurs-0.1.1.tar.gz.
File metadata
- Download URL: pymdurs-0.1.1.tar.gz
- Upload date:
- Size: 176.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1d1865874de58a320d6286356c4072ce15547a8dca58de599bda5be530916fc8
|
|
| MD5 |
3d485dcb391a65cadcbd0408092103f7
|
|
| BLAKE2b-256 |
50e829539a6fc517f9d7159c4f9fc4bfcca7486ba6c301ff3364bf8113aa89f5
|
Provenance
The following attestation bundles were made for pymdurs-0.1.1.tar.gz:
Publisher:
release-python.yml on rupeelab17/rsmdu
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pymdurs-0.1.1.tar.gz -
Subject digest:
1d1865874de58a320d6286356c4072ce15547a8dca58de599bda5be530916fc8 - Sigstore transparency entry: 984909678
- Sigstore integration time:
-
Permalink:
rupeelab17/rsmdu@39e6f2e6e68168aa51b332166e21cd0b3906ca51 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/rupeelab17
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@39e6f2e6e68168aa51b332166e21cd0b3906ca51 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file pymdurs-0.1.1-cp38-abi3-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: pymdurs-0.1.1-cp38-abi3-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 65.4 MB
- Tags: CPython 3.8+, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2c491d525d14992d8eafc17e98f3245574595c3d36b893fb269feceae4a822da
|
|
| MD5 |
28fa03bc21ca7af11f15cbb3f0448bba
|
|
| BLAKE2b-256 |
a5d50d3943421ad26ed1b2ab21a7e9f0cfea198d3650034a37de53440cb88a42
|
Provenance
The following attestation bundles were made for pymdurs-0.1.1-cp38-abi3-manylinux_2_39_x86_64.whl:
Publisher:
release-python.yml on rupeelab17/rsmdu
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pymdurs-0.1.1-cp38-abi3-manylinux_2_39_x86_64.whl -
Subject digest:
2c491d525d14992d8eafc17e98f3245574595c3d36b893fb269feceae4a822da - Sigstore transparency entry: 984909681
- Sigstore integration time:
-
Permalink:
rupeelab17/rsmdu@39e6f2e6e68168aa51b332166e21cd0b3906ca51 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/rupeelab17
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@39e6f2e6e68168aa51b332166e21cd0b3906ca51 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file pymdurs-0.1.1-cp38-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: pymdurs-0.1.1-cp38-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 7.6 MB
- Tags: CPython 3.8+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9403131deae810fe37dae421a5f84e5ed52da698adb781728ecd66441540a3d3
|
|
| MD5 |
0b4d2def48c46b2d8bd4a7d7c6ea6544
|
|
| BLAKE2b-256 |
45eee908cfcd8fbd11294d170d6ff453a7eb1b0190b5da4068316c3de4b7263c
|
Provenance
The following attestation bundles were made for pymdurs-0.1.1-cp38-abi3-macosx_11_0_arm64.whl:
Publisher:
release-python.yml on rupeelab17/rsmdu
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pymdurs-0.1.1-cp38-abi3-macosx_11_0_arm64.whl -
Subject digest:
9403131deae810fe37dae421a5f84e5ed52da698adb781728ecd66441540a3d3 - Sigstore transparency entry: 984909680
- Sigstore integration time:
-
Permalink:
rupeelab17/rsmdu@39e6f2e6e68168aa51b332166e21cd0b3906ca51 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/rupeelab17
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@39e6f2e6e68168aa51b332166e21cd0b3906ca51 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file pymdurs-0.1.1-cp38-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: pymdurs-0.1.1-cp38-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 8.0 MB
- Tags: CPython 3.8+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5024805518835b38f70cb28013225476fd173296b4d023ff62b795d046093345
|
|
| MD5 |
a7bc3392fbff125e84114e3fe70f36db
|
|
| BLAKE2b-256 |
6471ab21c9aa5f51bc28fb78608ad64e426f73e424729c407390377669a2d998
|
Provenance
The following attestation bundles were made for pymdurs-0.1.1-cp38-abi3-macosx_10_12_x86_64.whl:
Publisher:
release-python.yml on rupeelab17/rsmdu
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pymdurs-0.1.1-cp38-abi3-macosx_10_12_x86_64.whl -
Subject digest:
5024805518835b38f70cb28013225476fd173296b4d023ff62b795d046093345 - Sigstore transparency entry: 984909683
- Sigstore integration time:
-
Permalink:
rupeelab17/rsmdu@39e6f2e6e68168aa51b332166e21cd0b3906ca51 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/rupeelab17
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-python.yml@39e6f2e6e68168aa51b332166e21cd0b3906ca51 -
Trigger Event:
workflow_dispatch
-
Statement type: