A production-ready, containerized geospatial web platform for CRS detection and reprojection of raster and vector datasets — built with FastAPI, Streamlit, and Docker.
👉 crs.thelila.org — Try it in your browser, no setup required.
GIS analysts and remote sensing engineers frequently work with spatial datasets in mismatched or unknown coordinate systems. Reprojecting files traditionally requires desktop GIS software like QGIS or ArcGIS — which are heavy, slow, and unavailable in server or automated pipeline environments.
Lila CRS Converter solves this with a lightweight, browser-accessible platform where you can:
- Upload any raster or vector geospatial file
- Automatically detect its source CRS
- Select a target EPSG code
- Reproject and download the converted output — all in the browser
| Feature | Description |
|---|---|
| 🔍 Auto CRS Detection | Detects source coordinate system from uploaded file metadata |
| 🔄 Raster Reprojection | Reprojects GeoTIFF files to any EPSG code |
| 🗺️ Vector Reprojection | Reprojects Shapefiles (ZIP), GeoJSON, GeoPackage |
| 📦 Multi-file Shapefile | Upload .shp, .dbf, .prj together or as a ZIP |
| ⚡ High-performance API | FastAPI backend handles large files efficiently |
| 🐳 Fully Containerized | Docker + docker-compose for reproducible environments |
| ✅ CI Tested | GitHub Actions pipeline validates every push |
| 🔒 HTTPS Deployed | Secure HTTPS on a self-hosted VPS server |
- 🛰️ Raster — GeoTIFF (
.tif,.tiff) - 🗺️ Vector — Shapefile (
.zip), GeoJSON (.geojson), GeoPackage (.gpkg)
lila-crs-converter/
│
├── backend/
│ ├── main.py # FastAPI app & API routes
│ ├── crs.py # CRS detection & reprojection engine
│ ├── utils.py # File validation & temp handling
│ └── config.py # App configuration
│
├── frontend/
│ └── app.py # Streamlit web interface
│
├── tests/ # Unit & integration tests
├── .github/ # GitHub Actions CI workflows
├── docker-compose.yml # Multi-container orchestration
├── Dockerfile # Frontend container definition
└── requirements.txt
How it works:
- Streamlit frontend handles file upload and user interaction
- Uploaded file is sent to the FastAPI backend via REST API
- Backend detects CRS using GDAL/pyproj and performs reprojection
- Reprojected file is returned to the user for download
- All services run in isolated Docker containers
git clone https://github.com/Athithiyanmr/Lila-crs-converter.git
cd Lila-crs-converter
docker compose up --buildOpen in browser:
http://localhost:8501
# Install dependencies
pip install -r requirements.txt
# Start FastAPI backend
uvicorn backend.main:app --reload --port 8000
# Start Streamlit frontend (new terminal)
streamlit run frontend/app.pypytest tests/CI runs automatically on every push via GitHub Actions.
Deployed on a self-hosted VPS with:
- Docker containerization
- HTTPS via reverse proxy (Nginx + SSL)
- GitHub Actions CI for automated testing before deploy
| Layer | Technology |
|---|---|
| Backend API | FastAPI |
| Frontend UI | Streamlit |
| Geospatial Engine | GDAL, Rasterio, GeoPandas, pyproj |
| Containerization | Docker, docker-compose |
| CI/CD | GitHub Actions |
| Deployment | Self-hosted VPS, HTTPS |
- NDVI and spectral index computation module
- Batch reprojection for multiple files
- GeoAI integration for automated spatial analysis
- REST API documentation (Swagger UI already built-in via FastAPI)
Athithiyan M R — Geospatial Data Scientist | Remote Sensing | Climate Analytics
MIT License © 2026 Athithiyan M R