A fast, open-source GIS tool for urban planning, spatial analysis, and geospatial data visualization. This application allows users to select areas, fetch data from OpenStreetMap (Overpass Turbo), and analyze geographic data with a focus on urban development and sustainability. It utilises LLM chatbots to help the user analyse their workspace.
The main window β tool bar, workspace and tile-source selectors, the layers panel, and a status bar showing zoom, map centre, scale and attribution.
Everything outside the active workspace is blurred, desaturated and dimmed, so the area under study stands out. Selecting a workspace centres the map on it.
The first-run setup wizard. It walks through tile provider, Overpass endpoint, AI and weather keys, and is reopenable at any time from the β button.
Video walkthrough (older UI)
Screencast.From.2025-07-29.11-55-13.mp4
On first launch a setup wizard walks you through the optional API keys β tile provider, Overpass endpoint, OpenRouter and the weather services. Everything has a working default, so you can press Skip for now and configure it later from the β button in the toolbar.
- Select the Selection Tool (second icon from the left, or press
W). - Use it to select an area on the map.
- On the left side, choose which layers you want from the Layers panel.
- At the top, select the Workspace.
- Note: Loading may take a few seconds depending on the size of the response.
From here you can either Analyse using llm For this simply ask what you want the llm to in the chat box on the right. Do note that it is containerised and will only be able to access data selected for the workspace. Change color
- Note: Loading may take a few seconds depending on the size of the response.
- Once the data is loaded, switch back to the Cursor Tool (
V, which also acts as the info tool). - Click on a house or other element.
- You can then change its color based on its properties.
| Key | Tool |
|---|---|
V |
Pan and select |
W |
Workspace area (press again to cycle circle / rectangle / polygon) |
M |
Measure distance |
P |
Drop a pin |
- Move around and zoom into maps seamlessly.
- Select an area using circle, rectangle or polygon tools.
- Picking a workspace centres the map on it and starts loading its tiles.
- Everything outside the active workspace is blurred out, so the area under study stands out. Choose None in the workspace dropdown to see the whole map again.
- A Fetch data button downloads the layers you have ticked, and tells you when no workspace or no layers are selected.
- Search for a place by name in the top right to jump to it, framed by its size β a country arrives zoomed out, a street zoomed in.
- Workspaces are sticky: drift a little past the edge and the map eases back; drag firmly and it lets you go.
- Export β Data as GeoJSON writes every feature in the workspace to a file.
- Export β Map view as PNG saves the map area, cropped free of the interface.
- Drop a
.geojsonfile on the window to import it. It becomes a workspace of its own, covering the file's extent, and is opened straight away. - Export β Download tiles for offline use caches the workspace's tiles so it still draws with no network. This is a bulk download: OpenStreetMap's tile usage policy does not allow it, so use a provider whose terms do, or your own server. Downloads are capped at 4000 tiles and fetched one at a time.
Exports are written to the platform data directory (~/.local/share/map-rs/exports
on Linux); the toolbar shows the path and copies it on click.
- Interactive chat interface for geospatial queries
- Natural language commands for spatial analysis (population dencity, suitabilty of new houses, etc.)
- Automated feature summarization and insights
- Context-aware responses based on current map selection
- Save and load workspaces with selected areas and layers.
- Persistent workspace state and configuration.
- First-run setup wizard, reopenable as a Settings dialog.
- Choose a tile provider (OpenStreetMap, Google, Mapbox, Thunderforest, MapTiler or a custom XYZ URL) and supply its key.
- Point Overpass and the place-search endpoint at your own instances to avoid the public ones' rate limits.
- "Test connection" buttons for each endpoint.
- Keys are stored outside the repository, in the platform config directory, in a file
that is owner-readable only (
0600on unix).
-
Rust 1.95 or newer (Bevy 0.19 requires it)
- Install via https://rustup.rs/, then
rustup update stable
- Install via https://rustup.rs/, then
-
Click on your Linux distribution to see the required dependencies:
Fedora / RHEL / CentOS (dnf)
sudo dnf install alsa-lib-devel libudev-devel fontconfig-devel protobuf-compilerUbuntu / Debian (apt)
sudo apt install libasound2-dev libudev-dev libfontconfig1-dev protobuf-compilerArch Linux / Manjaro (pacman)
sudo pacman -S alsa-lib libudev fontconfig protobufAlpine Linux (apk)
sudo apk add alsa-lib-dev eudev-dev fontconfig-dev protobuf-dev protobufgit clone https://github.com/SO9010/map-rs.git
cd map-rs
cargo run # 'cargo build' if you only want the binaryNote: run the app with
cargo run, not by invokingtarget/debug/map-rsdirectly. Bevy resolvesassets/relative to the manifest directory, so the bare binary cannot find the shaders or fonts.
Nothing needs editing in source. Launch the app and use the setup wizard, or open Settings (β in the toolbar) at any time.
Settings are written to:
| Platform | Location |
|---|---|
| Linux | ~/.config/map-rs/config.toml |
| macOS | ~/Library/Application Support/dev.map-rs.Map-RS/config.toml |
| Windows | %APPDATA%\map-rs\Map-RS\config\config.toml |
Saved workspaces go to the corresponding data directory (~/.local/share/map-rs on
Linux) and cached map tiles to the cache directory (~/.cache/map-rs).
For the AI chat, get a key from OpenRouter and paste it into Settings β AI assistant. The application works without any API key β only the AI chat is unavailable, and the map falls back to OpenStreetMap tiles.
The images above are generated by the app itself, so they can be refreshed after a UI change without capturing the rest of your desktop:
# Press F12 at any time to save a PNG into the working directory, or script it:
MAP_RS_SCREENSHOT="assets/screenshots/main-ui.png:10" MAP_RS_SCREENSHOT_EXIT=1 cargo runMAP_RS_SCREENSHOT=<path>[:<seconds>] captures after the given delay (default 8s, to
let tiles load); MAP_RS_SCREENSHOT_EXIT=1 quits once the file is written.
Contributions are welcome! Feel free to fork the repository, submit issues, or suggest new features.
- Fork the repository.
- Create a new branch:
git checkout -b feature-name - Make changes and commit:
git commit -m "Added new feature" - Push to your branch:
git push origin feature-name - Submit a pull request.


