{"id":31138752,"url":"https://github.com/rechain-network-solutions/mapsyandexapi","last_synced_at":"2025-09-18T10:59:31.574Z","repository":{"id":311656314,"uuid":"1044464419","full_name":"REChain-Network-Solutions/MapsYandexAPI","owner":"REChain-Network-Solutions","description":"# Яндекс Карты - Базовый API  Этот проект демонстрирует базовые функции работы с API Яндекс Карт (MapKit) для создания интерактивных карт на веб-страницах.  ## 🚀 Возможности  ### Основные функции: - ✅ Инициализация карты с настройками - ✅ Добавление маркеров (Placemark) - ✅ Создание полигонов (Polygon) - ✅ Рисование линий (Polyline) - ✅ Управление","archived":false,"fork":false,"pushed_at":"2025-09-15T15:07:14.000Z","size":544,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-15T17:23:06.349Z","etag":null,"topics":["mapkit","maps","maps-api","maps-data","mapsapi","mapserver","mapster","placemark","polygon","polygon-clipping","polygon-clipping-algorithm","polygons","polyline","polylines","yandex","yandex-api","yandex-maps"],"latest_commit_sha":null,"homepage":"https://rechain.network","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/REChain-Network-Solutions.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-25T18:13:32.000Z","updated_at":"2025-09-15T15:07:11.000Z","dependencies_parsed_at":"2025-09-15T17:14:48.009Z","dependency_job_id":"aab2e24e-9f92-44e9-822f-9b472bd59507","html_url":"https://github.com/REChain-Network-Solutions/MapsYandexAPI","commit_stats":null,"previous_names":["rechain-network-solutions/mapsyandexapi"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/REChain-Network-Solutions/MapsYandexAPI","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/REChain-Network-Solutions%2FMapsYandexAPI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/REChain-Network-Solutions%2FMapsYandexAPI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/REChain-Network-Solutions%2FMapsYandexAPI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/REChain-Network-Solutions%2FMapsYandexAPI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/REChain-Network-Solutions","download_url":"https://codeload.github.com/REChain-Network-Solutions/MapsYandexAPI/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/REChain-Network-Solutions%2FMapsYandexAPI/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275756208,"owners_count":25522761,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-18T02:00:09.552Z","response_time":77,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["mapkit","maps","maps-api","maps-data","mapsapi","mapserver","mapster","placemark","polygon","polygon-clipping","polygon-clipping-algorithm","polygons","polyline","polylines","yandex","yandex-api","yandex-maps"],"created_at":"2025-09-18T10:59:25.447Z","updated_at":"2025-09-18T10:59:31.566Z","avatar_url":"https://github.com/REChain-Network-Solutions.png","language":"Kotlin","readme":"# Яндекс Карты - Базовый API\n\nЭтот проект демонстрирует базовые функции работы с API Яндекс Карт (MapKit) для создания интерактивных карт на веб-страницах.\n\n## 🚀 Возможности\n\n### Основные функции:\n- ✅ Инициализация карты с настройками\n- ✅ Добавление маркеров (Placemark)\n- ✅ Создание полигонов (Polygon)\n- ✅ Рисование линий (Polyline)\n- ✅ Управление зумом и центром карты\n- ✅ Обработка событий карты\n- ✅ Геокодирование адресов\n- ✅ Расчет расстояний между точками\n- ✅ Клики по карте с добавлением маркеров\n\n### Дополнительные возможности:\n- 🎨 Случайные цвета для объектов\n- 📱 Адаптивный дизайн\n- 🔄 Автоматическое обновление информации\n- 📊 Счетчик объектов на карте\n- 🎯 Информационная панель\n\n## 📋 Требования\n\n- Веб-браузер с поддержкой JavaScript ES6+\n- API ключ Яндекс Карт\n- Локальный веб-сервер (для корректной работы)\n\n## 🛠️ Установка и настройка\n\n### 1. Получение API ключа\n\n1. Перейдите на [Яндекс.Разработчики](https://developer.tech.yandex.ru/)\n2. Создайте новое приложение\n3. Получите API ключ для JavaScript API\n4. Замените `YOUR_API_KEY` в файле `index.html` на ваш ключ\n\n```html\n\u003cscript src=\"https://api-maps.yandex.ru/2.1/?apikey=ВАШ_API_КЛЮЧ\u0026lang=ru_RU\"\u003e\u003c/script\u003e\n```\n\n### 2. Запуск проекта\n\n#### Вариант 1: Локальный сервер (рекомендуется)\n```bash\n# Python 3\npython -m http.server 8000\n\n# Node.js\nnpx http-server\n\n# PHP\nphp -S localhost:8000\n```\n\n#### Вариант 2: Открытие файла\nПросто откройте `index.html` в браузере (некоторые функции могут не работать)\n\n### 3. Открытие в браузере\nПерейдите по адресу: `http://localhost:8000`\n\n## 📖 Использование\n\n### Базовые операции\n\n#### Добавление маркера\n```javascript\n// Через кнопку\ndocument.getElementById('addMarker').click();\n\n// Программно\nwindow.mapKit.addRandomMarker();\n```\n\n#### Добавление полигона\n```javascript\n// Через кнопку\ndocument.getElementById('addPolygon').click();\n\n// Программно\nwindow.mapKit.addRandomPolygon();\n```\n\n#### Добавление линии\n```javascript\n// Через кнопку\ndocument.getElementById('addPolyline').click();\n\n// Программно\nwindow.mapKit.addRandomPolyline();\n```\n\n#### Очистка всех объектов\n```javascript\n// Через кнопку\ndocument.getElementById('clearAll').click();\n\n// Программно\nwindow.mapKit.clearAll();\n```\n\n### Продвинутые функции\n\n#### Поиск по адресу\n```javascript\n// Поиск и центрирование карты\nconst coords = await window.mapKit.searchByAddress('Москва, Красная площадь');\n```\n\n#### Расчет расстояния\n```javascript\nconst point1 = [55.7558, 37.6176]; // Москва\nconst point2 = [59.9311, 30.3609]; // Санкт-Петербург\nconst distance = window.mapKit.calculateDistance(point1, point2);\nconsole.log(`Расстояние: ${distance} метров`);\n```\n\n#### Получение центра карты\n```javascript\nconst center = window.mapKit.getCenter();\nconsole.log('Центр карты:', center);\n```\n\n#### Установка зума\n```javascript\n// Случайный зум\nwindow.mapKit.setRandomZoom();\n\n// Конкретный зум\nwindow.mapKit.map.setZoom(15);\n```\n\n## 🏗️ Архитектура\n\n### Основной класс: `YandexMapKit`\n\n```javascript\nclass YandexMapKit {\n    constructor() {\n        this.map = null;           // Экземпляр карты\n        this.objects = [];         // Все объекты на карте\n        this.markers = [];         // Маркеры\n        this.polygons = [];        // Полигоны\n        this.polylines = [];       // Линии\n        this.isInitialized = false; // Статус инициализации\n    }\n}\n```\n\n### Структура файлов:\n```\nworkshop/\n├── index.html          # Основная HTML страница\n├── styles.css          # Стили и CSS\n├── mapkit.js           # Основной JavaScript API\n└── README.md           # Документация\n```\n\n## 🎨 Кастомизация\n\n### Изменение стилей объектов\n\n#### Маркеры\n```javascript\nconst marker = new ymaps.Placemark(coords, {\n    balloonContent: 'Текст в балуне'\n}, {\n    preset: 'islands#blueDotIcon',  // Иконка\n    iconColor: '#ff0000'            // Цвет иконки\n});\n```\n\n#### Полигоны\n```javascript\nconst polygon = new ymaps.Polygon([points], {\n    balloonContent: 'Описание полигона'\n}, {\n    fillColor: '#ff0000',           // Цвет заливки\n    strokeColor: '#000000',         // Цвет границы\n    strokeWidth: 2,                 // Толщина границы\n    fillOpacity: 0.6                // Прозрачность заливки\n});\n```\n\n#### Линии\n```javascript\nconst polyline = new ymaps.Polyline([points], {\n    balloonContent: 'Описание линии'\n}, {\n    strokeColor: '#ff0000',         // Цвет линии\n    strokeWidth: 3                  // Толщина линии\n});\n```\n\n### Изменение настроек карты\n\n```javascript\nthis.map = new ymaps.Map('map', {\n    center: [55.7558, 37.6176],    // Центр карты\n    zoom: 10,                       // Начальный зум\n    controls: [                     // Элементы управления\n        'zoomControl',              // Кнопки зума\n        'fullscreenControl',        // Полноэкранный режим\n        'geolocationControl'        // Определение местоположения\n    ]\n});\n```\n\n## 🔧 Отладка\n\n### Консоль браузера\nОткройте Developer Tools (F12) и перейдите на вкладку Console для просмотра логов:\n\n```\nИнициализация Яндекс Карт...\nКарта успешно инициализирована\nДобавлен маркер: [55.7558, 37.6176]\n```\n\n### Проверка API\nУбедитесь, что API Яндекс Карт загружен:\n```javascript\nconsole.log(typeof ymaps); // Должно вывести \"function\"\n```\n\n## 🚨 Частые проблемы\n\n### 1. Карта не отображается\n- Проверьте API ключ\n- Убедитесь, что используется локальный сервер\n- Проверьте консоль на ошибки\n\n### 2. Функции не работают\n- Дождитесь полной загрузки карты\n- Проверьте статус `isInitialized`\n- Убедитесь, что все элементы DOM загружены\n\n### 3. Ошибки CORS\n- Используйте локальный веб-сервер\n- Не открывайте файл напрямую в браузере\n\n## 📚 Дополнительные ресурсы\n\n- [Документация Яндекс Карт](https://yandex.ru/dev/maps/jsapi/)\n- [Примеры использования](https://yandex.ru/dev/maps/jsapi/doc/2.1/examples/)\n- [Справочник API](https://yandex.ru/dev/maps/jsapi/doc/2.1/ref/reference/)\n\n## 🤝 Вклад в проект\n\nЕсли у вас есть идеи по улучшению или вы нашли ошибки:\n\n1. Создайте Issue с описанием проблемы\n2. Предложите Pull Request с исправлениями\n3. Добавьте новые функции в API\n\n## 📄 Лицензия\n\nЭтот проект создан для образовательных целей. Используйте свободно для изучения API Яндекс Карт.\n\n---\n\n**Создано с ❤️ для изучения Яндекс Карт**\n\n# 🗺️ Yandex Maps Workshop\n\n\u003cdiv align=\"center\"\u003e\n\n![Yandex Maps](https://img.shields.io/badge/Yandex_Maps-FF0000?style=for-the-badge\u0026logo=yandex\u0026logoColor=white)\n![Kotlin](https://img.shields.io/badge/Kotlin-7F52FF?style=for-the-badge\u0026logo=kotlin\u0026logoColor=white)\n![Compose](https://img.shields.io/badge/Compose-4285F4?style=for-the-badge\u0026logo=jetpack-compose\u0026logoColor=white)\n![Multiplatform](https://img.shields.io/badge/Multiplatform-00C853?style=for-the-badge\u0026logo=kotlin\u0026logoColor=white)\n\n**Современное картографическое приложение с ИИ-функциями на базе Yandex MapKit и YaGPT**\n\n[🚀 Быстрый старт](#-быстрый-старт) • [📱 Функции](#-функции) • [🛠 Технологии](#-технологии) • [📖 Документация](#-документация)\n\n\u003c/div\u003e\n\n---\n\n## 🌟 **О проекте**\n\n**Yandex Maps Workshop** — это инновационное картографическое приложение, демонстрирующее возможности современных технологий разработки. Проект объединяет мощь Yandex MapKit, элегантность Compose Multiplatform и интеллект YaGPT для создания уникального пользовательского опыта.\n\n### 🎯 **Ключевые особенности:**\n- 🗺️ **Интерактивные карты** с плавными анимациями\n- 🤖 **ИИ-генерация описаний** мест с помощью YaGPT\n- 📱 **Кроссплатформенность** на базе Kotlin Multiplatform\n- 🎨 **Современный UI** с Material Design 3\n- 🔍 **Умный поиск** и геолокация\n- ✨ **Пользовательские метки** с возможностью создания\n\n---\n\n## 🚀 **Быстрый старт**\n\n### 📋 **Предварительные требования**\n\n- **Android Studio** (последняя версия)\n- **JDK 17+**\n- **Android SDK** (API 26+)\n- **Git**\n\n### 🔑 **Настройка API ключей**\n\n1. **Создайте файл `local.properties`** в корне проекта:\n```properties\nsdk.dir=C\\:\\\\Users\\\\YourUsername\\\\AppData\\\\Local\\\\Android\\\\Sdk\n```\n\n2. **Обновите `gradle.properties`** с вашими ключами:\n```properties\nfolderId=your_folder_id_here\ngptToken=your_yagpt_token_here\nmapkitToken=your_mapkit_token_here\n```\n\n### 🏗️ **Сборка проекта**\n\n```bash\n# Клонирование репозитория\ngit clone https://github.com/kramlex/MapsWorkShop.git\ncd MapsWorkShop\n\n# Сборка для Android\n./gradlew :composeApp:assembleDebug\n\n# Или для Windows\n.\\gradlew.bat :composeApp:assembleDebug\n```\n\n### 📱 **Запуск на устройстве**\n\n1. Подключите Android устройство или запустите эмулятор\n2. Выполните: `./gradlew :composeApp:installDebug`\n3. Запустите приложение на устройстве\n\n---\n\n## 📱 **Функции**\n\n### 🎞 **Анимации и навигация**\n\n#### ✈️ **Полет к Исаакиевскому собору**\n- **Эффект**: Многоэтапная анимация \"полета\" над картой\n- **Длительность**: 3 секунды плавного перехода\n- **Масштаб**: От мирового обзора до детального вида (zoom 3.0 → 16.0)\n\n#### 📍 **Быстрые переходы**\n- **К Исаакию**: Мгновенный переход с плавной анимацией\n- **🏛️ СПб**: Переход к центру Санкт-Петербурга\n- **🏰 Москва**: Переход к центру Москвы\n\n### 👆 **Интерактивность карты**\n\n#### 🎯 **Создание меток**\n- **Одиночное нажатие**: Создание обычной метки\n- **Долгое нажатие**: Создание \"длинной\" метки\n- **Автоматическое именование**: \"Метка 1\", \"Метка 2\" и т.д.\n\n#### 🗑️ **Управление метками**\n- **Просмотр**: Список последних 3 меток\n- **Навигация**: Переход к метке по нажатию\n- **Очистка**: Удаление всех пользовательских меток\n\n### 🔎 **Поиск и геолокация**\n\n#### 🔍 **Поисковая панель**\n- **Расположение**: Верхняя центральная часть экрана\n- **Функции**: Поиск мест, отображение результатов\n- **Результаты**: До 5 найденных мест с описаниями\n\n#### 🤖 **YaGPT интеграция**\n- **Автогенерация**: Описания для найденных мест\n- **Контекст**: Учет названия и адреса места\n- **Стиль**: Туристические описания с историческими фактами\n\n---\n\n## 🛠 **Технологии**\n\n### 🏗️ **Архитектура**\n```\nMapsWorkShop/\n├── 📱 composeApp/          # Основное приложение\n├── 🔧 common/              # Общая логика\n├── 🗺️ mapkit-bindings/     # Yandex MapKit KMP\n├── 🔗 mapkit-interop/      # Межплатформенные адаптеры\n└── 📚 docs/                # Документация\n```\n\n### 🎨 **UI Framework**\n- **Compose Multiplatform** - современный декларативный UI\n- **Material Design 3** - последние принципы дизайна\n- **Responsive Layout** - адаптация под разные экраны\n\n### 🗺️ **Картографические сервисы**\n- **Yandex MapKit KMP** - нативные карты для всех платформ\n- **Геолокация** - определение координат и адресов\n- **Анимации** - плавные переходы камеры и масштабирование\n\n### 🤖 **Искусственный интеллект**\n- **YaGPT API** - генерация описаний мест\n- **Контекстный анализ** - учет названия и местоположения\n- **Туристический контент** - специализированные описания\n\n### 🌐 **Сетевое взаимодействие**\n- **Ktor Client** - HTTP клиент для API запросов\n- **Kotlinx Serialization** - работа с JSON\n- **Coroutines** - асинхронные операции\n\n---\n\n## 📖 **Документация**\n\n### 🏗️ **Архитектура приложения**\n\n#### **Основные компоненты:**\n\n```kotlin\n@Composable\nfun App() {\n    // 1. Инициализация MapKit\n    rememberAndInitializeMapKit(apiKey = BuildKonfig.mapkitToken)\n    \n    // 2. Состояние приложения\n    val mapScreenMutableState = remember { MapScreenMutableState() }\n    \n    // 3. Основные панели\n    MapWithPlacemarks(...)\n    AnimationControlPanel(...)\n    UserPlacemarksPanel(...)\n    SearchPanel(...)\n}\n```\n\n#### **Управление состоянием:**\n\n```kotlin\nclass MapScreenMutableState {\n    val mapState: MapState                    // Состояние карты\n    private val _userPlacemarks: MutableState // Пользовательские метки\n    private val _searchResults: MutableState  // Результаты поиска\n    private val _isSearching: MutableState   // Статус поиска\n}\n```\n\n### 🗺️ **Работа с картами**\n\n#### **Инициализация карты:**\n```kotlin\n@Composable\nfun Map(state: MapState) {\n    // Настройка начальной позиции\n    LaunchedEffect(Unit) {\n        // Мировой обзор → Исаакиевский собор\n        state.map?.let { mapWindow -\u003e\n            // 1. Установка мирового обзора\n            val worldPosition = CameraPositionFactory.create(\n                target = PointFactory.create(55.0, 37.0),\n                zoom = 3.0f\n            )\n            mapWindow.map.move(worldPosition)\n            \n            // 2. Анимированный переход к собору\n            Handler(Looper.getMainLooper()).postDelayed({\n                val animation = AnimationFactory.create(\n                    type = AnimationType.SMOOTH, \n                    duration = 3.0f\n                )\n                val targetPosition = CameraPositionFactory.create(\n                    target = PointFactory.create(59.9343, 30.3061),\n                    zoom = 16.0f\n                )\n                mapWindow.map.move(targetPosition, animation, null)\n            }, 1000)\n        }\n    }\n}\n```\n\n#### **Анимации перемещения:**\n```kotlin\nfun moveToPoint(point: Point, zoom: Float = 16.0f, duration: Float = 2.0f) {\n    map?.let { mapWindow -\u003e\n        val animation = AnimationFactory.create(\n            type = AnimationType.SMOOTH, \n            duration = duration\n        )\n        val position = CameraPositionFactory.create(\n            target = point, \n            zoom = zoom\n        )\n        mapWindow.map.move(position, animation, null)\n    }\n}\n```\n\n### 🤖 **YaGPT интеграция**\n\n#### **Структура запроса:**\n```kotlin\n@Serializable\ndata class YaGPTRequest(\n    val modelUri: String,           // \"gpt://{folderId}/yandexgpt-lite\"\n    val completionOptions: CompletionOptions,\n    val messages: List\u003cMessage\u003e     // system + user prompts\n)\n```\n\n#### **Генерация описания:**\n```kotlin\nsuspend fun generatePlaceDescription(placeName: String, address: String?): String {\n    val systemPrompt = \"\"\"\n        Ты - эксперт по туризму и истории. Создай интересное и информативное \n        описание места для туристического приложения.\n        Описание должно быть:\n        - Кратким (до 3-4 предложений)\n        - Интересным и познавательным\n        - Содержать исторические факты или интересные особенности\n        - Подходящим для туристов\n    \"\"\".trimIndent()\n    \n    val userPrompt = \"Создай описание для места: $placeName (адрес: $address)\"\n    \n    // Отправка запроса к YaGPT API\n    val response = httpClient.post(\"https://llm.api.cloud.yandex.net/foundationModels/v1/completion\") {\n        headers {\n            append(\"Authorization\", \"Api-Key $apiKey\")\n            append(\"x-folder-id\", folderId)\n        }\n        contentType(ContentType.Application.Json)\n        setBody(json.encodeToString(YaGPTRequest.serializer(), request))\n    }\n    \n    return json.decodeFromString\u003cYaGPTResponse\u003e(response.body())\n        .result.alternatives.firstOrNull()?.message?.text \n        ?: \"Не удалось получить описание\"\n}\n```\n\n### 🔍 **Поисковая система**\n\n#### **Контроллер поиска:**\n```kotlin\nclass SearchController(\n    private val onSearchResults: (List\u003cSearchResult\u003e) -\u003e Unit,\n    private val onSearchError: (String) -\u003e Unit\n) {\n    fun search(query: String, center: Point) {\n        // Демонстрационные результаты\n        val mockResults = listOf(\n            SearchResult(\n                id = \"mock_1\",\n                name = \"Результат поиска: $query\",\n                point = center,\n                address = \"Адрес не найден\",\n                category = \"demo\"\n            )\n        )\n        \n        // Имитация задержки поиска\n        CoroutineScope(Dispatchers.Main).launch {\n            delay(1000)\n            onSearchResults(mockResults)\n        }\n    }\n}\n```\n\n---\n\n## 🎨 **UI компоненты**\n\n### 🎮 **Панель анимаций (AnimationControlPanel)**\n\n```kotlin\n@Composable\nfun AnimationControlPanel(\n    mapState: MapState,\n    modifier: Modifier = Modifier\n) {\n    Column(\n        modifier = modifier.padding(16.dp),\n        horizontalAlignment = Alignment.End\n    ) {\n        Text(\"🎞 Анимации\", fontSize = 14.sp, fontWeight = FontWeight.Bold)\n        \n        Button(onClick = { mapState.flyToIsaacCathedral() }) {\n            Text(\"✈️ Полет к Исаакию\")\n        }\n        \n        Button(onClick = { mapState.moveToIsaacCathedral() }) {\n            Text(\"📍 К Исаакию\")\n        }\n        \n        Button(onClick = { mapState.moveToStPetersburg() }) {\n            Text(\"🏛️ СПб\")\n        }\n        \n        Button(onClick = { mapState.moveToMoscow() }) {\n            Text(\"🏰 Москва\")\n        }\n    }\n}\n```\n\n### 👆 **Панель пользовательских меток (UserPlacemarksPanel)**\n\n```kotlin\n@Composable\nfun UserPlacemarksPanel(\n    mapScreenMutableState: MapScreenMutableState,\n    modifier: Modifier = Modifier\n) {\n    val userPlacemarks = mapScreenMutableState.getUserPlacemarks()\n    \n    if (userPlacemarks.isNotEmpty()) {\n        Column(modifier = modifier.padding(16.dp)) {\n            Text(\"👆 Мои метки (${userPlacemarks.size})\")\n            \n            Button(onClick = { mapScreenMutableState.clearUserPlacemarks() }) {\n                Text(\"🗑️ Очистить\")\n            }\n            \n            Button(onClick = { \n                userPlacemarks.forEach { placemark -\u003e\n                    mapScreenMutableState.generateDescriptionForUserPlacemark(placemark)\n                }\n            }) {\n                Text(\"🤖 Описания\")\n            }\n            \n            // Последние 3 метки\n            userPlacemarks.takeLast(3).forEach { userPlacemark -\u003e\n                Button(onClick = { \n                    mapScreenMutableState.mapState.moveToPoint(userPlacemark.point, 18.0f, 2.0f)\n                }) {\n                    Text(\"📍 ${userPlacemark.title}\")\n                }\n            }\n        }\n    } else {\n        Text(\"💡 Нажмите на карту\\nчтобы добавить метку!\")\n    }\n}\n```\n\n### 🔎 **Поисковая панель (SearchPanel)**\n\n```kotlin\n@Composable\nfun SearchPanel(\n    mapScreenMutableState: MapScreenMutableState,\n    modifier: Modifier = Modifier\n) {\n    var searchText by remember { mutableStateOf(\"\") }\n    val searchResults = mapScreenMutableState.searchResults\n    val isSearching = mapScreenMutableState.isSearching\n    \n    Card(\n        modifier = modifier.padding(16.dp).fillMaxWidth(0.8f),\n        elevation = CardDefaults.cardElevation(defaultElevation = 8.dp)\n    ) {\n        Column(modifier = Modifier.padding(16.dp)) {\n            Text(\"🔎 Поиск мест\", fontSize = 16.sp, fontWeight = FontWeight.Bold)\n            \n            Row(\n                modifier = Modifier.fillMaxWidth(),\n                verticalAlignment = Alignment.CenterVertically\n            ) {\n                TextField(\n                    value = searchText,\n                    onValueChange = { searchText = it },\n                    placeholder = { Text(\"Введите название места...\") },\n                    modifier = Modifier.weight(1f),\n                    leadingIcon = { Icon(Icons.Default.Search, \"Поиск\") }\n                )\n                \n                Button(\n                    onClick = { \n                        if (searchText.isNotBlank()) {\n                            mapScreenMutableState.performSearch(searchText)\n                        }\n                    },\n                    enabled = searchText.isNotBlank() \u0026\u0026 !isSearching\n                ) {\n                    if (isSearching) {\n                        CircularProgressIndicator(modifier = Modifier.size(16.dp))\n                    } else {\n                        Text(\"Найти\")\n                    }\n                }\n            }\n            \n            // Результаты поиска с описаниями от YaGPT\n            if (searchResults.isNotEmpty()) {\n                LazyColumn(modifier = Modifier.heightIn(max = 200.dp)) {\n                    items(searchResults.take(5)) { result -\u003e\n                        SearchResultItem(\n                            result = result,\n                            onClick = {\n                                mapScreenMutableState.mapState.moveToPoint(result.point, 16.0f, 2.0f)\n                            }\n                        )\n                    }\n                }\n            }\n        }\n    }\n}\n```\n\n---\n\n## 🔧 **Конфигурация**\n\n### 📁 **Структура проекта**\n\n```\nMapsWorkShop/\n├── 📱 composeApp/                          # Основное приложение\n│   ├── src/\n│   │   ├── androidMain/                    # Android-специфичный код\n│   │   │   └── kotlin/.../Map.android.kt  # Android реализация карты\n│   │   ├── commonMain/                     # Общий код для всех платформ\n│   │   │   └── kotlin/.../App.kt          # Основная логика приложения\n│   │   └── iosMain/                        # iOS-специфичный код\n│   ├── build.gradle.kts                    # Конфигурация сборки\n│   └── srcSet/                             # Настройки исходных наборов\n├── 🔧 common/                              # Общие модули\n├── 🗺️ mapkit-bindings/                     # Yandex MapKit KMP\n├── 🔗 mapkit-interop/                      # Межплатформенные адаптеры\n├── 📚 docs/                                # Документация\n├── 🏗️ build.gradle.kts                     # Корневая конфигурация\n├── 📋 gradle.properties                    # Свойства Gradle\n├── 🔑 local.properties                     # Локальные настройки\n└── 📖 README.md                            # Этот файл\n```\n\n### ⚙️ **Настройки Gradle**\n\n#### **Основные зависимости:**\n```kotlin\nsourceSets.commonMain.dependencies {\n    // Compose Multiplatform\n    implementation(compose.runtime)\n    implementation(compose.foundation)\n    implementation(compose.material3)\n    implementation(compose.ui)\n    \n    // Ktor для HTTP запросов\n    implementation(libs.ktor.client.core)\n    implementation(libs.ktor.client.content.negotiation)\n    implementation(libs.ktor.client.json)\n    implementation(libs.ktor.client.logging)\n    \n    // Сериализация\n    implementation(libs.kotlinx.serialization)\n}\n```\n\n#### **Android-специфичные зависимости:**\n```kotlin\nsourceSets.androidMain.dependencies {\n    implementation(compose.preview)\n    implementation(libs.androidx.activity.compose)\n    \n    // Ktor Android клиент\n    implementation(libs.ktor.client.okhttp)\n}\n```\n\n### 🔑 **API ключи и токены**\n\n#### **gradle.properties:**\n```properties\n# Yandex Cloud\nfolderId=b1g334ut7mfp3stm8gnk\n\n# YaGPT API\ngptToken=t1.9euelZrJk5zNnM_GnsvMncmTzsqMl-3rnpWajZybjc-YicaJzczPlouXj5Hl8_d8J1o6-e9qJCw8_N3z9zxWVzr572okLDz8zef1656VmpuYkZGTlZzKmYvLjpLHy8mM7_zF656VmpuYkZGTlZzKmYvLjpLHy8mM.X4DV0UomYuFRk2M1DAsFT-vCnf8yipedm1UoRkLVxDoQVUevaZnSFIaWH67Vn3aIRrnWOQMgoM2sdTeoE1ikAg\n\n# Yandex MapKit\nmapkitToken=e049cdec-2adc-4569-a841-3311fe521913\n```\n\n#### **local.properties:**\n```properties\n# Android SDK путь\nsdk.dir=C\\:\\\\Users\\\\YourUsername\\\\AppData\\\\Local\\\\Android\\\\Sdk\n```\n\n---\n\n## 🚀 **Развертывание**\n\n### 📱 **Android**\n\n#### **Debug сборка:**\n```bash\n./gradlew :composeApp:assembleDebug\n```\n\n#### **Release сборка:**\n```bash\n./gradlew :composeApp:assembleRelease\n```\n\n#### **Установка на устройство:**\n```bash\n./gradlew :composeApp:installDebug\n```\n\n### 🍎 **iOS (в разработке)**\n\n```bash\n./gradlew :composeApp:iosSimulatorArm64Test\n```\n\n### 🌐 **Web (планируется)**\n\n```bash\n./gradlew :composeApp:jsBrowserDevelopmentRun\n```\n\n---\n\n## 🧪 **Тестирование**\n\n### 🔍 **Проверка функциональности**\n\n1. **Карта и анимации:**\n   - Запуск приложения → автоматический переход к Исаакиевскому собору\n   - Тестирование кнопок анимаций\n   - Проверка плавности переходов\n\n2. **Интерактивность:**\n   - Создание меток нажатием на карту\n   - Управление пользовательскими метками\n   - Навигация между метками\n\n3. **Поиск и YaGPT:**\n   - Ввод поисковых запросов\n   - Проверка генерации описаний\n   - Отображение результатов поиска\n\n### 🐛 **Отладка**\n\n#### **Логи приложения:**\n```bash\nadb logcat | grep \"MapsWorkShop\"\n```\n\n#### **Проверка API:**\n```bash\n# Тест YaGPT API\ncurl -X POST \"https://llm.api.cloud.yandex.net/foundationModels/v1/completion\" \\\n  -H \"Authorization: Api-Key YOUR_TOKEN\" \\\n  -H \"x-folder-id: YOUR_FOLDER_ID\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"modelUri\":\"gpt://YOUR_FOLDER_ID/yandexgpt-lite\",...}'\n```\n\n---\n\n## 🤝 **Вклад в проект**\n\n### 📝 **Как внести свой вклад**\n\n1. **Fork** репозитория\n2. Создайте **feature branch** (`git checkout -b feature/AmazingFeature`)\n3. **Commit** изменения (`git commit -m 'Add some AmazingFeature'`)\n4. **Push** в branch (`git push origin feature/AmazingFeature`)\n5. Откройте **Pull Request**\n\n### 🐛 **Сообщение об ошибках**\n\nИспользуйте [GitHub Issues](https://github.com/kramlex/MapsWorkShop/issues) для:\n- Сообщений об ошибках\n- Предложений новых функций\n- Вопросов по использованию\n\n### 📋 **Шаблон issue**\n\n```markdown\n## 🐛 Описание ошибки\nКраткое описание проблемы\n\n## 🔍 Шаги для воспроизведения\n1. Откройте приложение\n2. Выполните действие X\n3. Ошибка происходит в Y\n\n## 📱 Окружение\n- Устройство: [например, Samsung Galaxy S21]\n- Android версия: [например, 13]\n- Версия приложения: [например, 1.0.0]\n\n## 📸 Скриншоты\nДобавьте скриншоты если применимо\n\n## 💻 Логи\n```\nadb logcat | grep \"MapsWorkShop\"\n```\n```\n\n---\n\n## 📚 **Дополнительные ресурсы**\n\n### 🔗 **Полезные ссылки**\n\n- **Yandex MapKit**: [Документация](https://yandex.ru/dev/maps/mapkit/)\n- **YaGPT**: [API документация](https://cloud.yandex.ru/docs/foundation-models/)\n- **Compose Multiplatform**: [Руководство](https://www.jetbrains.com/lp/compose-multiplatform/)\n- **Kotlin Multiplatform**: [Документация](https://kotlinlang.org/docs/multiplatform.html)\n\n### 📖 **Документация проекта**\n\n- **📚 Полный индекс**: [DOCUMENTATION_INDEX.md](./DOCUMENTATION_INDEX.md) - Центральный индекс всей документации\n- **🏗️ Архитектура**: [ARCHITECTURE.md](./ARCHITECTURE.md) - Описание архитектуры проекта\n- **📚 API Справочник**: [API_REFERENCE.md](./API_REFERENCE.md) - Подробная справка по API\n- **🤝 Руководство разработчика**: [CONTRIBUTING.md](./CONTRIBUTING.md) - Как внести вклад в проект\n- **🔧 Решение проблем**: [TROUBLESHOOTING.md](./TROUBLESHOOTING.md) - FAQ и решение проблем\n- **📱 Мобильная разработка**: [MOBILE_DEVELOPMENT.md](./MOBILE_DEVELOPMENT.md) - Руководство по мобильным приложениям\n- **📋 История изменений**: [CHANGELOG.md](./CHANGELOG.md) - История версий и изменений\n\n### 📖 **Рекомендуемая литература**\n\n- \"Kotlin Multiplatform by Example\" - практические примеры\n- \"Compose Multiplatform: From Android to iOS\" - руководство по UI\n- \"Yandex MapKit Developer Guide\" - работа с картами\n\n### 🎓 **Обучающие материалы**\n\n- [Kotlin Multiplatform Tutorial](https://kotlinlang.org/docs/multiplatform-tutorial.html)\n- [Compose Multiplatform Examples](https://github.com/JetBrains/compose-multiplatform)\n- [Yandex Cloud Learning Path](https://cloud.yandex.ru/docs/tutorials/)\n\n---\n\n## 📄 **Лицензия**\n\nЭтот проект распространяется под лицензией **MIT**. См. файл [LICENSE](LICENSE) для подробностей.\n\n---\n\n## 👨‍💻 **Авторы**\n\n- **Основной разработчик**: [kramlex](https://github.com/kramlex)\n- **UI/UX дизайн**: MapsWorkShop Team\n- **Документация**: AI Assistant\n\n---\n\n## 🙏 **Благодарности**\n\n- **Yandex** за предоставление MapKit и YaGPT API\n- **JetBrains** за Kotlin и Compose Multiplatform\n- **Сообщество** за вклад в развитие проекта\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**⭐ Если проект вам понравился, поставьте звездочку! ⭐**\n\n**🚀 Следите за обновлениями и новыми функциями! 🚀**\n\n\u003c/div\u003e\n\n---\n\n*Последнее обновление: Декабрь 2024*","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frechain-network-solutions%2Fmapsyandexapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frechain-network-solutions%2Fmapsyandexapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frechain-network-solutions%2Fmapsyandexapi/lists"}