geodata
Health Pass
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Community trust — 36 GitHub stars
Code Warn
- process.env — Environment variable access in mcp/index.js
Permissions Pass
- Permissions — No dangerous permissions requested
No AI report is available for this listing yet.
Lightweight open-source visualiser for India admin boundaries — pick a layer, view, download parquet
bharatlas
A visual catalog, REST API, MCP server, drag-drop verifier, and anonymous contribution flow for India's geo data. Admin boundaries from state to village, plus community-submitted layers under open licences.
Live: https://bharatlas.com
- Catalog: India national boundary (LGD-dissolved), plus state · district · subdistrict · block · village (LGD), cross-source alternates (SOI · Bhuvan · geoBoundaries · PMGSY per level, click "also: ..." on any card), city wards across Indian cities, electoral constituencies, wildlife, eco-zones, and 63k pincode polygons (bharatviz).
- Download: whole layer as Parquet · PMTiles · GeoJSON · KML · Shapefile, direct from the card.
- Filter & slice: dynamic facets / range / typeahead search per layer schema; export the slice in any format above.
- Preview: drop GeoJSON · KML · KMZ · GPX · TCX · Parquet, render + validate, optional Publish.
- View (
/view/<id>): curated layer with per-layer OG card. - Community view (
/c/<id>): community submission, edge-rendered HTML, 👍 useful vote, per-submission OG card. - Embed (
/embed/<id>): iframe + PNG export from any map. - API (
/api/v1): REST list, query, filter, group_by any layer; locate (point-in-polygon across all layers); nearby (tile-based spatial proximity). - MCP (
npx bharatlas-mcp): 8 tools for LLMs: list, schema, query, locate, nearby, categories, submissions, downloads.
What's in this repo
web/: Vanilla TypeScript + Vite viewer + Cloudflare Pages Functions (web/functions/).web/migrations/: D1 SQL migrations: submissions, tokens, ratings, votes, originals.web/tests/: vitest unit tests for pure functions (validators, tokens, view rendering, votes).scripts/fetch.sh: Pulls parquets + PMTiles from yashveeeeeeer/india-geodata releases.scripts/extract_per_state.py: Slices pan-India parquets into per-state GeoJSON via DuckDB-spatial.scripts/bake_whole_layer.py: Bakes whole-layer GeoJSON / KML / Shapefile per curated layer (parquet ≤ 100 MB).scripts/upload_r2.sh: Mirrorssources/+data/to Cloudflare R2 via wrangler.scripts/upload_baked.py: Pushesdata/baked/*to R2 via boto3 (S3-compat fallback when wrangler is unavailable).scripts/admin/cleanup_submission.sh: Delete community submissions by name pattern (R2 + D1).mcp/: MCP server for LLMs (npm). 8 tools: list, schema, query, locate, nearby, categories, submissions, downloads.catalog.json: Curated-layer index used by the viewer. Single source of truth.- /about#caveats: Data caveats (cross-source drift, coverage gaps, precision).
Large data files (sources/, data/) are not in git — they live in R2. See scripts/fetch.sh to rebuild locally.
Stack
- Frontend: Vanilla TypeScript, Vite, MapLibre GL JS, PMTiles, DuckDB-WASM (lazy)
- Static hosting: Cloudflare Pages
- Edge functions: Cloudflare Pages Functions (
web/functions/), running REST API v1, submit, vote, sitemap, edge-rendered/c/<id> - Parquet query: hyparquet (pure JS, runtime reads from R2)
- Spatial query: PMTiles tile reads + MVT decode + ray-casting PIP / Haversine proximity
- MCP server:
bharatlas-mcp, 8 tools for Claude, GPT, Gemini, Cursor, etc. - Storage: Cloudflare R2 (open data, no egress)
- Submissions DB: Cloudflare D1 (SQLite at the edge)
- Anti-abuse: Cloudflare Turnstile + per-IP rate limits
- CI/CD: GitHub Actions, running tests + build + auto-deploy on push to
main
Develop
# clone + viewer-only dev (no submissions, no D1)
git clone [email protected]:urbanmorph/geodata.git
cd geodata/web
npm install
npm run dev # http://localhost:5173
npm test
For the full submission flow (D1 + R2 + Turnstile + Pages Functions), read wrangler.toml + .dev.vars.example.
API in 30 seconds
REST: https://bharatlas.com/api/v1 — no API key, rate-limited per IP. Full docs at bharatlas.com/docs.
# list every catalog layer (curated + accepted community)
curl 'https://bharatlas.com/api/v1/layers'
# inspect a layer's schema before querying
curl 'https://bharatlas.com/api/v1/layers/lgd_districts/schema'
# filter + group: how many districts per state?
curl 'https://bharatlas.com/api/v1/layers/lgd_districts/query?group_by=stname'
# point-in-polygon: every admin boundary at (lat, lng)
curl 'https://bharatlas.com/api/v1/locate?lat=12.9716&lng=77.5946'
# nearest features within a radius
curl 'https://bharatlas.com/api/v1/nearby?lat=12.9716&lng=77.5946&layer=nic_health&radius_km=10'
MCP for LLMs (Claude, GPT, Gemini, Cursor): one-line install, 8 tools. Setup at bharatlas.com/mcp.
# Claude Code
claude mcp add bharatlas npx bharatlas-mcp
# Claude Desktop / other clients (claude_desktop_config.json)
{ "mcpServers": { "bharatlas": { "command": "npx", "args": ["bharatlas-mcp"] } } }
Contributing
- Branch off
main:git checkout -b feat/short-name - Write a test first if you're adding logic to
web/functions/lib/*. Pure functions are tested via vitest inweb/tests/. - Make sure
npm testandnpm run buildboth pass. - Open a PR against
main. CI runs tests + build automatically. - The maintainer reviews and merges. Merge to main = auto-deploy.
Commit messages: short subject, body explains why not what. Examples in git log.
Security
Report vulnerabilities to [email protected] instead of opening a public issue. Acknowledgement within 72 hours.
Licence
Code: MIT. Data: each layer carries its own open licence — see the per-card line on the catalog. Curated data is sourced under CC0-1.0 / CC-BY-4.0 / GODL-India depending on provider.
Use of data
Provided as-is, no warranty. For legal/administrative use, go to the upstream source. Full disclaimers: /about → Use of data.
Credits
Data sources, in approximate order of catalog footprint:
- LGD — Local Government Directory; the authoritative admin code chain (state → village).
- SOI — Survey of India; admin alternatives.
- Bhuvan — NRSC/ISRO Bhuvan; admin alternatives, eco-sensitive zones.
- OpenCity / Oorvani Foundation — city-scale layers (ward / corporation / jurisdiction polygons for 20+ cities).
- DataMeet — community-curated municipal spatial data (ward boundaries for multiple cities).
- datta07/INDIAN-SHAPEFILES — metropolitan city ward shapefiles.
- ramSeraph/indianopenmaps — selectively republished layers (WRIS waterbodies, SLUSI watersheds + soil, VEDAS power infrastructure, PMGSY roads + habitations).
- CoRE Stack: republished water and agriculture layers, namely CGWB aquifers and groundwater extraction, WRIS canals, ICAR-NBSS agro-ecological zones, Planning Commission agro-climatic zones, and Wildlife Institute of India biogeographic zones.
- PMGSY — Pradhan Mantri Gram Sadak Yojana; rural blocks + roads.
- PM GatiShakti — wildlife sanctuaries + national parks.
- Bharatmaps (NIC) — eco-sensitive zones.
- bharatviz (Saket Choudhary, MIT) — India Post pincode boundary polygons (simplified).
- geoBoundaries — independent cross-check.
- data.gov.in — additional government open data.
Pipelines + patterns:
- yashveeeeeeer/india-geodata — upstream Parquet + PMTiles re-publisher for LGD, SOI, Bhuvan, PMGSY, GatiShakti, Bharatmaps, CWC, NIC-Health and the India Flood Inventory.
- ramSeraph — architectural guidance on geoparquet for spatial queries (issue #100). Hilbert sort + flat bbox cols + density-aware row groups in our /api/v1/nearby came directly from this review.
- mdshare — the anonymous-token contribution pattern lineage.
Built by Urban Morph · Sathya Sankaran. Drop a ⭐ if you find it useful.
Status: v1.0. Curated layers, community submissions, REST API, MCP server ( npm), dynamic filters with typeahead, whole-layer downloads in 5 formats. API docs at /docs, MCP setup at /mcp. Community submissions are permanent under the open licence the contributor selected.
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found
