by GeoLens (open source) Claude Desktop, Claude Code, OpenCode, Linux, Docker, PostGIS, OpenAI API, Anthropic API, OAuth/OIDC, SMTP, STAC, OGC API, QGIS, ArcGIS, MapLibre
Self-hosted каталог геопространственных данных с семантическим поиском (pgvector), OGC/STAC API и конструктором карт. Построен на FastAPI, PostGIS, React и MapLibre.
MCP-сервер для QGIS Desktop: управление картографическими слоями, геопространственный анализ, SQL-запросы к геоданным и рендеринг карт через …
MCP-сервер для веб-поиска через Exa AI — поисковик, оптимизированный для нейросетей. В отличие от обычных поисковых …
MCP-сервер и движок кодовой аналитики на Zig: структурная индексация, триграммный поиск, граф зависимостей, символы и outline …
MCP-сервер для приватного веб-поиска через SearXNG. Позволяет LLM искать информацию через self-hosted SearXNG без трекеров и …
# требуется Docker Engine 24+ и Docker Compose v2 curl -fsSL https://getgeolens.com/install.sh | sh grep '^GEOLENS_ADMIN_PASSWORD=' geolens/.env # открыть http://localhost:8080 и войти как admin # альтернатива — сборка из исходников вместо загрузки готовых образов: git clone https://github.com/geolens-io/geolens.git cd geolens bash scripts/install.sh grep '^GEOLENS_ADMIN_PASSWORD=' .env docker compose ps
Английский | Испанский | Французский | Немецкий
Самостоятельно размещаемый центр пространственных данных вашей команды: поиск, карты и общий доступ в одном месте.
GeoLens — это открытый центр пространственных данных для GIS-команд и команд по работе с данными: одно место для поиска и работы с данными на инфраструктуре, которую вы контролируете, без телеметрии. Сам GeoLens не отправляет данные никуда. (Функции, которые вы включаете, могут совершать исходящие вызовы: ИИ-помощник к выбранной совместимой с OpenAI конечной точке или ключу Anthropic, вход через OAuth/OIDC, SMTP, тайлы базовых карт, удаленные источники данных/S3, а также резервное копирование вне сайта.) Загружайте файлы, создавайте наборы данных в браузере, регистрируйте таблицы, уже находящиеся в собственной базе данных PostGIS GeoLens, без их копирования, импортируйте разовые копии из WFS, ArcGIS FeatureServer или OGC API Features, или ссылайтесь на удаленные ресурсы STAC в реальном времени. GeoLens записывает происхождение каждого набора данных, индексирует метаданные каталога с помощью pg_trgm для нечеткого поиска из коробки (pgvector добавляет семантическое ранжирование после настройки провайдера эмбеддингов и включения семантического поиска), и предоставляет API OGC/STAC, к которым клиенты QGIS, ArcGIS и MapLibre подключаются нативно. Составляйте, стилизуйте и делитесь многослойными картами прямо в браузере. Построен на FastAPI и React. Развертывается одной командой.
Установка не требуется. Просматривайте образцы каталога и карты без учетной записи или войдите через Google, GitHub или Microsoft, чтобы попробовать конструктор карт. Демо-данные могут быть удалены в любой момент.
curl -fsSL https://getgeolens.com/install.sh | sh
# Open http://localhost:8080, then log in with the credentials you chose
Конструктор карт: каждое здание Манхэттена выдавлено до реальной высоты крыши и окрашено по эпохе постройки, под ними проходит метро, создано из открытых данных с помощью scripts/seed-showcase.py
[!ПРИМЕЧАНИЕ] Ранний выпуск. GeoLens активно разрабатывается и поддерживается, и недавно стал открытым исходным кодом. Самостоятельно размещаемая версия молода, и некоторые функции и API могут еще измениться. Пожалуйста, откройте проблему, если столкнетесь с шероховатостью.
Полная документация для пользователей, администраторов и API находится на docs.getgeolens.com. Таблица Справочник ниже содержит ссылки на каждое руководство.
GeoLens публикуется через стандартные реестры пакетов:
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
Предварительно собранные образы публичного API и фронтенда публикуются в GitHub Container Registry:
docker pull ghcr.io/geolens-io/geolens-api:latest
docker pull ghcr.io/geolens-io/geolens-frontend:latest
Тег latest отслеживает последний опубликованный стабильный выпуск.
Пространственные данные оказываются разбросанными: шейп-файлы на общих дисках, таблицы в схемах баз данных, растры в облачных хранилищах, метаданные в электронных таблицах. Поиск нужного набора данных означает запрос в Slack или поиск по файловым серверам. Обмен данными означает экспорт, отправку по электронной почте и надежду на совпадение CRS.
GeoLens заменяет этот рабочий процесс:
Примеры ниже используют JWT bearer токен. Создайте его для локального стека (endpoint входа принимает форму пароля OAuth2, поэтому используйте -d с полями формы, а не JSON). Подставьте ваше имя администратора и пароль из .env (grep '^GEOLENS_ADMIN_PASSWORD=' .env):
TOKEN=$(curl -s -X POST http://localhost:8080/api/auth/login/ \
-d 'username=admin&password=<your-admin-password>' | jq -r '.access_token')
Семантический поиск требует однократной настройки администратором: провайдер эмбеддингов и переключатели AI + Semantic Search в настройках AI администратора, а также обратное заполнение эмбеддингов для данных, загруженных до настройки (в руководстве по поиску это описано). После включения вы сможете искать наборы данных по смыслу, а не по точному совпадению ключевых слов:
# 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'
Одно поведение search-endpoint, которое нужно знать при программном использовании: первая страница дополняет результаты наборов данных до пяти соответствующих коллекций, поэтому numberReturned может превышать limit только на странице 0. Это сделано намеренно, а не является ошибкой — limit по-прежнему ограничивает количество наборов данных на странице.
Каждый набор данных также является стандартным endpoint OGC API Features:
# 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 и pgvector используют одну базу данных, поэтому при включённом семантическом поиске вы можете ранжировать наборы данных по смыслу внутри пространственного окна в одном запросе. См. руководство по поиску о том, как семантический и пространственный поиск работают вместе.
Подключайтесь напрямую из QGIS: Слой > Добавить WFS / OGC API Features и укажите http://localhost:8080/api/.
Те же endpoints из инструментов, которые вы уже используете: geolens-examples содержит одностраничные примеры для MapLibre, Leaflet, OpenLayers и ArcGIS JS, пошаговые руководства по QGIS и DuckDB, оба GeoLens SDK, семантический поиск по каталогу, STAC-браузер, встраивание сохранённой карты, анализ на Python/GeoPandas, манифест каталога как код для CLI и настройку MCP. Только для чтения примеры запускаются на живом демо, и CI воспроизводит их там при каждом пуше и раз в неделю, так что то, что вы копируете, — это код, который работал на этой неделе. Смотрите галерею.
Каждый пример выше имеет полное руководство в документации. Что GeoLens читает, пишет и предоставляет:
area_sqm и length_m, а пересечение записывает попарное наложение с атрибутами с обеих сторонcols=<column>,<column> к URL тайла, чтобы включить определенные столбцы на каждом уровне масштабирования (имена проверяются по столбцам набора данных, неизвестные имена отбрасываются)Безопасность
Найти: поиск по смыслу. "Самые высокие вершины в Европе" находит модель рельефа Маттерхорна, даже если ни один результат не содержит этих слов, вместе с фильтрами по типу, местоположению и времени
Исследовать: каждый набор данных получает предпросмотр карты, статистику схемы и типизированные метаданные. Здесь — 6000 лет значительных вулканических извержений из NOAA NCEI
Спросите свои данные: задайте вопрос набору данных на естественном языке. «Сколько метеоритов наблюдали падающими, а сколько нашли позже?» возвращается с ответом, подсчетами (1 096 против 31 090) и переходом в конструктор в один клик
Создавайте: составляйте многослойные карты в браузере с перетаскиваемым стеком слоев и редакторами для каждого слоя (здесь: Маттерхорн в виде 3D-сетки рельефа из лидара swissALTI3D)
Ask AI: редактируйте карты на естественном языке. «Подпиши вулканы их названиями» добавляет читаемые подписи на карту Restless Earth (опционально: укажите endpoint, совместимый с OpenAI, или ключ Anthropic)
Управление: встроенная административная панель охватывает живой мониторинг, использование, пользователей, задания, журнал аудита и статус AI — ничего дополнительно разворачивать не нужно
Предварительные требования: Docker Engine 24+ и Docker Compose v2. В комплекте поставляется PostgreSQL 18. Если вы подключаете GeoLens к внешней управляемой базе данных, она должна быть PostgreSQL 13+ (для gen_random_uuid()) с pgvector 0.5+ (для HNSW-индексов семантического поиска), а также PostGIS, pg_trgm и unaccent. API и воркер работают в контейнерах (Python 3.14 в комплекте, Python на хосте не требуется). Опциональный CLI запускается на вашем хосте и требует Python 3.11+; Python SDK и скрипты сидирования требуют Python 3.10+.
Однострочная установка загружает предварительно собранные образы с фиксированными версиями и запускает стек:
curl -fsSL https://getgeolens.com/install.sh | sh
Предпочитаете сначала прочитать скрипт или собрать из исходников? Клонируйте репозиторий и запустите тот же установщик. Он соберёт образы локально вместо загрузки:
git clone https://github.com/geolens-io/geolens.git
cd geolens
bash scripts/install.sh
В любом случае scripts/install.sh копирует .env.example в .env, генерирует секрет для подписи JWT, задаёт учётные данные администратора и выполняет docker compose up -d. Имя пользователя администратора по умолчанию — admin; пароль администратора генерируется автоматически как надёжное случайное значение (записывается в .env, никогда не выводится в терминал), если вы не укажете свой. Для установки без участия оператора задайте GEOLENS_ADMIN_USERNAME и GEOLENS_ADMIN_PASSWORD в переменных окружения перед запуском — тогда запросы будут пропущены. Повторный запуск скрипта идемпотентен: существующие значения в .env сохраняются.
Подождите около 60 секунд, пока сервисы запустятся, затем откройте http://localhost:8080. Войдите с именем администратора и сгенерированным паролем (получите его командой grep '^GEOLENS_ADMIN_PASSWORD=' geolens/.env — однострочный установщик клонирует в geolens/ в каталоге, откуда вы его запустили; внутри исходников это просто .env).
Проверьте, что все сервисы работают:
docker compose ps
Примечания к первому запуску: однострочная установка загружает предварительно собранные образы и поднимается примерно за минуту (локально собирается только небольшой слой базы данных PostGIS + pgvector). Клонирование и запуск bash scripts/install.sh вместо этого собирает все образы из исходников: 5–10 минут при первом запуске (GDAL + расширения Postgres + фронтенд-бандл); последующие запуски занимают ~60 секунд в любом случае. Если порты 5434/8001/8080 уже заняты, измените DB_PORT, API_PORT или FRONTEND_PORT в .env. При конфликтах портов, зависаниях при старте, нехватке памяти и предупреждениях о миграциях обратитесь к руководству по устранению неполадок.
Для продакшн-развёртывания см. Руководство по установке. Поддерживаемый сообществом Kubernetes Helm-чарт находится в отдельном репозитории geolens-deployments.
Каждый релиз GitHub прикрепляет файл SHA256SUMS, сгенерированный CI, вместе с install.sh. Чтобы убедиться, что загруженный установщик не был изменён перед запуском, скачайте оба файла из одного релиза и поместите их в один каталог, затем выполните:
# Linux / Windows WSL
sha256sum -c SHA256SUMS
# macOS
shasum -a 256 -c SHA256SUMS
При успешной проверке выводится install.sh: OK.
Для обновления установки из предварительно собранных образов запустите ./scripts/upgrade.sh из каталога установки. Скрипт создаёт резервную копию базы данных, загружает новые образы и выполняет миграции.
за защитным шлюзом и выводит инструкцию по откату в случае ошибок. См.
UPGRADING.md для готовых сборок и сборок из исходников, а также отката, или онлайн-руководство по обновлению.
В репозитории есть небольшой файл city-parks.geojson. Загрузите и опубликуйте его одной командой с помощью CLI GeoLens:
pip install geolens-cli # installs the `geolens` command
geolens login http://localhost:8080/api # use your admin username + password
geolens publish examples/manifests/first-catalog/city-parks.geojson --name "City Parks"
geolens publish выполняет процесс загрузки → предпросмотра → фиксации и выводит URL нового набора данных. Одна команда превращает локальный файл в опубликованный картографический набор данных.
Для повторяемых каталогов с несколькими наборами данных опишите источники в манифесте (geolens.yaml) и примените его с помощью geolens apply. Источники в манифесте задаются по HTTP(S) URL, S3 URI или пути, уже размещенному на сервере; примеры в examples/manifests/ — это шаблоны для адаптации. Создайте новый с помощью geolens init и отредактируйте под свои источники:
geolens init # writes geolens.yaml in the current directory
geolens validate geolens.yaml # local schema check, no API call
geolens apply geolens.yaml # validates + applies via /ingest/manifest/apply
Полную схему манифеста, типы источников и примеры интеграции с CI см. в руководстве по CLI.
scripts/seed-showcase.py создает семь демонстрационных карт из открытых данных: глобальную историю тектоники на реальном рельефе океанского дна, 3D-панораму Манхэттена, окрашенную по эпохам строительства (главное изображение выше), траектории атлантических ураганов с 1950 года, кластеризованные падения метеоритов, 3D-рельеф Маттерхорна по данным лидара с разрешением 2 м, спутниковые снимки Sentinel-2 Нью-Йорка по ссылке и карту подверженности ураганам, вычисленную на месте из траекторий штормов с помощью буферизации, пересечения и растворения:
pip install httpx
python scripts/seed-showcase.py --username admin --password "$(grep '^GEOLENS_ADMIN_PASSWORD=' .env | cut -d= -f2-)"
Требуется доступ в интернет к исходным открытым данным. Описание флагов (--no-terrain, --prune, …) см. в scripts/README.md.
GeoLens — это небольшой набор сервисов вокруг единой базы данных PostgreSQL/PostGIS: API обслуживает каталог, поиск и конечные точки OGC/STAC; воркер обрабатывает загрузку данных; Titiler обслуживает растровые тайлы из объектного хранилища.
flowchart TB
B["Browser: React + MapLibre app"]
OGC["QGIS · ArcGIS · OGC/STAC clients"]
NG["Nginx reverse proxy<br/>serves the React build, routes /api and tiles"]
subgraph Application
API["FastAPI<br/>catalog · semantic search · OGC/STAC · vector tiles"]
W["Worker<br/>GDAL/ogr2ogr ingestion"]
TT["Titiler<br/>COG raster tiles"]
end
subgraph store [Data and storage]
PG[("PostgreSQL 18<br/>PostGIS · pgvector · pg_trgm<br/>+ Procrastinate queue")]
OBJ[("Object storage<br/>local files or S3/MinIO")]
CACHE[("Valkey cache")]
end
B --> NG
OGC --> NG
NG --> API
NG --> TT
API <--> PG
API --> OBJ
API -. tile/query cache .-> CACHE
PG == job ==> W
W --> PG
W --> OBJ
TT --> OBJ
| Компонент | Технология |
|---|---|
| Фронтенд | React 19, Vite, MapLibre GL v5, TanStack Query, Tailwind CSS |
| Backend API | FastAPI (Python), GDAL/ogr2ogr, Procrastinate (очередь задач) |
| Растровые тайлы | Titiler (COG tile server) |
| Объектное хранилище | MinIO (S3-совместимое, локальная разработка) или любой S3-провайдер |
| Кэш | Valkey (кэш тайлов и запросов) |
| База данных | PostgreSQL 18 + PostGIS 3.6 + pgvector + pg_trgm (минимум: PostgreSQL 13, pgvector 0.5) |
| Обратный прокси | Nginx (прода) / Vite dev proxy (разработка) |
Вся конфигурация управляется через переменные окружения в .env. Полный список опций с значениями по умолчанию и описаниями см. в Справочнике по конфигурации.
GeoLens поставляется настроенным для одного экземпляра PostgreSQL: пулы API, воркера и администрирования по умолчанию укладываются в 70 из 80 max_connections (в Postgres max_connections установлено в 80), размер определяется параметрами DB_POOL_SIZE (pool_size) и DB_MAX_OVERFLOW (max_overflow, по умолчанию 3). См. Настройка пула соединений для бюджета на процесс и способы увеличения лимита.
Автоматическое резервное копирование по расписанию выполняется по умолчанию. Флаг --profile backup не нужен. Сервис резервного копирования запускается вместе с api, worker и db при каждом docker compose up и выполняет pg_dump по ежедневному/еженедельному расписанию, а также архивирует промежуточный том объектного хранилища, так что восстановление воспроизводит работающий экземпляр (БД + загруженные файлы).
Внешняя загрузка (S3) дополнительно включается параметром BACKUP_S3_ENABLED=true. Встроенный загрузчик подписывает запросы с помощью AWS Signature V4 (awscli), совместим с Cloudflare R2, современным AWS S3 и MinIO. Неудачная загрузка отображает видимую ERROR в журналах контейнера (а не скрытое предупреждение), поэтому незаметная потеря внешней резервной копии обнаруживается немедленно.
Для повседневных операций, процедур восстановления и реагирования на инциденты см. RUNBOOK.md. Параметры конфигурации для конкретных провайдеров см. в разделе Резервное копирование и восстановление.
API и worker экспортируют метрики Prometheus из коробки (HTTP-скорость/задержность/ошибки, глубина очерии заданий, пул БД, кэш тайлов). Эталонная конфигурация scrape, правила оповещений и дашборд Grafana поставляются в infra/monitoring/; шаги по настройке см. в RUNBOOK.md §4.
| Руководство | Описание |
|---|---|
| Инструкция по установке | Пошаговое развертывание с помощью Docker Compose |
| Руководство по обновлению | Обновление между версиями с процедурами отката |
| Справочник по конфигурации | Все переменные окружения и их значения по умолчанию |
| Руководство администратора | Управление пользователями, наборами данных, работоспособностью системы |
| Самостоятельное размещение на AWS, GCP или DigitalOcean | Руководства по развертыванию с управляемой базой данных, объектным хранилищем и кэшем |
| CLI и манифесты | Публикация файлов и управление каталогами с помощью CLI geolens |
| Справочник по API | Автоматически сгенерированный справочник на docs.getgeolens.com; интерактивный Swagger UI по адресу /api/docs при запуске |
| Примеры манифестов | Шаблоны манифестов geolens.yaml для адаптации: public-cog (удаленный COG), url-source, s3-source, publication-states |
| Примеры клиентов | Рабочие примеры для браузера, QGIS, DuckDB, SDK, CLI, встраивания, Python и MCP; примеры только для чтения проверяются на живом демо в CI (галерея) |
GeoLens распространяется под лицензией Apache 2.0. Название GeoLens, логотип и брендовые активы не покрываются этой лицензией. См. TRADEMARKS.md. Атрибуция сторонних примеров данных находится в THIRD_PARTY_DATA.md.
Политиики проекта: управление · мейнтейнеры · внесение вклада · безопасность · процесс выпуска · исходящий трафик и автономный режим.