# Источники и устройство карты M31 Карта автономна: каталог `sky/` размещается целиком, включая код, `catalog.js`, `objects.json`, `objects.js`, локальную иконку и уведомления об источниках. Внешних шрифтов, библиотек, API, геолокации, телеметрии и сетевых запросов во время работы нет. Данные пользователя остаются в браузере. Ссылки на источники открываются только по явному действию посетителя. Геолокация не запрашивается. ## Звёзды - **HYG Stellar Database v4.1**, David Nash / Astronexus. - Первичный публикуемый источник этой компиляции: . - Зафиксированный Git blob CSV: `ba2dec4eb0f6768914c7fc1051258100214ddf84`; имя файла `hygdata_v41.csv`, 33 932 548 байт. - Прямой файл: . - Описание полей и эпохи: . - Компиляция опирается на Hipparcos, Yale Bright Star Catalogue и Gliese. Координаты HYG v4.1 имеют **эпоху и равноденствие J2000.0**. - Лицензия: [Creative Commons Attribution-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-sa/4.0/). Исходное уведомление сохранено в [vendor/HYG-LICENSE.txt](vendor/HYG-LICENSE.txt). - GitHub-репозиторий автора архивирован; текущая разработка перенесена на . Для воспроизводимости здесь используется указанная фиксированная версия, а не автоматически обновляемая ссылка. В `catalog.js` оставлены **5 071 звезда**: все записи V ≤ 6,0 (кроме Солнца) и все звёзды, служащие концами линий созвездий. Некоторые опорные звёзды слабее 6,0 не рисуются при максимальном пользовательском пороге 6,0; они нужны для геометрии линий. Цвет приблизительно отражает B−V; размер — визуальную величину V. Размеры дисков звёзд не физические. Поля строки `stars` перечислены в самом файле `catalog.js`: `id, raDegJ2000, decDegJ2000, magV, bv, name, designation, con, pmRaCosDecMasYr, pmDecMasYr`. Положительный `id` означает HIP, отрицательный — минус HYG id для записи без HIP. Прямое восхождение переведено из часов в градусы; числа округлены до указанной в генераторе точности. Английские имена взяты из HYG; наиболее известные имена переведены на русский для интерфейса. Исходное имя остаётся в карточке. Названия не используются в астрономических вычислениях. ## Линии созвездий - **Western sky culture**, Stellarium’s team. - Источник: . - Использован только `constellations[].lines` и обозначение `iau` из `index.json`. Иллюстрации, границы, сторонний код и астеризмы не включены. - Исходные авторство и лицензия сохранены полностью в [vendor/STELLARIUM-WESTERN-DESCRIPTION.md](vendor/STELLARIUM-WESTERN-DESCRIPTION.md). Авторы указывают для текста и данных **CC BY-SA** без номера версии в этом документе; это уведомление сохранено без расширения его условий. Лицензия иллюстраций Free Art License к карте не относится: иллюстраций нет. В карту включены **88 созвездий** с русскими названиями. Цепочки HIP преобразованы в локальный компактный формат. Маркеры толщины `thin`/`bold` опущены; все линии отображаются одинаково. Написание `Tra` нормализовано к `TrA`. Это изменения исходных данных, публикуемые с сохранением атрибуции и ShareAlike. Линии созвездий — традиционные рисунки, а не официальные границы областей IAU. ## Галактики, туманности и скопления **OpenNGC**, Mattia Verga и участники, Copyright 2023 Mattia Verga. Использован зафиксированный commit [`be3cd6c5498806a2fbb2f7e0452ef802dbb02be0`](https://github.com/mattiaverga/OpenNGC/tree/be3cd6c5498806a2fbb2f7e0452ef802dbb02be0): девять строк из `database_files/NGC.csv` и строка `Mel022` (M45) из `database_files/addendum.csv`. Первичный публикуемый источник компиляции — репозиторий её авторов; происхождение каждого поля сохранено в исходной колонке `Sources`. Координаты девяти NGC-объектов взяты компиляцией из NASA/IPAC NED, координаты Плеяд — из SIMBAD. Лицензия исходных данных и производной выборки: [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/). Полные уведомления сохранены локально: [авторство](vendor/OPENNGC-COPYRIGHT.txt), [участники](vendor/OPENNGC-AUTHORS.txt), [лицензия](vendor/OPENNGC-LICENSE.txt), [определение полей и источников](vendor/OPENNGC-GUIDE.txt). Неизменённые выбранные строки: [OPENNGC-SELECTED.csv](vendor/OPENNGC-SELECTED.csv). Изменения: выбор 10 объектов, перевод RA из часов и Dec из градусов/минут/секунд в десятичные градусы, четыре группы типов для интерфейса, русские подписи и описания, привязка существующих архивных материалов. Координаты — **J2000**; перед переводом в горизонтальную систему применяется та же прецессия IAU 1976. Собственное движение центров протяжённых объектов в этой обзорной выборке не применяется. Блеск — **суммарная видимая величина V** из поля `V-Mag`, не поверхностная яркость и не величина центральной звезды туманности. | ID | Исходная строка | Восстановленный материал | | --- | --- | --- | | M31 | NGC0224 | Отдельная статья «Туманность Андромеды» | | M45 | Mel022 | Фотография «Плеяды (M45)» в галерее | | M42 | NGC1976 | Общая статья о наблюдениях глубокого неба | | M13 | NGC6205 | Общая статья о наблюдениях глубокого неба | | M57 | NGC6720 | Общая статья о наблюдениях глубокого неба | | M1 | NGC1952 | Общая статья о наблюдениях глубокого неба | | M33 | NGC0598 | Общая статья о наблюдениях глубокого неба | | M51 | NGC5194 | Общая статья о наблюдениях глубокого неба | | M81 | NGC3031 | Общая статья о наблюдениях глубокого неба | | M82 | NGC3034 | Общая статья о наблюдениях глубокого неба | Для M1 исходный NED note уточняет, что координаты относятся к Крабовидному пульсару; это указано и в карточке. Для M51 маркер относится к NGC 5194, а не к геометрическому центру пары галактик. Размеры маркеров условны, не соответствуют угловым размерам объектов. Под горизонтом маркер не рисуется; выбранная карточка сохраняется с явным статусом. Порог звёздной величины фильтрует только звёзды; каталог объектов включается отдельным слоем. `objects.json` — canonical массив для сборки сайта. `objects.js` — его сгенерированное classic-script представление `window.SKY_OBJECTS`; браузер загружает его локально без `fetch`. `tools/sky-check/objects` проверяет равенство данных, координаты и Messier cross-reference с pinned CSV, тип, уникальность id, допустимость и наличие локальных путей. Генерация: ```sh cd tools/sky-check GOCACHE=/private/tmp/m31-sky-go-cache go run ./objects GOCACHE=/private/tmp/m31-sky-go-cache go run ./objects -check ``` После осознанного изменения исходной CSV-выборки можно обновить координаты canonical JSON через `go run ./objects -refresh`. Скрипт не скачивает данные и не обновляет каталог автоматически. Менять численные поля вручную без сверки с источником не следует. ### Фотографии и архивные статьи Новые внешние фотографии не скачивались. Используются только уже имеющиеся: - `/astronomy/outside/images/m31_2.jpg` — снимок прямо в восстановленной `/astronomy/outside/m31.html`, заголовок «Туманность Андромеды (M31, NGC 224)». Подпись источника текста: Ф. Ю. Зигель, «Сокровища звездного неба». - `/archive/gallery/astronomy/images/ag_00006.jpg` — снимок из `/archive/gallery/astronomy/ag_00006.html`, исходный `alt="Плеяды (M45)"`. Оба снимка просмотрены; содержимое соответствует исходным подписям. Авторы снимков и их исходные лицензии в восстановленных HTML **не указаны**. Лицензия OpenNGC не распространяется на эти архивные изображения или тексты; наличие файла в архиве не доказывает его свободную лицензию. Карточки честно сохраняют эту неопределённость в подписи. Для восьми остальных объектов `image: null`, изображение не подставляется и не выдумывается. `articleKind` отличает `object` (отдельный материал M31), `gallery` (M45) и `general` (существующая `/astronomy/outside/deepsky_observ.html`). Последние ссылки подписаны как общая статья, без обещания отдельной публикации о каждом объекте. Исторические численные оценки статьи M31 не используются в расчётах карты: каталог хранит проверенные современные J2000 координаты отдельно. ## Расчёт 1. Дата и время интерпретируются с **явным фиксированным UTC-смещением**, независимо от часового пояса ОС. МСК — UTC+03:00. Переходы на летнее время и исторические изменения часовых поясов автоматически не применяются. 2. Unix-время преобразуется в юлианскую дату, затем в Greenwich Mean Sidereal Time; восточная долгота прибавляется к GMST. Используется стандартная формула GMST с J2000 и вековыми членами. 3. Собственное движение HYG задаётся касательными векторами μα⋅cos δ и μδ в mas/year. Нормализация вектора не создаёт деления на cos δ и остаётся устойчивой у небесных полюсов. Затем применяется прецессия **IAU 1976** из J2000 в средний экватор/равноденствие даты. 4. По часовому углу, широте и склонению вычисляется горизонтальный единичный вектор. Азимут отсчитывается от севера через восток. 5. Используется **азимутальная равнопромежуточная проекция** с центром в зените; геометрический горизонт имеет высоту 0°. Восток слева, как у карты, которую держат над головой. Подгоризонтные звёзды не рисуются. Линии интерполируются по большим кругам и обрезаются горизонтом. Первичные методические и численные источники: - US Naval Observatory, [Computing Approximate Sidereal Time](https://aa.usno.navy.mil/faq/GAST). - US Naval Observatory, [Computing Altitude and Azimuth](https://aa.usno.navy.mil/faq/alt_az). - ERFA, [IAU 1976 precession matrix](https://github.com/liberfa/erfa/blob/master/src/pmat76.c) и независимые опубликованные численные эталоны [`t_pmat76`](https://github.com/liberfa/erfa/blob/master/src/t_erfa_c.c). - ESA Hipparcos / NASA HEASARC, [определение собственного движения μα⋅cos δ](https://heasarc.gsfc.nasa.gov/W3Browse/catalog/hipparcos.html). ## Ограничения Поддерживаются локальные календарные даты **1900–2100**. Это обзорная карта, не астрометрический инструмент и не средство наведения телескопа. Прецессия и собственное движение учитываются, но отсутствуют нутация, аберрация, параллакс, радиальное/перспективное ускорение, рефракция и поправка UTC → UT1. Возле горизонта рефракция особенно заметна. Нет рельефа, погоды, Солнца/Луны и планет. Объекты глубокого неба ограничены небольшой выборкой из десяти записей, полных NGC/IC каталогов нет. Небо всегда нарисовано тёмным, включая дневное время. Количество «над горизонтом» — геометрический подсчёт звёзд до выбранного порога, а не обещание их видимости невооружённым глазом в городе или днём. Проекция сохраняет угловые расстояния от зенита, а не все углы/расстояния между объектами. Выделенный объект сохраняется при resize и смене времени, даже если он уходит под горизонт. ## Воспроизводимость каталога Команды выполняются из корня репозитория. Скачивание нужно только для перегенерации; готовая карта работает полностью без него: ```sh curl -sS --max-time 30 -L --fail https://raw.githubusercontent.com/astronexus/HYG-Database/main/hyg/CURRENT/hygdata_v41.csv -o /private/tmp/sky-hyg.csv curl -sS --max-time 30 -L --fail https://raw.githubusercontent.com/Stellarium/stellarium-skycultures/2d80ce70984c14bba7da2d31a0f9b27e292861c9/western/index.json -o /private/tmp/sky-constellations.json cd tools/sky-check GOCACHE=/private/tmp/m31-sky-go-cache go run ./catalog -csv /private/tmp/sky-hyg.csv -lines /private/tmp/sky-constellations.json -out ../../sky/catalog.js GOCACHE=/private/tmp/m31-sky-go-cache go test -count=1 ./... ``` Генератор и все проверки написаны на Go. Для выполнения **фактического production `astronomy.js`** тесты используют установленный Node через `vm.runInNewContext` (без npm-зависимостей и сетевого доступа). Они сверяют GMST с USNO на всём диапазоне лет, прецессию с численным эталоном ERFA, 1 200 направлений с независимым базисом наблюдателя, полюса, собственные движения, восток/запад, реальные звёзды в обоих полушариях, сдвиг времени, явные UTC-смещения и невозможные календарные даты. Проверяются также уникальность id и все концы линий созвездий. Тесты каталога объектов независимо разбирают исходную сексагезимальную CSV, сверяют JSON и classic script, существование локальных материалов, геометрический горизонт и изменение объекта со временем. Разбор deep links проверяется при четырёх разных `TZ` процесса; невозможные даты, не-UTC время, дробный часовой offset, повторные/опасные/чрезмерно длинные параметры проверяются Go. Дополнительный минимальный DOM/Canvas-адаптер запускает production `app.js` через Node VM и позволяет Go проверить переходы выбора, смену фото и ссылки, очистку устаревшего `src`, отключение слоя, сохранение карточки под горизонтом и после изменения наблюдения. Этот адаптер не проверяет пиксели или native accessibility — для них нужны браузерные проверки. Используется `-count=1`: production JS читает дочерний Node, поэтому нельзя полагаться на отслеживание этих файлов стандартным Go test cache. ## Встраивание ```html ``` На широком экране карта помещается в высоту iframe/окна; настройки имеют собственную прокрутку. На узком экране настройки места и времени свёрнуты, карта и остальные элементы идут вертикально. Если применяется iframe sandbox, необходим `allow-scripts`; `allow-same-origin` нужен только для свободного доступа родительского сайта к DOM карты, которого сама карта не требует. Карта ничего не отправляет родителю через postMessage. Ссылка из статьи или блока «Сегодня»: ```text /sky.html?object=m31&lat=59.9386&lon=30.3141&time=2026-11-05T17:00:00.000Z&tz=180 ``` Wrapper передаёт в `/sky/index.html` только whitelist `object`, `lat`, `lon`, `time`, `tz`. `object` — известный id каталога, `lat`/`lon` — конечные десятичные числа в диапазонах ±90/±180, `tz` — целое число минут UTC offset от −720 до +840. `time` — абсолютная ISO UTC дата со временем до секунд, опционально 1–3 знаками миллисекунд и обязательным `Z`. Диапазон 1900–2100 проверяется по **локальному отображаемому году после `time + tz`**, согласованно с формой: начало 1900 года в UTC+14 может иметь UTC год 1899, конец 2100 года в UTC−12 — UTC год 2101. Обратный случай (UTC год внутри диапазона, локальный год снаружи) отклоняется. Одинаковое UTC время остаётся тем же мгновением при любом `tz` и поясе ОС. `tz` меняет показ формы, а не UTC входной ссылки. Повторный известный ключ отклоняется целиком; поля проверяются независимо, ошибки имеют текстовое сообщение без отражения пользовательского HTML. Неизвестные ключи игнорируются. Без времени используется текущее мгновение. Ссылка только `?object=m31` разрешена. Выбор под горизонтом открывает карточку, но не рисует маркер. Готовность для интеграционных проверок: `document.documentElement.dataset.skyReady === 'true'`. Стабильные `id` контролов определены в `index.html`; карточка выбранной звезды — `#star-card`, фактические HIP и координаты — её `data-*` атрибуты. Список объектов — `#object-select`, слой — `#show-objects`, карточка — `#object-card`, фотография — `#object-image`, ссылка — `#object-article`. Карточка содержит `data-object-id`, `data-altitude`, `data-azimuth`, `data-above-horizon`, `data-layer-enabled`; Canvas — `data-visible-objects`, `data-rendered-objects`, `data-rendered-object-ids`. Последние отражают попавшие в текущий кадр маркеры, а не только геометрическую высоту.