# Источники и устройство карты M31 Карта использует только локальные файлы. Координаты посетителя остаются в браузере; геолокация, внешние API, шрифты и телеметрия не запрашиваются. CSV-слои Gaia и NGC загружаются с того же сайта при выборе. Внешние ссылки на источники открываются только по действию посетителя. ## Яркие звёзды, названия и параметры **HYG Stellar Database v4.1**, David Nash / Astronexus, Hipparcos, Yale Bright Star Catalogue и Gliese. [Источник и описание полей](https://github.com/astronexus/HYG-Database/tree/main/hyg). Git blob CSV `ba2dec4eb0f6768914c7fc1051258100214ddf84`, файл `hygdata_v41.csv`, 33 932 548 байт. [Лицензия CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/), исходное уведомление — [vendor/HYG-LICENSE.txt](vendor/HYG-LICENSE.txt). Репозиторий автора архивирован, разработка перенесена на Codeberg; карта использует указанную фиксированную версию. В `catalog.js` оставлены **5071 звезда**: V ≤ 6,0, кроме Солнца, и все опорные звёзды линий созвездий (некоторые слабее V=6). Поля: `id, raDegJ2000, decDegJ2000, magV, bv, name, designation, con, pmRaCosDecMasYr, pmDecMasYr`. Положительный id — HIP; отрицательный — минус HYG id для записи без HIP. RA переведено из часов в градусы. Эпоха и равноденствие — J2000. Цвет приблизительно отражает B−V, размер точки — блеск; это не физический диск звезды. `star-names.js` показывает обозначения Байера/Флемстида по-русски: `9Alp Cam` → «Альфа Жирафа», `Alp1Cen` → «Альфа¹ Центавра». Сохранены собственные имена и исходные HIP/Gaia id. Названия не участвуют в расчётах. При увеличении появляются подписи менее ярких звёзд. `star-details.js` содержит локальные профили с источником каждого поля: - Спектр и расстояние — HYG. `dist=100000` означает неизвестное расстояние и не выводится. Оставлено 4966 расстояний, без выдуманных ошибок. - Температура — Gaia DR3 GSP-Phot/ESP-HS, **модельная оценка**, либо явно указанная научная публикация. Всего 1310. K переведены в °C вычитанием 273,15; пк в световые годы — множителем 3,261563777. Интервалы 16–84% или неопределённости Gaia сохранены в профиле и пояснении значения. - GSP-Phot не используется для горячих O/B/A спектров и решений у границ библиотек; для FGKM оставлены 3000–9000 K с согласованными интервалами. Это фильтр для обзорной карты, не полноценная научная валидация всех flags. Оценки не являются гарантированными точными измерениями компонентов систем. - Проекция вращения **v sin i**, км/с — [Bright Star Catalogue 5, Hoffleit & Warren (1991), NASA/HEASARC](https://heasarc.gsfc.nasa.gov/W3Browse/star-catalog/bsc5p.html), сопоставление по HR из HYG. Сохранены знаки пределов и флаги неточности. Доступные пригодные ESP-HS оценки с неопределённостью имеют приоритет. Всего 2782 значения; HYG `rv` и Gaia `vbroad` вращением не подменяются. - Для HIP22783 / Альфы Жирафа HYG не даёт расстояния. Неподходящая оценка GSP-Phot ≈9998 K исключена. Принято ≈29 000 K по [Marcolino et al. (2022), Table 1, HD30614](https://arxiv.org/abs/2202.07811), BSC5P даёт v sin i=95 км/с. Разные работы могут давать другие оценки. [Описание Gaia astrophysical_parameters](https://gaia.aip.de/metadata/gaiadr3/astrophysical_parameters/). HYG сохраняет CC BY-SA 4.0, Gaia — CC BY-NC 3.0 IGO; библиографическое авторство BSC и первичной статьи указано отдельно. SHA256 входов и ссылки сохранены в `star-details.js`. Пропуски не восстанавливаются по догадке или только из цвета; из карточки доступен SIMBAD. ## Gaia DR3 до G=12 **ESA/Gaia/DPAC**, доступ через AIP, [gaia_source](https://gaia.aip.de/metadata/gaiadr3/gaia_source/), [CC BY-NC 3.0 IGO](https://creativecommons.org/licenses/by-nc/3.0/igo/). This work has made use of data from the European Space Agency (ESA) mission Gaia (https://www.cosmos.esa.int/gaia), processed by the Gaia Data Processing and Analysis Consortium (DPAC, https://www.cosmos.esa.int/web/gaia/dpac/consortium). Funding for the DPAC has been provided by national institutions, in particular the institutions participating in the Gaia Multilateral Agreement. Запрос AIP asynchronous TAP: `SELECT source_id,ra,dec,ref_epoch, phot_g_mean_mag,bp_rp,pmra,pmdec FROM gaiadr3.gaia_source WHERE phot_g_mean_mag <= 12`. Полная выгрузка: 3 087 828 строк, 374 072 986 байт. После удаления 3950 официальных совпадений HYG по `gaiadr3.hipparcos2_best_neighbour` осталось **3 083 878 звёзд**. Gaia G отличается от визуального V HYG: фильтр подписан с указанием полос. `gaia/index.json` и `g01.csv.gz` … `g12.csv.gz` — по одному обычному CSV на целый слой величины. Слой 1 включает все звёзды ярче первой величины, остальные — `(n−1,n]`. CSV: `source_id,ra_deg,dec_deg,g_mag,bp_rp, pm_ra_cosdec,pm_dec`. source_id хранится как uint64/BigUint64/строка, не JS Number. Координаты — ICRS, эпоха 2016.0; собственное движение отсчитывается от 2016, затем применяется прецессия осей J2000 к дате. Малое различие ICRS/FK5 не моделируется. Отсутствующее движение принято нулевым; неизвестный цвет имеет нейтральный тон. | Слой | Дополнительных звёзд Gaia | | --- | ---: | | ≤1 | 0 | | 1–2 | 6 | | 2–3 | 53 | | 3–4 | 158 | | 4–5 | 388 | | 5–6 | 2284 | | 6–7 | 14501 | | 7–8 | 41390 | | 8–9 | 114700 | | 9–10 | 304679 | | 10–11 | 765134 | | 11–12 | 1840585 | Всего gzip CSV **95 055 324 байта**; по умолчанию загружаются только 1–6. Оба конца диапазона изменяются независимо. Разбор и проекция работают в Web Worker с потоковой распаковкой; загруженные слои остаются в памяти до закрытия карты. Все G12 требуют существенно больше памяти, чем исходный набор. Внутренний индекс ячеек ускоряет глубокий зум, отдельные файлы ячеек не скачиваются. Manifest содержит количество записей и SHA256 каждого слоя. Nginx должен отдавать `.csv.gz` как сохранённые gzip-байты **без** заголовка `Content-Encoding: gzip`: распаковку делает Worker. Это обычные файлы с именем `.csv.gz`, не результат `gzip_static` для запроса `.csv`. CSP разрешает только self для script/worker/connect. Поддержка Worker, DecompressionStream, BigUint64Array и OffscreenCanvas нужна для Gaia; без доступного дополнительного слоя основная карта HYG остаётся доступной. ## Созвездия **Stellarium Western sky culture**, Stellarium’s team, commit `2d80ce70984c14bba7da2d31a0f9b27e292861c9`, [источник](https://github.com/Stellarium/stellarium-skycultures/tree/2d80ce70984c14bba7da2d31a0f9b27e292861c9/western). Только `constellations[].lines` и IAU id: 88 созвездий с русскими названиями. [Исходное авторство и CC BY-SA](vendor/STELLARIUM-WESTERN-DESCRIPTION.md) сохранены без добавления версии лицензии. Иллюстрации, астеризмы и границы IAU из Stellarium не включены. `Tra` нормализовано к `TrA`, толщины линий унифицированы. Линии — традиционные рисунки, не границы созвездий. ## Мессье, NGC и схемы **OpenNGC**, Mattia Verga и участники, закреплённый commit [be3cd6c5498806a2fbb2f7e0452ef802dbb02be0](https://github.com/mattiaverga/OpenNGC/tree/be3cd6c5498806a2fbb2f7e0452ef802dbb02be0), [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/). Уведомления: [Copyright](vendor/OPENNGC-COPYRIGHT.txt), [Authors](vendor/OPENNGC-AUTHORS.txt), [License](vendor/OPENNGC-LICENSE.txt), [определения полей](vendor/OPENNGC-GUIDE.txt). `objects.json` / сгенерированный `objects.js` — **все 110 объектов Мессье**, включены по умолчанию. M40 — оптическая двойная, M73 — астеризм. M102 сопоставлена с NGC5866, с историческим разночтением в статье; так поступает [каталог Hubble NASA](https://science.nasa.gov/mission/hubble/science/explore-the-night-sky/hubble-messier-catalog/). Неправленые исходные 110 строк сохранены в `vendor/OPENNGC-SELECTED.csv`; исключение M102 проверяется явно, а не правкой исходного cross-reference. Для каждого объекта есть русская статья и **реальная локальная фотография** в `/astronomy/messier/`. Полное авторство, лицензия конкретного снимка, источник, преобразование, SHA256 и размеры — в [manifest](../astronomy/messier/manifest.json) и под снимком. Это 110 разных фотографий, 17 485 051 байт; цвета/поле снимка описаны отдельно. Исторические статьи и фото сайта сохранены; их старые численные оценки не используются в координатах карты. Из старых M31/Плеяд доступен переход на карту, из карты — в новые статьи. `ngc.json` загружается только при включении NGC: **7992 дополнительные записи**, ещё 106 объектов уже представлены Мессье. Всего 8098 записей с компонентами — это не утверждение о 8098 отдельных исторических номерах. IC не включён. Пропущены Dup/NonEx и строки без координат; неопределённые V/размеры/позиционный угол сохранены null. Общие объекты не дублируются, при отключении Мессье могут оставаться видны через NGC. Типы фильтруются отдельно. NGC-карточка ведёт в SIMBAD; отдельные статьи/фото NGC ещё не подготовлены и не подменяются статьями о другом объекте. `object-symbols.js` использует морфологию Hubble, тип, угловые оси и позиционный угол от севера к востоку, если они известны. Ориентация пересчитывается вместе с проекцией неба. Спиральные рукава/перемычка, диффузное ядро, пылевая полоса, кольцо или лопасти, волокна, центральная концентрация звёзд различают структуры. M40 рисуется двумя звёздами, M73 — четырьмя. Это **условные схемы**, не реконструкция по пикселям фото: положения звёзд внутри схем скоплений не астрометрические. На обзоре маленькая схема имеет минимум 7 CSS px; при увеличении растёт по каталожному угловому размеру. Неизвестные оси/угол заменяются условным рисунком, исходные поля от этого не заполняются. Геометрический горизонт скрывает центры объектов ниже 0°; выбранная карточка сохраняется. ## Вычисления и ограничения Явный фиксированный UTC offset, GMST+долгота, IAU 1976 precession, касательные собственные движения без деления на cos δ, горизонтальный единичный вектор и азимутальная равнопромежуточная проекция с зенитом в центре. Восток слева, как на карте над головой. Линии созвездий интерполируются по большим кругам и обрезаются горизонтом. Первичные методические источники: [USNO sidereal time](https://aa.usno.navy.mil/faq/GAST), [USNO altitude/azimuth](https://aa.usno.navy.mil/faq/alt_az), [ERFA pmat76](https://github.com/liberfa/erfa/blob/master/src/pmat76.c) и [численные эталоны ERFA](https://github.com/liberfa/erfa/blob/master/src/t_erfa_c.c). Диапазон локальных дат **1900–2100**. Не моделируются нутация, аберрация, параллакс, перспективное ускорение, рефракция, UTC→UT1, рельеф и погода. Солнце, Луна, семь планет и четыре галилеевых спутника рассчитываются отдельно по выбранной дате/месту: [эфемериды и фотоатласы](solar/SOURCES.md). Включаются своим слоем, независимо от звёзд и Мессье. Топоцентрический параллакс Луны учтён; её фотографическая карта освещается по направлению Солнца. У планет — текстуры и фазы, у Сатурна — кольца. Спутники Юпитера показываются условными точками при увеличении; кнопка «Система Юпитера» подбирает поле для всех четырёх. Другие спутниковые системы не включены. Расчёты — Astronomy Engine 2.1.19, MIT; исходные текстуры Solar System Scope / INOVE на основе материалов миссий — CC BY 4.0. Десять файлов занимают 4 759 436 байт, оригинальные SHA256/авторство — solar/textures.json. Проекция фотографических карт работает в отдельном Worker с ограниченным кэшем, чтобы большой диск не блокировал управление. Это обзорная карта, не инструмент точного наведения. Дневное небо тоже показано тёмным; наличие точки над горизонтом не обещает её реальную видимость при засветке или днём. Зум до 65 536× для различимых дисков Урана и Нептуна. «Рассмотреть диск» подбирает масштаб по угловому размеру тела и окну. На обзоре маленькие диски увеличены условно, физический диаметр виден в карточке. Кнопка вида по кругу: оформление M31 → меню карты и карта без оформления сайта → только карта → M31. Дата, диапазон, выбор и зум сохраняются. Ночной режим сохраняется локально: точный чёрный фон и красное изображение/меню; переключение — кнопкой Луны/Солнца рядом с zoom. Родитель получает только palette/view через same-origin postMessage; Vue принимает их только от собственного iframe. Это локальная смена оформления, а не отправка координат во внешний сервис. ## Генераторы и проверки Из `tools/sky-check`, после отдельной загрузки закреплённых исходников: ```sh go run ./catalog -csv /private/tmp/sky-hyg.csv -lines /private/tmp/sky-constellations.json -out ../../sky/catalog.js go run ./gaia -csv /private/tmp/m31-gaia-g12.csv -hip /private/tmp/m31-gaia-hip.csv -hyg ../../sky/catalog.js -out ../../sky/gaia-new -expected-rows 3087828 go run ./stellar -hyg /private/tmp/sky-hyg.csv -gaia /private/tmp/m31-gaia-physical.csv -bsc /private/tmp/m31-bsc5p.tdat.gz go run ./deepsky -csv /private/tmp/m31-opengc-full.csv -addendum /private/tmp/m31-opengc-addendum.csv go run ./objects -check go test -count=1 ./... ``` Gaia importer требует новый выходной каталог и точное ожидаемое количество строк, отклоняет дубликаты, неверные эпохи и координаты. SHA256 входов сохранены. BSC5P dump: `https://heasarc.gsfc.nasa.gov/FTP/heasarc/dbase/dump/heasarc_bsc5p.tdat.gz`. Профили получены по official HIP crossmatch и Gaia astrophysical_parameters. Проверки написаны на Go; Node VM исполняет настоящий production JS без npm-зависимостей. Проверяются эталоны USNO/ERFA, 1200 независимых направлений, полюса/PM/восток-запад, даты/offset/deep links в четырёх TZ, карточки и слои, каталожные координаты, null-значения, названия и физические источники. Для JS используют `-count=1`: дочерний Node не отслеживается Go test cache. Native Worker/распаковка/пиксели и fullscreen проверяются браузером в `tools/integration-check`, а не подменяются Canvas-моком. ## Встраивание и ссылки ```html ``` На широком экране слева прокручиваемое меню, всё остальное — карта. На узком меню открывается вручную кнопкой и закрывается после выбора. Same-origin нужен для локальных загрузок и сообщения родителю; при sandbox нужны `allow-scripts allow-same-origin`. Без fullscreen API работают те же три режима в пределах окна. `/sky.html?object=m31&lat=59.9386&lon=30.3141&time=2026-11-05T17:00:00.000Z&tz=180` Wrapper передаёт whitelist object/lat/lon/time/tz. object — известный Messier id или sun/moon/mercury/venus/mars/jupiter/saturn/uranus/neptune/ io/europa/ganymede/callisto; lat/lon — конечные десятичные числа ±90/±180, tz — целое число минут −720…840. time — ISO UTC с секундой, необязательными 1–3 знаками миллисекунд и Z. Диапазон проверяется по локальному году после time+tz; пограничные UTC 1899/2101 допустимы только при локальном 1900/2100. Без времени берётся текущее мгновение. Дубликаты ключа отклоняются, ошибки независимы и не отражают пользовательский HTML. NGC deep links пока не поддерживаются: сначала включите NGC и выберите объект в списке. Для QA: `document.documentElement.dataset.skyReady==='true'`, карточки `#star-card/#object-card` и их data-id/altitude/azimuth/layerEnabled; Canvas `data-rendered-objects/data-rendered-object-ids`, `data-zoom`, `data-gaia-loaded/data-gaia-layers/data-gaia-requests/data-rendered-gaia`. Первичная готовность skyReady не означает окончания дополнительной загрузки.