arcgis
A type-safe Rust SDK for the ArcGIS REST API with compile-time guarantees.
Current Status: 113 operations across 12 services (65% API coverage, 80% use case coverage)
Features
Core Capabilities
- ๐ Type-safe: Strong typing with enums instead of strings - invalid states are unrepresentable
- ๐ GeoRust integration: Native support for
geo-typesand the GeoRust ecosystem - ๐ Authentication: API Key and OAuth 2.0 Client Credentials (fully automated, no browser required)
- โก Async/await: Built on
tokioandreqwestfor async operations - ๐ Auto-pagination: Transparent handling of large result sets
- ๐ฆ Zero unsafe code: Memory-safe by default
- ๐งช Well-tested: Comprehensive test coverage with integration tests
Supported Operations
Feature Management (Feature Service):
- Query with advanced parameters (spatial, attribute, statistics, grouping)
- CRUD operations (add, update, delete, batch edits)
- Attachment management (upload, download, delete)
- Relationship queries, top features, field calculations
- Domain queries, truncate operations
Mapping (Map Service):
- Export maps with custom extent, layers, format
- Legend retrieval, identify operations
- Text search (find), KML generation
- Dynamic renderer generation
Geocoding (Geocode Service):
- Forward geocoding (single and batch)
- Reverse geocoding with filtering
- Autocomplete suggestions with categories
- Spatial reference customization
Geometry Operations (Geometry Service):
- Coordinate projection and transformations
- Buffer, union, simplify operations
- Distance and area calculations
- Datum transformation discovery
Network Analysis (Routing Service):
- Route solving (optimal paths between stops)
- Service area generation (drive-time polygons)
- Closest facility analysis
- Origin-destination cost matrices
Geoprocessing:
- Synchronous and asynchronous execution
- Job status polling with exponential backoff
- Result retrieval and message handling
Portal & Content Management:
- User and item CRUD operations
- Search with advanced queries
- Sharing and group management
- Service publishing and updates
Imagery (Image Service):
- Image export with rendering rules
- Pixel value identification and sampling
- Histogram computation
- Raster metadata retrieval
3D & Tiles:
- Vector tile retrieval (MVT format)
- Style and font management
- Sprite sheet access
Versioned Workflows (Version Management):
- Edit and read sessions
- Version creation and management
- Reconciliation and posting
- Conflict detection and resolution
Location Services:
- Elevation profiles and terrain analysis
- Viewshed computation
- POI search with categories
Quick Start
1. Add Dependency
Add to your Cargo.toml:
[]
= "0.1"
= { = "1", = ["full"] }
2. Set Up Credentials
Create a .env file in your project root (automatically loaded by the SDK):
Add your credentials to .env:
ARCGIS_API_KEY=your_api_key_here
Important: Add .env to your .gitignore to keep credentials out of version control!
Get your API key from the ArcGIS Developer Dashboard.
3. Query Features
use ;
async
Auto-Pagination
For large datasets, use execute_all() to automatically paginate:
// Retrieve all features matching the query (may make multiple requests)
let all_features = service
.query
.where_clause
.execute_all // Automatically handles pagination
.await?;
println!;
Type Safety Example
Instead of error-prone strings:
// โ Runtime errors waiting to happen
params.geometry_type = "esriGeometryPolyline"; // Typo? No compile error!
params.spatial_rel = "esriSpatialRelIntersect"; // Missing 's'? No compile error!
Use strongly-typed enums:
// โ
Compile-time guarantees
use ;
params.geometry_type = Polyline; // Autocomplete works!
params.spatial_rel = Intersects; // Typos = compile errors!
Authentication
The SDK automatically loads credentials from a .env file when you create a client. This keeps your API keys and secrets out of your code and version control.
API Key (Simplest)
Best for development, testing, and simple applications:
use ;
// Load API key from environment (.env automatically loaded)
let api_key = var
.expect;
let auth = new;
let client = new;
OAuth 2.0 Client Credentials (Recommended for Production)
Fully automated server-to-server authentication - no browser or user interaction required:
use ;
async
Key features:
- Fully automated - no browser interaction
- Automatic token refresh before expiration
- Perfect for servers, CLI tools, and CI/CD
- Short-lived tokens (2 hours) for better security
See examples/client_credentials_flow.rs for a complete example.
Examples
See the examples/ directory for complete examples:
basic_client.rs- Basic client setup and usageclient_credentials_flow.rs- OAuth 2.0 automated authentication
Run an example:
Testing
Unit Tests
Run unit tests (no credentials required):
Integration Tests
Integration tests require ArcGIS credentials and the api feature flag.
-
Set up credentials:
# Edit .env and add your ARCGIS_API_KEY or ARCGIS_CLIENT_ID/ARCGIS_CLIENT_SECRET -
Run integration tests:
# Run all API tests (be patient, includes rate limiting) # Or use the justfile recipe # Run specific test
See tests/README.md for more details.
GeoRust Integration
All geometries use the GeoRust ecosystem via geo-types. ArcGIS geometries are automatically converted when querying features:
use ;
// Query features - geometries are returned as geo-types
let features = service
.query
.return_geometry
.execute
.await?;
// Work with native geo-types
for feature in features.features
Design Philosophy
This SDK prioritizes type safety and correctness:
- No stringly-typed APIs: Every enumerated value in the ArcGIS API is represented as a Rust enum
- Newtype pattern: IDs are wrapped in newtypes (e.g.,
LayerId,ObjectId) to prevent mixing - Validated construction: Invalid states are prevented at compile time
- Leverage existing crates: Uses
oauth2, GeoRust,reqwest, andtokioinstead of reinventing
See ARCGIS_REST_API_RESEARCH.md for the full design rationale.
Minimum Supported Rust Version (MSRV)
This crate requires Rust 1.75 or later.
Contributing
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
Development Setup
# Clone the repository
# Build the project
# Run tests
# Run tests with all features
# Check formatting
# Run clippy
Implemented Services
12 Services, 113 Operations (Baseline - 65% coverage):
| Service | Operations | Status |
|---|---|---|
| Elevation | 3 | โ Complete |
| Feature | 17 | โ Complete (queries, edits, attachments, admin) |
| Geocode | 9 | โ Complete (forward, reverse, batch, suggest) |
| Geometry | 8 | โ Core Complete (project, buffer, union, measure) |
| Geoprocessing | 7 | โ Complete (sync/async execution, polling) |
| Image | 6 | โ Core Complete (export, identify, samples, histograms) |
| Map | 10 | โ Complete (export, legend, identify, KML, renderer) |
| Places | 3 | โ Complete (search, details, categories) |
| Portal | 24 | โ Core Complete (users, items, sharing, publishing, groups) |
| Routing | 4 | โ Complete (route, service area, closest facility, OD matrix) |
| Vector Tile | 6 | โ Core Complete (tiles, style, fonts, sprites) |
| Version Management | 16 | โ Complete (sessions, CRUD, reconcile, conflicts) |
See COVERAGE_ROADMAP.md for the path to full coverage.
Roadmap to Full Coverage
Bronze (Phase 1 - 70% coverage):
- Complete existing services (+20 ops)
- Image/Portal/Feature extensions
Silver (Phase 2 - 75% coverage):
- Scene Service (3D visualization)
- Stream Service (real-time WebSocket)
- Utility Network Service
- GeoEnrichment Service
Gold (Phase 3 - 80% coverage):
- Network Diagram
- Parcel Fabric
- Printing Service
Platinum (Full Coverage - 80-85% coverage):
- All Tier 1-3 services complete
- 183-200 total operations
- 95%+ use case coverage
Documentation
- API Documentation
- Coverage Roadmap - Path to full API coverage
- ArcGIS REST API Reference
- Research Document
Related Projects
- GeoRust - Geospatial primitives and algorithms for Rust
- arcgis-rest-js - Official JavaScript wrapper (reference implementation)
License
Licensed under either of:
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Disclaimer
This is an unofficial community-driven project and is not officially supported by Esri. For official Esri SDKs, see ArcGIS Developer Documentation.