Промты для карт в GPT: структура, паттерны и 12 готовых шаблонов

Практическое руководство

Промты для карт в GPT: структура, паттерны и 12 готовых шаблонов

Разбираем анатомию пространственного промта, 5 универсальных паттернов и отдаём библиотеку шаблонов под GeoJSON, SVG-карты, QGIS-скрипты, Overpass-запросы и анализ данных.

Почему GPT понимает карты иначе, чем текст

Языковая модель не «видит» пространство. Она оперирует токенами, но в обучающей выборке было миллионов пар: описание → геометрия, координаты → свойства, задача → код. GPT восстанавливает паттерны картографического мышления: проекции, топологию, иерархию объектов, семантику тегов OSM.

Ключевое отличие от обычного текста — структурная жёсткость. В промте для карты порядок слоёв, система координат, уровень детализации и формат выхода не négociable. Пропуск любого параметра даёт галлюцинацию: несуществующие теги, сломанную топологию, не ту проекцию.

Хороший картографический промт — это техническое задание в естественном языке с явными ограничениями и примером ожидаемой структуры.

// Пример внутреннего представления
feature = {
  type: «Feature»,
  geometry: {
    type: «Point»,
    coordinates: [37.62, 55.75]
  },
  properties: {
    amenity: «cafe»,
    name: «Точка кофе»
  }
}

Модель мышит в структурах: GeoJSON, WKT, Overpass QL, PyQGIS. Промт должен говорить на этом языке.

Анатомия рабочего промта: 5 обязательных блоков

Роль и контекст

Кто ты: GIS-аналитик, картограф, разработчик карт. Задача: векторная карта, растр, анализ, код. Входные данные: что есть на входе.

Пространственные ограничения

BBox или полигон AOI, CRS (EPSG:4326 / 3857 / локальный), уровень зума или масштаб, допуск точности.

Семантика объектов

Теги OSM / атрибуты слоя, фильтры по классам, иерархия: Poi → Building → Landuse → Boundary. Что включать, что исключать.

Формат и структура выхода

GeoJSON / TopoJSON / SVG / WKT / CSV / PyQGIS / Folium / Mapbox GL JS. Схема свойств, вложенность, именование полей.

Проверка и валидация

Требование валидного GeoJSON, корректной топологии, отсутствия самопересечений, соответствия схеме. Пример теста.

5 паттернов промтов для любых картографических задач

1

Генератор GeoJSON по схеме

Модель выдаёт валидный FeatureCollection по описанной схеме свойств. Идеально для прототипирования слоёв, тестовых данных, мокапов.

// Паттерн
«Ты — GIS-инженер. Сгенерируй GeoJSON FeatureCollection из N объектов типа [тип]. Схема properties: {поле1: тип, поле2: тип…}. AOI: [BBox/полигон]. CRS: EPSG:4326. Выход — только валидный JSON, без комментариев.»
2

Overpass QL / Turbo конвертер

Перевод естественного языка в запрос к Overpass API. Самый частый кейс: «достань все кафе в радиусе 500 м от метро».

// Паттерн
«Напиши Overpass QL запрос: найти все [теги] в области [BBox/полигон/around:радиус,координаты]. Верни [out:geom / out:body / out center]. Добавь таймаут 25s. Только код.»
3

Генератор кода визуализации

Python (Folium, GeoPandas, Matplotlib), JS (Mapbox GL, Leaflet, Deck.gl), R (sf, tmap). Готовый скрипт от данных до картинки/интерактива.

// Паттерн
«Напиши Python-скрипт на Folium: загрузи [файл/URL], отфильтруй по [условие], визуализируй [choropleth / heatmap / markers с кластеризацией]. Сохрани в HTML. Зависимости в requirements.txt.»
4

Пространственный анализ (CoT)

Chain-of-thought для GIS: буферы, пересечения, ближайший сосед, изохроны, кластеризация. Модель пишет логику, затем код.

// Паттерн
«Реши пошагово: даны точки [описание]. Построй буфер R метров, найди пересечение со слоем [слой], агрегируй по [поле]. Пиши рассуждение, затем Python/GeoPandas код. Проверь валидность геометрий.»
5

Стилизация и Mapbox GL Style Spec

Генерация JSON-стиля для векторных тайлов: слои, paint, layout, zoom-функции, data-driven стили. Сразу готовый к загрузке в Mapbox Studio.

// Паттерн
«Сгенерируй Mapbox GL Style Spec v8 для слоя [имя] с полями [список]. Стиль: [категориальный / градиент / пропорциональные символы]. Брейкпоинты зума: 0, 5, 10, 14. Верни только JSON.»

Библиотека: 12 готовых промт-шаблонов

Каждый шаблон — копируй, подставь свои параметры, запускай. Сгруппированы по типу выхода: данные, код, стиль, анализ.

Данные → GeoJSON

1. Точечный слой POI по категории

Генерация тестовых точек интереса с реалистичными атрибутами OSM.

Скопируй и замени [BBox] и [категорию]:

«Ты — GIS-инженер. Сгенерируй GeoJSON FeatureCollection из 50 объектов amenity=[кафе/аптека/банкомат] в границах BBox: [minLon, minLat, maxLon, maxLat]. Свойства каждого: id (uuid), name (реалистичное), amenity, opening_hours (по схеме OSM), wheelchair (yes/no/limited), addr:street, addr:housenumber, phone (формат +7 XXX XXX-XX-XX), website. Координаты с точностью 6 знаков. CRS: EPSG:4326. Выход — только валидный JSON.»
Данные → Overpass

2. Выгрузка зданий с высотой и этажами

Готовый запрос для 3D-визуализации зданий в заданной области.

Замени [BBox] на свои координаты:

«[out:json][timeout:25]; ( way[«building»][«height»][«building:levels»]([BBox]); relation[«building»][«height»][«building:levels»]([BBox]); ); out geom;»
Данные → CSV

3. Таблица расстояний до ближайшего объекта

Для каждой точки из набора — расстояние и ID ближайшего объекта целевого слоя.

Промт для CoT + Python:

«Даны две таблицы CSV: points.csv (id, lat, lon) и targets.csv (id, lat, lon, type). Для каждой точки найди ближайший target по метрике гаверсинуса. Верни CSV: point_id, target_id, target_type, distance_m. Используй GeoPandas + BallTree. Покажи рассуждение, потом код.»
Код → Folium

4. Хороплет по GeoJSON + CSV данных

Склейка геометрии и атрибутов, классификация quantile/jenks, легенда, тултипы.

Подставь свои пути к файлам:

«Python Folium: загрузи regions.geojson (поле join_key) и data.csv (join_key, value). Сделай choropleth: scheme=Quantiles, k=5, colormap=YlOrRd. Добавь GeoJsonTooltip с полями [name, value]. Сохрани map.html. requirements.txt включи.»
Код → Deck.gl

5. Hexbin / H3 теплокарта больших данных

Агрегация точек в H3-гексагоны résolution 8–10, экспорт в Deck.gl HexagonLayer.

Для 100к+ точек:

«Python: загрузи points.parquet (lat, lon, weight). Агрегируй в H3 res=9 через h3pandas. Выведи CSV: hex_id, count, sum_weight. Затем JS Deck.gl: HexagonLayer с elevationScale, coverage=1, getColor=[[0,0,255,50], [255,0,0,200]]. Верни полный HTML.»
Код → PyQGIS

6. Автоматизация компоновки в QGIS

Скрипт для Processing Toolbox: загрузка слоёв, стиль, компоновка, экспорт PDF/ PNG.

Запуск внутри консоли QGIS:

«PyQGIS: загрузи векторный слой из GPKG [путь], примений категорированный стиль по полю [type] с палитрой Set2. Создай компоновку A4横向: карта 70%, легенда 15%, масштабная линейка, северная стрелка. Экспорт в PDF 300 DPI. Код для processing.run().»
Анализ → Изохроны

7. Изохроны пешей доступности (OSRM / Valhalla)

Полигоны 5/10/15 мин ходьбы от точки. Нужен локальный OSRM или Valhalla, но промт пишет клиентский код.

Клиент на Leaflet + OSRM:

«JS: Leaflet карта, клик по карте → запрос к OSRM /isochrone?loc={lat},{lon}&contours_minutes=5,10,15&polygons=true. Добавь GeoJSON слой с fillOpacity=0.3, color по минутам. Поп-ап с площадью каждого полигона в га. Только код.»
Анализ → Кластеры

8. DBSCAN кластеризация POI с выносом центроидов

Поиск горячих точек, шум отдельно. Результат — GeoJSON кластеров + таблица статистики.

Подставь eps в метрах:

«Python: GeoPandas прочитай points.geojson. Проецируй в EPSG:3857. DBSCAN eps=[200]м, min_samples=5. Для каждого кластера: центроид, convex_hull, count, основной amenity (мода). Сохрани clusters.geojson + clusters_stats.csv. Шум (label=-1) отдельным файлом.»
Стиль → Mapbox GL

9. Data-driven стиль для точек с кластеризацией

CircleLayer с радиусом по zoom, цвет по категории, кластеры через supercluster.

JSON для Mapbox Style Spec:

«Сгенерируй style.json v8: source=geojson (cluster=true, clusterRadius=50, clusterMaxZoom=14). Слои: 1) круг кластера: radius=step(zoom, 15, 10, 25), color=interpolate(linear, cluster_point_count, [10, #F28B9A], [100, #E53348], [500, #B50518]). 2) текст количества. 3) unclustered point: radius=6, color по свойству category (match). Верни только JSON.»
Стиль → SVG

10. Экспорт в SVG для печати / Figma

Векторная карта без тайлов: контуры, подписи, гратика. Готов к правке в иллюстраторе.

Python → cairosvg / mapnik:

«Python: загрузи boundaries.geojson, rivers.geojson, cities.csv. Проецируй в EPSG:3857. Отрисуй через mapnik: полигоны stroke=#ccc, fill=#fafafa; линии рек stroke=#3A86C8 width=0.5pt; города — символ + текст name, font-size=8pt, halo=white. Размер artboard A3. Сохрани map.svg.»
Анализ → Статистика

11. Зональная статистика по растру

Для каждого полигона — mean, min, max, sum, count пикселей растра (DEM, ночные огни, NDVI).

rasterstats / exactextract:

«Python: raster=dem.tif, zones=districts.geojson (id, name). exactextract.zonal_stats(zones, raster, stats=[«mean»,»min»,»max»,»sum»,»count»], include_cols=[«id»,»name»]). Результат в GeoJSON с добавленными свойствами. Обработай nodata. Выход: stats.geojson.»
Пайплайн → ETL

12. OSM → GeoParquet пайплайн

Полный цикл: Overpass → фильтр → нормализация тегов → GeoParquet с партиционированием по типу.

Для аналитической базы:

«Python: 1) Обработай osm.pbf через pyrosm: извлечь все building, highway, amenity, landuse. 2) Нормализуй теги: приведи к схеме {type, subtype, name, geometry, extra_tags_json}. 3) Запиши в GeoParquet, partition_cols=[«type»], compression=snappy. 4) Верни код + схему Arrow. Логирование каждого шага.»

Плохой промт vs Хороший промт: разбор на примере

❌ Плохой

Сделай карту кафе в Москве

Что получится:
• Галлюцинированные координаты • Нет CRS — по умолчанию WGS84, но неявно • Свойства: только name • Формат: «вот JSON» — часто с trailing commas • Нет проверки валидности
  • Нет AOI — охват не определён
  • Нет фильтра по тегам OSM
  • Нет требования к схеме свойств
  • Нет формата выхода
  • Нет инструкции валидации
✅ Хороший

Сгенерируй GeoJSON кафе Центрального АО Москвы

Промт:

«Ты — GIS-аналитик. Сгенерируй FeatureCollection amenity=cafe в полигоне Центрального АО Москвы (приложен GeoJSON). CRS: EPSG:4326. Свойства: id (uuid), name, cuisine, opening_hours, wheelchair, addr:*, phone, website, rating (1-5). Минимум 30 объектов. Выход — ТОЛЬКО валидный JSON. После генерации: проверь через geojsonhint, убедись что все точки внутри полигона.»
  • Явный AOI (полигон, не BBox)
  • Чёткий тег OSM
  • Полная схема properties
  • Количественная цель (минимум 30)
  • Валидация: geojsonhint + in-polygon test

Частые режимы отказа: почему промт даёт мусор

Галлюцинированные теги OSM

Модель придумывает shop:coffee вместо amenity:cafe + cuisine:coffee_shop. Лечится: явно перечисли нужные ключи в промте или дай ссылку на wiki.openstreetmap.org.

Сломанная топология

Self-intersecting полигоны, дырки там, где не надо, MultiPolygon вместо Polygon. Лечится: добавь требование ST_MakeValid / buffer(0) в шаге валидации промта.

Не та проекция

Координаты в Web Mercator (EPSG:3857) вместо WGS84 (EPSG:4326) или наоборот. Лечится: всегда пиши CRS в промте и требуй его в выходе.

Переполнение контекста

Запрос 10 000 объектов упирается в лимит токенов — JSON обрывается посередине. Лечится: проси постранично (cursor/offset) или сразу код для выгрузки через Overpass/OSM API.

Игнорирование CRS при расчётах

Буфер в градусах вместо метров, площадь в градусах². Лечится: в CoT-промте требуй проецировать в метрическую СК перед любым измерительным действием.

Смешение векторного и растрового мышления

Просьба «сделать теплокарту» без указания: hexbin / H3 / kernel density / rasterize. Лечится: указывай алгоритм и параметры (resolution, radius, weight field).

Промт — это не вопрос, а контракт

Лучшие картографические промты читаются как ТЗ: чёткие входы, жёсткие ограничения, проверяемый выход. GPT не «рисует карту» — он восстанавливает детерминированную трансформацию данных, которую вы описали.

AOI + CRS обязательныСхема properties — законВалидация — часть промтаCoT для сложного анализа

Сохрани шпаргалку. Начни с паттерна №1 — он закрывает 60% рутинных задач. Остальное — комбинации тех же блоков.