Self-hosted geospatial data catalog with semantic search (pgvector), OGC/STAC APIs, and map builder. Built on FastAPI, PostGIS, React, and MapLibre.
- ✓Open-source license (Apache-2.0)
- ✓Actively maintained (<30d)
- ✓Healthy fork ratio
- ✓Clear description
- ✓Topics declared
- ✓Documented (README)
- !Install pipes a remote script into a shell (curl | sh)
git clone https://github.com/geolens-io/geolensResumen de Tools
# GeoLens [English](README.md) | [Español](README.es.md) | [Français](README.fr.md) | [Deutsch](README.de.md) **Your team's self-hosted spatial data hub: searchable, mappable, and shareable in one place.** GeoLens is an open-source spatial data hub for GIS and data teams: one place to find and work with data on infrastructure you control, with no telemetry. GeoLens itself phones home to nothing. (Features you opt into can make outbound calls: AI assist to your chosen OpenAI-compatible endpoint or Anthropic key, OAuth/OIDC sign-in, SMTP, basemap tiles, remote/S3 data sources, and off-site backups.) Upload files, create datasets in the browser, register tables already in GeoLens's own PostGIS database without copying them, import one-shot copies from WFS, ArcGIS FeatureServer, or OGC API Features, or reference remote STAC assets live. GeoLens records each dataset's origin, indexes catalog metadata with pg_trgm for fuzzy search out of the box (pgvector adds semantic ranking once you configure an embedding provider and enable semantic search), and serves OGC/STAC APIs that QGIS, ArcGIS, and MapLibre clients connect to natively. Compose, style, and share multi-layer maps right in the browser. Built on FastAPI and React. Deployed with one command. <p align="center"> <a href="https://demo.getgeolens.com"><img src="https://img.shields.io/badge/%E2%96%B6%20Try%20the%20live%20demo-demo.getgeolens.com-2563eb?style=for-the-badge" alt="Try the live demo" /></a> <br /> <sub>No install required. Browse the sample catalog and maps without an account, or sign in with Google, GitHub, or Microsoft to try the map builder. Demo data may be wiped at any time.</sub> </p> [](https://github.com/geolens-io/geolens/actions/workflows/ci.yml) [](LICENSE) [](https://www.python.org/) [](https://postgis.net/) [](https://ogcapi.ogc.org/) ```bash curl -fsSL https://getgeolens.com/install.sh | sh # Open http://localhost:8080, then log in with the credentials you chose ``` <p align="center"> <img src=".github/assets/geolens-manhattan-3d-hero.jpg" alt="GeoLens map builder with Manhattan building footprints extruded into a 3D skyline, colored by construction era, with the subway and the drag-orderable layer stack beside the map" width="900" /> <br /> <em>The map builder: every Manhattan building extruded to its true roof height and colored by the era it was built, the subway threading beneath, built from open data with <code>scripts/seed-showcase.py</code></em> </p> > [!NOTE] > **Early release.** GeoLens is actively developed and maintained, and newly > open-sourced. The self-hosted distribution is young and some features and APIs > may still change. Please > [open an issue](https://github.com/geolens-io/geolens/issues) if you hit a rough edge. ## Documentation Full user, admin, and API documentation lives at **[docs.getgeolens.com](https://docs.getgeolens.com)**. The [Reference](#reference) table below links each guide. ## Published artifacts GeoLens is published through the standard package registries: ```bash pip install geolens # Python SDK pip install geolens-cli # CLI; installs the `geolens` command pip install geolens-mcp # MCP server for coding agents (read-only) npm install @geolens/sdk # TypeScript/JavaScript SDK ``` Prebuilt public API and frontend images are published to GitHub Container Registry: ```bash docker pull ghcr.io/geolens-io/geolens-api:latest docker pull ghcr.io/geolens-io/geolens-frontend:latest ``` The `latest` tag tracks the newest published stable release. ## Why GeoLens? Spatial data ends up scattered: shapefiles on shared drives, tables in database schemas, rasters in cloud buckets, metadata in spreadsheets. Finding the right dataset means asking Slack or grepping file servers. Sharing it means exporting, emailing, and hoping the CRS matches. GeoLens replaces that workflow: - **One data hub:** upload files, create datasets, register tables already in GeoLens's database, import feature-service snapshots, or reference remote STAC assets — then search and preview them together - **Source state, not guesswork:** see how each dataset entered the catalog, when it was last refreshed or checked, how its last refresh compares with its declared cadence (fresh, due, overdue, or unknown), and whether a remote Service or STAC origin is still reachable - **Works with your tools:** OGC API Features/Records, STAC API 1.0, direct tile URLs for QGIS, ArcGIS, and MapLibre - **No lock-in:** your catalog and the copies GeoLens manages stay on infrastructure you control and leave through open formats. Vector datasets export to GeoPackage, GeoJSON, Shapefile, CSV, or GeoParquet; rasters download as Cloud-Optimized GeoTIFF; and any OGC API client reads the catalog directly - **Semantic and spatial search:** pg_trgm fuzzy matching out of the box; add an embedding provider and enable semantic search to rank datasets by meaning (pgvector) - **Built-in map builder:** compose multi-layer maps, style them, and share via public link or embeddable iframe - **AI-assisted (optional):** chat with your maps, auto-generate descriptions, search by natural language. Bring an OpenAI-compatible endpoint or Anthropic key, or skip it entirely ## See it in action The examples below use a JWT bearer token. Mint one against the local stack (the login endpoint accepts an OAuth2 password form, so use `-d` with form fields, not JSON). Substitute your admin username and the password from `.env` (`grep '^GEOLENS_ADMIN_PASSWORD=' .env`): ```bash TOKEN=$(curl -s -X POST http://localhost:8080/api/auth/login/ \ -d 'username=admin&password=<your-admin-password>' | jq -r '.access_token') ``` Semantic search takes a one-time admin setup: an embedding provider and the AI + Semantic Search toggles in the admin AI settings, plus an embedding backfill for data ingested before setup (the [search guide](https://docs.getgeolens.com/guides/user/search/) walks through it). Once that's on, search datasets by meaning instead of exact keyword matches: ```bash # Semantic search ranks by meaning: "hydrology" surfaces the lake and river # network datasets whose titles never mention the word curl "http://localhost:8080/api/search/datasets/?q=hydrology&limit=3" \ -H "Authorization: Bearer $TOKEN" | jq '.features[].properties.title' ``` One search-endpoint behavior to know when consuming it programmatically: the first page augments the dataset results with up to five matching collections, so `numberReturned` can exceed `limit` on page 0 only. That is deliberate, not a bug — `limit` still bounds the number of *datasets* per page. Every dataset is also a standard OGC API Features endpoint: ```bash # Grab a public collection id from the catalog. Search anonymously (no token) so # the id is one anyone can read, matching the unauthenticated items request below. CID=$(curl -s "http://localhost:8080/api/search/datasets/?q=countries&limit=1" \ | jq -r '.features[0].id') # GeoJSON features with a bbox filter, works in QGIS, ArcGIS, any OGC client curl "http://localhost:8080/api/collections/$CID/items?bbox=-10,35,30,60&limit=5" ``` PostGIS and pgvector share one database, so with semantic search enabled you can rank datasets by meaning *inside* a spatial window in a single query. See the [search guide](https://docs.getgeolens.com/guides/user/search/) for how semantic and spatial search work together. Connect directly from QGIS: **Layer > Add WFS / OGC API Features** and point at `http://localhost:8080/api/`. The same endpoints from the tools you already use: [geolens-examples](https://github.com/geolens-io/geolens-examples) holds single-file MapLibre, Leaflet, OpenLayers and ArcGIS JS pages, QGIS and DuckDB walkthroughs, both GeoLens SDKs, a semantic catalog search, a STAC browser, a saved-map embed, a Python/GeoPandas analysis, a catalog-as-code manifest for the CLI, and an MCP setup. The read-only ones run against the live demo, and CI replays them there on every push and once a week, so what you copy is code that worked this week. [Browse the gallery](https://geolens-io.github.io/geolens-examples/). ## Features Each example above has a full guide in the [docs](https://docs.getgeolens.com/guides/). What GeoLens reads, writes, and exposes: ### Data ingestion and export - **Five source modes:** Uploaded and Created data are managed locally; Register Table serves an existing table in GeoLens's own PostGIS database in place; Service imports are one-shot local copies; STAC datasets keep a live reference to the remote asset - **Vector:** Shapefile, GeoPackage, GeoJSON, GeoParquet, CSV, XLSX - **Raster:** GeoTIFF and Cloud-Optimized GeoTIFF (COG) with automatic conversion - **Mosaics:** VRT-based raster mosaics from multiple source files - **Export:** GeoJSON, Shapefile, GeoPackage, CSV, with CRS reprojection - **Source state:** origin and last-refreshed/last-checked timestamps, cadence-based source freshness, and on-demand health checks for Service and STAC origins - Provenance tracking and metadata editing ### Analysis - **Buffer** (metres, kilometres, feet, or miles), **centroid**, **clip** by a drawn area or by another polygon layer, and **dissolve** with an optional group-by column; **spatial join** and **select by location** match features on intersection, **measure** adds `area_sqm` and `length_m` columns, and **intersect** writes the pairwise overlay with attributes from both sides - All operations preview on the map except dissolve, which is materialize-only; previews are capped
Lo que la gente pregunta sobre geolens
¿Qué es geolens-io/geolens?
+
geolens-io/geolens es tools para el ecosistema de Claude AI. Self-hosted geospatial data catalog with semantic search (pgvector), OGC/STAC APIs, and map builder. Built on FastAPI, PostGIS, React, and MapLibre. Tiene 202 estrellas en GitHub y su última actualización registrada es del 2026-08-24.
¿Cómo se instala geolens?
+
Puedes instalar geolens clonando el repositorio (https://github.com/geolens-io/geolens) o siguiendo las instrucciones del README en GitHub. ClaudeWave también te ofrece bloques de instalación rápida en esta misma página.
¿Es seguro usar geolens-io/geolens?
+
Nuestro agente de seguridad ha analizado geolens-io/geolens y le ha asignado un Trust Score de 97/100 (tier: Verified). Revisa el desglose completo de comprobaciones superadas y flags en esta página.
¿Quién mantiene geolens-io/geolens?
+
geolens-io/geolens es mantenido por geolens-io. La última actividad registrada en GitHub es del 2026-08-24, con 13 issues abiertos.
¿Hay alternativas a geolens?
+
Sí. En ClaudeWave puedes explorar tools similares en /categories/tools, ordenados por popularidad o actividad reciente.
Despliega geolens en tu cloud
Lleva este repo a producción en minutos. Cada plataforma genera su propio entorno con variables de entorno editables.
¿Mantienes este repo? Añade un badge a tu README
Pega el badge en tu README de GitHub para mostrar que está auditado por ClaudeWave. Cada badge enlaza de vuelta a esta página y muestra el Trust Score actual.
[](https://claudewave.com/repo/geolens-io-geolens)<a href="https://claudewave.com/repo/geolens-io-geolens"><img src="https://claudewave.com/api/badge/geolens-io-geolens" alt="Featured on ClaudeWave: geolens-io/geolens" width="320" height="64" /></a>Más Tools
A single CLAUDE.md file to improve Claude Code behavior, derived from Andrej Karpathy's observations on LLM coding pitfalls.
An AI skill that provides design intelligence for building professional UI/UX across multiple platforms.
🪨 why use many token when few token do trick — Claude Code skill that cuts 65% of tokens by talking like caveman
CLI proxy that reduces LLM token consumption by 60-90% on common dev commands. Single Rust binary, zero dependencies
The best-benchmarked open-source AI memory system. And it's free.
The fastest, litest AI Gateway. Rust core with Python SDK. Call 100+ LLM APIs in OpenAI (or native) format with cost tracking, guardrails, load balancing, and logging [Bedrock, Azure, OpenAI, Anthropic, OpenAI, VertexAI, vLLM, Nvidia NIM]