Local ProcessingOpenDroneMapDockerPhotogrammetryFree & Open Source

Process Drone Images
On Your Own Machine

NodeODM and OpenDroneMap turn raw aerial photographs into orthomosaics, point clouds, elevation models, and 3D meshes — running entirely on your hardware. No cloud uploads. No subscription fees. No image limits. This guide walks you through the complete setup and workflow from flight to deliverable.

Free
Open source, always
1 cmd
To start NodeODM
6+
Output formats
0
Cloud uploads needed
Quick Start
Already know Docker? Three commands and you're running.

1 — Start NodeODM

docker run -d -p 3000:3000 --name nodeodm --restart unless-stopped opendronemap/nodeodm

2 — Verify it's running

curl http://localhost:3000/info

3 — Connect in mapplot Processing

http://localhost:3000
About

What is NodeODM and OpenDroneMap?

OpenDroneMap (ODM) is a free, open-source photogrammetry engine that reconstructs 3D geometry and georeferenced maps from sets of overlapping aerial photographs. Originally developed for academic research, it has grown into one of the most capable and widely adopted drone image processing systems used in professional surveying, mapping, and GIS workflows worldwide.

NodeODM is the REST API server that wraps the ODM engine. It exposes a clean HTTP interface for submitting image jobs, monitoring progress, and downloading outputs — making it straightforward to integrate drone processing into any application. mapplot connects directly to NodeODM running on your machine, handling job management, progress tracking, and output downloads within your existing project workflow.

Unlike commercial cloud processing platforms — Pix4D Cloud, DroneDeploy, Metashape Cloud — NodeODM runs entirely on your hardware. Images never leave your network. There are no per-image charges, no monthly processing credits, and no dependency on internet connectivity or third-party uptime.

The full stack — ODM engine and NodeODM API — is open source under the AGPL licence, maintained by the OpenDroneMap organisation and a global community of contributors. Commercial support is available from Dronesmith and other providers.

Why run processing locally?

Complete data privacy

Imagery stays on your hardware from capture to delivery. Non-negotiable for government, defence, infrastructure, and commercially sensitive site work.

No upload bottleneck

Large datasets — 500+ images, RAW files, multi-spectral — take hours to upload to cloud platforms. Local processing starts in seconds.

Fully offline capable

Process in the field, on a site network, or anywhere with no internet connection. Only the initial Docker pull requires internet.

Zero processing fees

NodeODM is free. Process 50 images or 5,000 on the same job — the cost is your electricity and hardware, nothing more.

Full algorithm control

Access every OpenDroneMap option — feature matching algorithms, reconstruction quality, point cloud density, output resolution, and GCP integration.

Runs on your network

Deploy NodeODM on a local server and let multiple team members submit jobs without each needing their own processing machine.

Why NodeODM

NodeODM vs Cloud Processing Platforms

How local processing with NodeODM stacks up against the major commercial platforms — cost, privacy, capability, and control.

FeatureNodeODM + mapplotPix4D CloudDroneDeployWebODM (hosted)
CostFree (open source)$350/mo+$299/mo+Free (self-hosted)
Images leave your machineNeverAlwaysAlwaysSelf-hosted: no
Works fully offlineYesNoNoSelf-hosted: yes
Per-image / credit feesNoneYesYesNone
Orthomosaic (GeoTIFF)YesYesYesYes
Dense point cloud (LAS/LAZ)YesYesYesYes
3D textured mesh (OBJ/GLB)YesYesNoYes
Multispectral / NDVI outputsYesYesYesYes
GPU accelerationYes (CUDA)Cloud-sideCloud-sideYes (self-hosted)
DJI KMZ mission integrationVia mapplotNoYesNo
Open sourceYes (AGPL)NoNoYes (AGPL)

Pricing as of 2025. NodeODM is free and open source — always. Cloud platform costs vary by plan and volume. WebODM self-hosted is also free and uses the same ODM engine as NodeODM.

What You'll Produce

Six Professional Output Formats

A single NodeODM job can generate all six output types simultaneously from the same image set. Select only the ones you need — each is a standard format compatible with professional GIS, CAD, and BIM tools.

Orthomosaic / Orthophoto

GeoTIFF (.tif)

A geometrically corrected, georeferenced aerial photograph stitched from hundreds of overlapping drone images. Every pixel has a real-world coordinate. The primary deliverable for land survey, construction monitoring, agriculture, and most mapping workflows.

Client mapsArea measurementChange detectionReport imageryGIS analysis

Digital Surface Model (DSM)

GeoTIFF (.tif)

A raster elevation model representing the height of the highest surface at each point — buildings, tree canopy, and all above-ground features included. Essential for volume calculations, line-of-sight analysis, and solar energy assessments.

Volume calculationsFlood modellingSolar analysisUrban planningEngineering design

Digital Terrain Model (DTM)

GeoTIFF (.tif)

Bare-earth elevation with vegetation and structures algorithmically removed. Used where the true ground surface matters — slope analysis, corridor surveying, hydrological modelling, and civil engineering design.

Hydrological analysisSlope mappingRoad designEarthworksDrainage planning

Dense Point Cloud

LAS / LAZ / PLY

Millions of 3D coordinate points derived from photogrammetric reconstruction, each with XYZ position and RGB colour from the imagery. The foundation for BIM integration, heritage recording, infrastructure inspection, and forestry analysis.

BIM integrationAs-built surveysForestry analysisInfrastructure inspectionAsset management

3D Textured Mesh

OBJ / GLB / FBX

A photorealistic 3D model with full colour texture mapped from your drone imagery. Ideal for client presentations, augmented reality deliverables, asset documentation, and embedding in web viewers like Cesium or Sketchfab.

Client presentationsAR/VR walkthroughsAsset documentationHeritage recordingWeb embedding

Contour Lines

GeoJSON / DXF / SHP

Elevation isolines derived from the DSM or DTM at any specified vertical interval — 0.25 m, 0.5 m, 1 m, or custom. Ready to import into AutoCAD, ArcGIS, QGIS, or MicroStation for topographic mapping and civil design.

Topographic mapsCAD importCut/fill calculationsSite planningLand development

The Complete Drone-to-Deliverable Pipeline

Seven stages from mission planning to client-ready outputs — each one handled by mapplot and NodeODM working together.

1
mapplot

Plan Your Mission in mapplot

Draw your survey boundary using mapplot's polygon, rectangle, or corridor tools on the satellite map. Configure altitude (AGL), flight speed, gimbal pitch, front overlap, and side overlap. mapplot generates optimised flight lines and previews photo footprints so you can verify area coverage before committing to a flight. Export the KMZ file directly to your drone controller.

Tips

  • Use 75% front overlap and 70% side overlap as a minimum for mapping
  • Crosshatch (double-grid) patterns improve 3D reconstruction significantly
  • mapplot's photo preview shows exact image positions — verify coverage before flying
2
Field

Fly and Capture Imagery

Execute the planned mission from your drone controller. Fly in consistent, diffuse lighting — overcast days produce the most uniform results. Avoid strong shadows, specular reflections on water, and high winds that cause camera shake. The camera must embed GPS coordinates and altitude in EXIF data — verify this before your first job.

Tips

  • Overcast light produces dramatically better results than midday sun
  • JPEG works well; RAW/TIFF gives better colour fidelity for agriculture and inspection
  • Verify EXIF GPS is enabled in your drone camera settings before flying
3
Prep

Transfer Images to Your Computer

Copy all images from the SD card into a single dedicated folder on your computer. Keep each flight as a separate folder — one folder equals one processing job. Remove any images taken during takeoff, landing, or outside the survey area. More images in the job means longer processing, so only include the ones that matter.

Tips

  • One folder = one processing job — keep flights separate
  • Remove test shots and non-mission imagery before uploading
  • 500 images at 20 MP = approximately 5 GB — plan your storage accordingly
4
Setup

Install Docker and Start NodeODM

NodeODM runs inside a Docker container — a self-contained package that includes the entire OpenDroneMap engine and all its dependencies. Install Docker Desktop first (a one-time step), then start NodeODM with a single command. The first pull downloads approximately 1 GB. After that, starting NodeODM takes under 10 seconds.

Tips

  • Allocate at least 8 GB RAM to Docker in Desktop → Settings → Resources
  • Add --restart unless-stopped so NodeODM starts automatically with Docker
  • Confirm it's running by opening http://localhost:3000/info in your browser
5
mapplot

Upload Images and Configure the Job

In mapplot, navigate to Processing. If NodeODM is not yet connected, you'll be guided through the connection step. Start a new job, name it, upload your images from the folder you prepared, select a quality preset, and enable the output types you need. Click Start — NodeODM handles the rest automatically: feature extraction, sparse reconstruction, dense cloud, and all outputs.

Tips

  • Medium quality is the best starting point for most survey workflows
  • Enable DSM and orthophoto at minimum for standard mapping deliverables
  • You can close the browser — jobs continue running, and mapplot notifies you on completion
6
Processing

Monitor Processing Progress

Processing runs entirely on your machine with no cloud involvement. mapplot polls NodeODM every 15 seconds for live progress updates and displays a progress bar per job. A 300-image survey at medium quality on a modern 8-core CPU typically finishes in 30–60 minutes. GPU acceleration can reduce this by 3–5×. Multiple jobs queue automatically.

Tips

  • An NVIDIA GPU with CUDA cuts processing time by 3–5× — see GPU setup below
  • High quality roughly doubles the processing time compared to Medium
  • Run a Lowest quality test first to catch alignment issues before committing hours
7
Deliver

Download Outputs and Deliver

Once processing completes, download your selected outputs from the mapplot job detail panel. Load orthomosaics into QGIS or ArcGIS for measurement and analysis, import point clouds into CloudCompare or Autodesk ReCap, and share 3D meshes via Sketchfab or the mapplot client portal. Every byte of data stayed on your hardware throughout the entire process.

Tips

  • GeoTIFF opens natively in QGIS, ArcGIS, Global Mapper, and Pix4D
  • LAZ is compressed LAS — smaller file size, requires Laszip library to decompress
  • Use Potree or Cesium for web-based point cloud delivery to clients
Requirements

System Requirements for Local Processing

NodeODM runs on any modern computer capable of running Docker Desktop. RAM is the most important factor — more is always better for large datasets.

Operating System
Windows 10 / 11, macOS 12 (Monterey)+, Ubuntu 20.04 / 22.04
RAM
8 GB minimum · 16 GB recommended · 32 GB+ for large datasets (1,000+ images)· Most important factor for large jobs
CPU
Any modern multi-core processor. NodeODM scales linearly — more cores = faster reconstruction
GPU (optional)
NVIDIA GPU with CUDA support significantly accelerates processing. AMD support is limited.· Not required but strongly recommended for regular use
Storage
Allocate at least 10× your raw image size for temp files, outputs, and the Docker image· NodeODM image is ~1 GB; temp files can be large
Docker
Docker Desktop 4.x or later — free for personal use. WSL2 backend required on Windows
Network
Local only after initial Docker pull (~1 GB). Processing is fully offline-capable
Docker Desktop is free for personal use. Review Docker's subscription terms for commercial and enterprise use cases.
Setup Guide

Install and Run NodeODM with Docker

Three steps from a clean machine to a running NodeODM instance. The entire setup takes under 15 minutes including the Docker image download.

1

Install Docker Desktop

Docker Desktop is available for Windows, macOS, and Linux. Download the installer for your OS, run it, and start Docker Desktop. Wait for the engine to fully initialise — the whale icon in your system tray turns steady (not animated) when it's ready.

Download Docker Desktop
Important: In Docker Desktop → Settings → Resources, increase Memory to at least 8 GB (16 GB recommended). The default 2 GB allocation will cause processing to fail on any meaningful dataset.
2

Pull and Start NodeODM

Option A — Standalone (recommended for most users)

docker run -d -p 3000:3000 --name nodeodm --restart unless-stopped opendronemap/nodeodm

The first run pulls the NodeODM image (~1 GB). Subsequent starts take under 10 seconds. The --restart unless-stopped flag makes NodeODM start automatically whenever Docker starts.

Option B — With mapplot docker-compose (if you have the repo)

docker compose up -d

Starts all mapplot services including NodeODM in one command from the project root directory.

Verify NodeODM is running

curl http://localhost:3000/info

You should see a JSON response like {"version":"x.x.x","taskQueueCount":0}. You can also open http://localhost:3000 directly in a browser.

3

Connect NodeODM to mapplot

In mapplot, navigate to Processing. If NodeODM is not yet connected, the setup screen will guide you through it. Enter http://localhost:3000 (or your server's address), click Test Connection, and mapplot will verify and save your URL automatically. You're ready to process.

Open Processing

Enable GPU Acceleration (NVIDIA)

Optional but recommended

An NVIDIA GPU can reduce processing time by 3–5×. GPU support requires the NVIDIA Container Toolkit on Linux, or WSL2 with CUDA on Windows. AMD GPUs are not currently supported in Docker.

Install NVIDIA Container Toolkit (Ubuntu/Debian):

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list && sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit && sudo nvidia-ctk runtime configure --runtime=docker && sudo systemctl restart docker

Start NodeODM with GPU passthrough:

docker run -d -p 3000:3000 --name nodeodm --gpus all --restart unless-stopped opendronemap/nodeodm

Windows users: see the NVIDIA WSL2 CUDA guide for enabling GPU passthrough through WSL2. Requires Windows 11 or Windows 10 21H2+.

Configuration

Processing Quality Presets Explained

NodeODM offers five quality presets that trade processing time against output resolution and reconstruction accuracy. Medium is the right starting point for the majority of drone survey work.

Lowest

< 10 min
GSD: Very low

Verify alignment before committing to a full run. Catch coverage gaps fast.

Low

10–25 min
GSD: Low

Quick site overview and proof-of-concept deliverables where fine detail isn't needed.

Recommended

Medium

30–90 min
GSD: Good

Standard mapping, construction monitoring, and most client deliverables. Start here.

High

1–4 hrs
GSD: High

Survey-grade orthomosaics and engineering datasets where GSD and accuracy are critical.

Ultra

3–8+ hrs
GSD: Maximum

Heritage recording, detailed inspection reports, and research requiring maximum fidelity.

Pro tip: Always run a Lowest quality test first on a new dataset. If the reconstruction succeeds, proceed with Medium or High. This saves hours on jobs that would otherwise fail silently mid-way through a High quality run.
GPU note: GPU acceleration primarily benefits feature extraction and dense point cloud generation. Orthophoto rendering and mesh generation are largely CPU-bound. Total speedup depends on dataset size and GPU capability.
Links & Resources

Documentation, Tools, and Community

Everything you need to go further — official docs, output viewers, the OpenDroneMap community, and specialist tools for working with your processed data.

FAQ

Frequently Asked Questions

Common questions about NodeODM setup, processing performance, hardware requirements, image quality, and workflow integration.

How long does NodeODM take to process drone images?

Processing time depends on image count, quality preset, and hardware. A 200-image dataset at Medium quality typically finishes in 30–45 minutes on a modern 6-core CPU. High quality with 500 images can take several hours. An NVIDIA GPU reduces time by 3–5×. NodeODM scales near-linearly with CPU cores — a 16-core machine processes the same job in roughly half the time of an 8-core machine.

How many images can NodeODM process in a single job?

There is no hard limit. Consumer hardware handles 200–1,000 images comfortably on Medium quality. Datasets above 2,000 images benefit from 32 GB+ RAM and a capable GPU. For very large survey areas, split missions into sub-areas using mapplot's drawing tools — process each as a separate job, then mosaic the results in QGIS using the Merge Rasters tool.

Do I need a GPU to use NodeODM?

A GPU is not required — NodeODM processes entirely on CPU with no degradation in output quality. However, an NVIDIA GPU with CUDA support significantly accelerates feature extraction and dense point cloud generation (the two most time-consuming stages). AMD GPUs have limited Docker support. If you process drone images more than a few times a week, an NVIDIA RTX 3060 or better is a worthwhile investment.

What image overlap do I need for a successful reconstruction?

OpenDroneMap recommends a minimum of 70% front (along-track) overlap and 60% side (across-track) overlap for 2D mapping. For reliable 3D reconstruction, use 80%/70% or more. mapplot calculates and previews photo footprints at any overlap setting before you fly. Insufficient overlap is the most common cause of failed or partial reconstructions — when uncertain, fly with more overlap.

What image formats does NodeODM accept?

NodeODM accepts JPEG and TIFF. Most consumer drone cameras output JPEG, which works well for photogrammetry. For maximum radiometric depth — particularly useful for NDVI analysis or precise colour correction — shoot RAW and convert to 16-bit TIFF before processing. Every image must contain GPS coordinates in its EXIF metadata; without GPS, NodeODM cannot georeference any outputs.

Can I run NodeODM on a dedicated server or NAS?

Yes. NodeODM is a REST API and runs anywhere Docker runs — on a local Linux server, high-spec NAS (Synology, QNAP), cloud VM (AWS, GCP, Azure), or a Raspberry Pi (very slow). In mapplot, you can point the NodeODM URL to any IP address on your local network, allowing one powerful machine to serve multiple users. For remote access, expose port 3000 securely with a reverse proxy.

What's the difference between NodeODM and WebODM?

NodeODM is the headless REST API server — it receives image uploads, runs the ODM engine, and serves outputs. It has no graphical interface. WebODM is an open-source web application built on top of NodeODM that adds a GUI, project management, and team collaboration features. mapplot connects directly to NodeODM, so you get full processing power integrated into your mapplot workflow without needing a separate WebODM installation.

How do I update NodeODM to the latest version?

Stop the running container, pull the latest image, and restart: docker stop nodeodm && docker rm nodeodm && docker pull opendronemap/nodeodm && then run your start command again. If you use docker compose, run docker compose pull followed by docker compose up -d. Updates typically bring improved algorithms, bug fixes, and new output options.

Can NodeODM process multispectral drone imagery?

Yes. NodeODM processes multispectral imagery from cameras including MicaSense RedEdge-MX, Parrot Sequoia, DJI Multispectral, and Sentera. It produces NDVI, NDRE, VARI, and other vegetation index outputs. Accurate radiometric results require calibration panel images captured before and after each flight. The processing workflow is identical — upload your images and select the relevant output options.

What should I do if processing fails or produces poor results?

Check the job log in mapplot for error messages — most failures have a clear cause. Common issues: insufficient image overlap (reconstruction fails to close), missing GPS EXIF tags (no georeferencing), insufficient RAM (process killed mid-job), or Docker not running when the job is submitted. For poor but completed results, run at a higher quality preset or add Ground Control Points (GCPs). The OpenDroneMap community forum is an excellent resource for diagnosing unusual errors.

What are Ground Control Points and do I need them?

Ground Control Points (GCPs) are physical targets placed on the ground and measured with a GNSS receiver (GPS or RTK). Including GCPs in your processing job improves absolute accuracy from 1–3 m (GPS-only drone) to centimetre level. They are required for survey-grade deliverables and engineering applications. mapplot's GCP module helps you place and export GCP coordinates. NodeODM accepts GCP files in the standard format during processing.

Can I automate NodeODM processing with scripts or CI pipelines?

Yes — NodeODM exposes a clean REST API at localhost:3000. You can POST images, poll for status, and download outputs programmatically. The NodeODM API documentation on GitHub documents every endpoint. mapplot's processing pipeline uses this API internally. For automation, you can also use the official nodeodm npm package or the Python client library.

Can't find what you're looking for?

The OpenDroneMap community forum is active and welcoming — most questions are answered within hours. For mapplot-specific issues, contact our support team.

Troubleshooting

Common Issues and Fixes

The most frequently encountered problems when setting up and running NodeODM — and exactly how to solve them.

Processing fails immediately with "out of memory" error

Cause

Docker RAM allocation too low — the default 2 GB is insufficient for any meaningful dataset.

Fix

Open Docker Desktop → Settings → Resources → Memory. Increase to at least 8 GB (16 GB recommended). Apply and restart Docker.

Job fails with "could not find enough matches" or SfM reconstruction fails

Cause

Insufficient image overlap — too few matching features between adjacent frames.

Fix

Re-fly with 75% front and 70% side overlap minimum. Ensure the area has surface texture — glass facades, water, and uniform sand all cause matching failures regardless of overlap.

Outputs not georeferenced — coordinates appear in the ocean or at 0,0

Cause

Images are missing GPS EXIF data — the most common silent processing failure.

Fix

Enable GPS logging in your drone camera settings before flying. Verify with ExifTool: exiftool -GPSLatitude image.jpg. Images without GPS cannot be georeferenced without GCPs.

NodeODM container fails to start — "port is already allocated" error

Cause

Another service is already bound to port 3000 on your machine.

Fix

Use a different host port: docker run -d -p 3001:3000 --name nodeodm opendronemap/nodeodm. Then update mapplot to connect to http://localhost:3001.

Orthomosaic has visible seams, colour banding, or blurry patches

Cause

Inconsistent lighting between images, or insufficient overlap in the affected area.

Fix

Fly in consistent overcast light. Avoid midday sun with hard shadows. Reduce flight speed to minimise motion blur. Check mapplot's photo preview for coverage gaps.

Processing is much slower than expected — taking many hours on a small dataset

Cause

CPU-only processing with restrictive Docker resource limits, or wrong quality preset selected.

Fix

Check Docker Desktop → Resources — ensure NodeODM can use all CPU cores. Switch from High/Ultra to Medium for faster validation. An NVIDIA GPU reduces time by 3–5×.

mapplot shows "connection failed" — cannot reach NodeODM

Cause

NodeODM container has stopped, wrong port, or Windows Firewall blocking localhost.

Fix

Run docker ps to check if nodeodm is in "Up" state. If stopped: docker start nodeodm. Verify the port in mapplot matches your NodeODM start command. On Windows, check Defender Firewall is not blocking port 3000.

Still stuck? The OpenDroneMap community forum has searchable solutions to hundreds of real processing issues. Include your job log for the fastest diagnosis.
Ready to start?

Set up NodeODM in 10 minutes.
Process your first dataset today.

mapplot handles the job management, progress tracking, and output downloads. You provide the drone images — NodeODM does the rest, on your own hardware.

No credit card required · Free plan includes 3 projects · Cancel anytime