やり方
暗い星
UCAC4の星を、さらに約250万個、12等まで。見ている空の部分のタイルだけを読み込みます。地図を拡大すると描かれます。UCAC4が自分で測った星だけで、ヒッパルコスやティコからコピーしたものは入っていません。明るい星のそばのゴーストは除いてあり、明るいほうの星の等級はAPASS DR10のものです。
明るい星の表は6.0等でおわりです。@johnmorrisdotca/hoshi-stars/faintは、UCAC4(アメリカ海軍天文台の第4版CCDアストログラフ星表)から、12等までの星を2,461,864個足します。コードでも、1つの大きな表でもありません。空を区切(くぎ)った小さなファイルで、ページは、いま見ている空の部分のタイルだけを読み込みます。メインのimportの大きさは変わらず、/faintをimportしないページには、まったく影響がありません。
数字の中身
- 位置: UCAC4の、ICRS上のJ2000.0の位置で、誤差は1秒角(びょうかく)より小さい値です。固有運動(こゆううんどう)は入っていません。
- 等級: 12等という限界は、UCAC4がその星のAPASSのV等級(ティコなどから借りたものではない、APASS自身の値)を持っていればそれで、持っていなければUCAC4自身のモデル等級で決まります。モデル等級はVとRのあいだ(579〜642 nm)の光で測ったもので、Vではありません。どちらも0.05きざみで入っています。コピーとして外した行を除く4,709,853行のうち、4,308,852行にAPASSのV、401,001行にモデル等級だけがありました。227,998個の星では、かわりにAPASS DR10のVを使っています。 UCAC4自身の明るい星のVは暗すぎるからです(明るいほうの星の等級)。
- 色: APASSのB-Vの色指数(しきしすう)で、0.0125きざみです。2,250,647個にあり(うち155,858個はAPASS DR10のもので、Vと同じ出どころです)、211,217個(100個に9個)にはありません。色の値がない星は、うすい色で描かれます。
- ヒッパルコス、ティコ、ガイアの値は入っていません。 欧州宇宙機関(ESA)は、これらを非商用のライセンスで配っていて、MITライセンスのパッケージはそのまま渡せません。UCAC4はこれらの値を一部コピーしているので、ビルドでは、UCAC4自身がそう印をつけた行をすべて外しました。天体種別6(FK6、ヒッパルコス、ティコ2から位置を置きかえたもの。34,472行)、種別7(それらから足した星で、CCDのデータがないもの。4,215行)、種別4(外部の高固有運動のデータ。出どころは書かれていません。4,932行)です。記録のVやBがティコのものである場合(出どころのフラグが立っていて、APASSの誤差が0)は、それを使わず、72,164個はモデル等級にしました。同じビルドで、明るい星5,080個にすでに入っている45個と、明るい星のハロー(光のにじみ)の中にあるゴースト675個も外しています(明るい星のそばのゴースト)。
- わざと残したもの: ゴーストを外す前に残っていた2,462,539個のうち2,027,855個は、ティコ2へのクロスリファレンス(UCAC4がその星をティコ2と照合したので、出どころのフラグが立っています)を持っていますが、位置と等級はUCAC4自身の測定です。これらは残しました。よりどころにした文は、データとライセンスと
NOTICE.mdにあります。
どれだけあるか、どこが少ないか
等級ごとの数です(星は、その星が入る0.5等の区間で数えます。8.0は、8.0以上8.5未満です。12.0は、ちょうど12.0の星です)。
| 等級 | 星の数 | 等級 | 星の数 |
|---|---|---|---|
| 6.0〜6.5 | 7 | 9.5〜10 | 133,018 |
| 6.5〜7 | 22 | 10〜10.5 | 243,186 |
| 7〜7.5 | 466 | 10.5〜11 | 358,575 |
| 7.5〜8 | 7,350 | 11〜11.5 | 561,902 |
| 8〜8.5 | 21,686 | 11.5〜12 | 882,721 |
| 8.5〜9 | 48,734 | ちょうど12.0 | 113,789 |
| 9〜9.5 | 90,408 |
6等から8.5等のあいだは、この層はまだ星が少ないです(6.5〜8等は7,838個で、実際の空には約33,600個あります。7.5〜9等は77,770個で、空には約99,000個あります)。UCAC4がヒッパルコスとティコからコピーしただけの星は明るい星ばかりで、それがちょうど外した行だからです。下の2つの修正の前は、6.5〜8等は3,138個、7.5〜9等は48,474個でした。本当は8等の星が、この層では9等で入っていたので、帯が実際より薄く見えていました。地図は、どこまでそろっているかを示します(ここでは9.5等の星まで見えています)。その数字は、この層自身の数から出しています。
この帯を埋める星は作ってあり、ファイルとして残してありますが、まだタイルには入れていません。 2つの出どころからそれぞれ作って比べました(リポジトリのdocs/research/gap-6.5-8.md)。SAO星表(この層にない星を、6.0〜9.0等で30,459個足せます。うち6.5〜8等が22,012個で、空全体をおおいます。利用条件は、NASAのHEASARCの返事待ちです)と、2MASSの位置を使ったAPASS(16,602個。条件ははっきりしていますが、APASSには赤緯+20度より北に明るい星がありません)です。ライセンスの文はNOTICE.mdにあります。SAOの条件がはっきりしたら、python3 scripts/make-faint-data.py build --gap saoで、SAOをレベル0に取り込みます(取り込みでは、この層の星から5秒角以内で、等級の差が2等以内のSAOの星は外されます)。
明るい星のそばのゴースト
UCAC4には、明るい星のハロー(光のにじみ)の中に、星ではない検出が入っています。明るい星5,080個のうち516個に、20秒角(びょうかく)以内に暗い星が1つありました。また595個には、ハローの届く範囲にゴーストが少なくとも1つありました。これを除く決まりは次のとおりです。
- どこか。 視等級Vの明るい星から、30秒角×10^(0.2×(5.5−V))以内(ただし120秒角まで)にある星は、その星のハローの中にあります。6等の星のまわりは24秒角、4等は60秒角、3等は95秒角、2.5等より明るい星はどれも120秒角です。この数字は、5,080個のまわりに輪をかけて暗い星を数えて決めました。10秒角以内では、星の密度(みつど)が、ハローから離れた背景の30〜40倍でした。ゴーストがどこまで続くかは2MASSでの確認でわかります。5〜6等の明るい星のまわりでは、15〜20秒角で確認される星は約4個に1個、20〜30秒角で2個に1個、30〜45秒角で5個に4個、遠いところでは10個に9個です。
- 確認できなければ外す。 ハローの中にある星は、2MASS(2ミクロン全天サーベイの星表で、アメリカ政府の著作物です。UCAC4自身のAPASSのVとちがって、独立した2つ目の星表です)の点源(てんげん)が2秒角以内にあり、その点源に残像(ざんぞう)、回折スパイク、縞(しま)、ハローのいずれのフラグも立っておらず、J等級が星のVと比べて極端でない(V−Jが−1から4.5まで)場合にだけ残します。それ以外は外します。明るい星から5秒角以内にある星で、2MASSの点源がその明るい星自身のものしかない(Jが、その星のVに1を足した値より暗くない)場合は、明るい星が誤った等級でもう一度出てきたものなので、これも外します。2MASSでも検出される本物の伴星(はんせい)は残ります。
- 数。 ハローの中の星は857個でした。そのうち182個は確認できて残し、675個を外しました(内訳は、UCAC4の天体種別5が560個、種別8が52個、種別1が37個、種別0が18個、種別3が8個)。明るい星のうち595個から、1個以上のゴーストがなくなりました。20秒角以内に暗い星がある明るい星は、516個から21個になりました。同じように輪で数えると、10秒角以内の密度は、背景の30〜40倍から、3倍以下になりました。
- 天体種別1は使っていません。 UCAC4は「明るすぎて飽和した星の近く」を種別1としていて、残した星のうち82,604個(100個に3.4個)がこの印を持っています。これらはゴーストではありません。無作為に選んだ4,000個のうち3,873個が同じ2MASSの検査で確認でき、ふつうの星でも4,000個のうち3,835個が確認できます。この印は、どんな飽和した星の近くでもつくので、これで外すと本物の星まで外れます。
- まだ見ていないもの。 見ているのは、明るい星5,080個のハローだけです。このほかに、もっと暗い飽和した星(6〜8等で、この層に明るい星としては入っていないもの)のハローと、ほかの場所のUCAC4の天体種別5、8、9は見ていません(チケットが開いています。これらのサンプルは、ふつうの星よりずっと少ない割合でしか2MASSで確認できません)。
python3 -I scripts/make-faint-data.py build --ghosts offで、この決まりなしでビルドします。
明るいほうの星の等級
この層のUCAC4の星の等級は、APASS DR6のV(UCAC4が持っているもの)か、UCAC4自身のモデル等級です。APASSはV 7〜10等のあたりで飽和し、モデル等級は明るい星に合わせて較正(こうせい)されていないので、星が暗く出ます。APASS DR10とSAO星表(この2つは互いによく合います)と比べると、本当は7.5〜8等の星は、この層では中央値で0.95等暗く入っていました。APASS DR10にその星があれば、そのVをタイルに使います。 BとVの誤差がどちらも0.1未満なら、DR10のB-Vも使います。
- どの星か。 APASS DR10の星で、Vが7.0(AAVSOのページに「V=7より明るいものは使えません」とあります)から10.2まで、赤緯+20.0より南、Vの誤差が0.3以下で、この層の星から5秒角以内にあり、その星の等級が、APASSのVとくらべて、明るいほうへ0.5等まで、暗いほうへ2.5等までの差におさまるもの。APASSの星1つに、UCAC4の星は1つ(近いほう)です。APASSの星250,380個を読み、10,199個はVの誤差が0.3を超え、12,013個は近くにこの層の星がなく(UCAC4がコピーしただけで外した星です)、170個はより近いAPASSの星と同じ星を取り合い、227,998個の星がDR10のVを使い、そのうち155,858個は色もDR10のものです。
- どれだけ変わったか。 DR10のVごとの、UCAC4のVからDR10のVを引いた値の中央値は、7.0〜7.5等で+1.20(404個)、7.5〜8等で+0.95(6,383個)、8〜8.5等で+0.70(17,059個)、8.5〜9等で+0.40(28,597個)、9〜9.5等で+0.20(45,976個)、9.5〜10等で+0.05(64,774個)、10〜10.2等で0.00(64,805個)です。64,528個の星は、UCAC4の等級より0.25等以上明るくなり、32,810個は0.5等以上、6,397個は1等以上明るくなりました。2,916個は0.25等以上暗くなりました(2つのAPASSのリリースは、飽和の近くで食いちがいます)。
- APASSの終わるところ。 APASS DR10は、赤緯+19度から+20.5度までは、明るい星(V 7.0〜9.2)が1平方度あたり2.7〜3.3個、+20.5度から+20.6度のあいだは1.6個、+20.6度から先は0.3〜0.5個です。およそ+20.5度より北には、あるべき星の10分の1しかなく、+20.0度より北の星は補正されません。 空の3分の1(100に33)です。その3分の1にある8.5〜10等の約100,000個の星は、SAO星表と比べると、8.5〜9.5等で0.4等ほど暗く出ていて、APASSにない南の約36,000個の星も、おそらく同じです。タイルの形式には、星ごとの印を入れる場所がないので、
faint-tiles/index.jsonが、タイルごとにAPASSのVを使った星の数を示します(apassV.tiles。合計と、等級の区間ごとの中央値の変化もあります)。 - 残りにはオフセットを使いません。 等級ごとに一律に補正する方法(補正できた星の変化の中央値で、UCAC4の8.0と8.25等で0.1、8.75と9.0等で0.35〜0.45、9.5等で0.15)を使うと、SAOとの差の中央値は、8.0〜9.5等ではどの空の区域(+20度より南、+20〜+60度、+60度より北)でも0.15等以内になります。しかし、星1つ1つの誤差は約0.9等の幅に広がっていて(UCAC4の8.75等で、16〜84パーセンタイルが+0.05〜+0.95)、星が特定の区間に集まりすぎます。8.5〜8.75等の4分の1等の区間に39,572個が入り、実際の空には約22,300個です。だから使いません。数字は
docs/research/gap-6.5-8.mdにあります。 - SAO用のオプション。
python3 -I scripts/make-faint-data.py build --correct apass,saoは、UCAC4が9.5等かそれより明るいとしていて、APASSで補正されなかった星(67,713個)に、SAOのVも使います。NASAのHEASARCがSAOの利用条件を確認するまで待ち(NOTICE.md)、それまでにSAOの等級がタイルに入っていたら、テストが失敗します。
4分の1等ごとの数を、2つの修正の前と後、そして空にある数(イェール輝星カタログと掃天星表(そうてんせいひょう)の星の数から出したモデルで、誤差は100に15ほど)と並べます。
| 等級から | 前 | 後 | 空にある星の数(約) |
|---|---|---|---|
| 7.00 | 32 | 62 | 4,400 |
| 7.25 | 206 | 404 | 5,800 |
| 7.50 | 920 | 2,179 | 7,600 |
| 7.75 | 1,917 | 5,171 | 9,900 |
| 8.00 | 3,715 | 9,038 | 13,000 |
| 8.25 | 5,844 | 12,648 | 17,000 |
| 8.50 | 11,863 | 19,164 | 22,300 |
| 8.75 | 24,215 | 29,570 | 29,200 |
| 9.00 | 39,282 | 39,684 | 38,300 |
| 9.25 | 55,277 | 50,724 | 50,200 |
python3 -I scripts/make-faint-data.py build --correct noneで、補正なしでビルドします。--correct none --ghosts offでは、バージョン0.18.1のタイルとバイト単位で同じものができます。
タイル
タイルは空の長方形です。赤緯(せきい)の帯を、赤経(せっけい)の向きに区切(くぎ)ったものです。レベルは3つあって、広い範囲を見るときは少なくて粗(あら)いタイル、深く(暗い星まで)見るときは細かいタイルを読み込みます。
| レベル | 入っているもの | 帯 | タイル | 星 |
|---|---|---|---|---|
| 0 | 10等まで | 18(高さ10°) | 442 | 321,122 |
| 1 | 10等から11等 | 30(高さ6°) | 1,192 | 628,815 |
| 2 | 11等から12等 | 36(高さ5°) | 1,704 | 1,511,927 |
ファイルは星1つにつき6バイトです(いちばん大きいタイルでも30 kB未満)。全部で14.8 MB、gzipで約12.6 MBです。FAINT_LEVELSとfaintGrid(level)が区切りかたを、faintTileBounds(tile)がタイルのおおう空の範囲を、faintTilePath(tile)がファイルの場所(L2/17-16.bin)を返します。faintTilesFor(field, limit)は、ある等級までの星のために、円形の空の部分に必要なタイルを、明るいレベルから順に返します。限界が9なら、必要なのはレベル0だけです。
import { faintTilePath, faintTilesFor } from "@johnmorrisdotca/hoshi-stars/faint";
const orion = { rightAscension: 83.8, declination: -5.4, radius: 1 };
console.log(faintTilesFor(orion, 12).map(faintTilePath).join(" ")); // L0/8-8.bin L1/13-13.bin L1/14-13.bin L1/14-14.bin L2/16-16.bin L2/17-16.bin
console.log(faintTilesFor(orion, 9).map(faintTilePath).join(" ")); // L0/8-8.binL0/8-8.bin L1/13-13.bin L1/14-13.bin L1/14-14.bin L2/16-16.bin L2/17-16.bin
L0/8-8.binタイルのある場所
タイルはnpmパッケージには入っていません(12.6 MBだと、パッケージ本体の10倍の大きさになってしまいます)。リポジトリのfaint-tiles/フォルダと、デモのGitHub Pagesのサイトにあり、リリースごとのPagesのビルドには、そのリリースのタイルが入っています。FAINT_TILES_URL(https://johnmorrisdotca.github.io/hoshi-stars/faint-tiles/)が、faintSkyが初期設定で見にいく場所です。自分で用意したコピー(静的ファイルのフォルダ。自分のサーバーで配る)や、リポジトリのどのファイルでも配るjsDelivrから読みたいときは、baseUrlを渡します。
使う
faintSky(options)は小さな読み込み役です。空の部分に必要なタイルを、渡したfetch(なければ、グローバルのfetch)で取ってきて、デコードし、新しいほうから256個まで残します。load(field, limit)は足りないものを取ってきて、stars(field, limit, max)は、いまあるものから答えます。maxを渡すと、明るいほうからmax個を残し、depthは、その一覧がそろっている等級を示します。loadedは、その部分に必要なタイルがすべてあるかどうかを示します。
import { readFile } from "node:fs/promises";
import { faintSky } from "@johnmorrisdotca/hoshi-stars/faint";
// In a page, `faintSky()` fetches from FAINT_TILES_URL. Here the tiles are read from a folder, so that the example runs offline.
const sky = faintSky({
baseUrl: "faint-tiles/",
fetch: async (path) => {
const bytes = await readFile(path);
return { ok: true, status: 200, arrayBuffer: async () => bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) };
},
});
const orion = { rightAscension: 83.8, declination: -5.4, radius: 1 };
await sky.load(orion, 12);
const all = sky.stars(orion, 12);
const capped = sky.stars(orion, 12, 100);
console.log(all.loaded, all.stars.length, all.depth); // true 182 12
console.log(capped.stars.length, capped.depth); // 99 10.9
console.log(all.stars[0].magnitude, all.stars[0].colourIndex); // 7.3 -0.125true 182 12
99 10.9
7.3 -0.125ブラウザーでは、渡すfetchがいらないだけで、あとは同じです。
import { faintSky } from "@johnmorrisdotca/hoshi-stars/faint";
const sky = faintSky();
await sky.load({ rightAscension: 299, declination: 40, radius: 2 }, 12);自分でデータを取ってくるページのために、faintSkyの部品は単独でも使えます。decodeFaintTile(tile, bytes)は、タイルのファイルをFaintTile(rightAscension、declination、magnitude、colourIndex(ない星はNaN)を、それぞれ同じ長さの配列にしたもので、赤緯の順に並びます)にします。faintStarsIn(tiles, field, limit, max)は、手元のタイルから、空の部分の星を選びます(faintStarsWithTilesは同じことをして、各星の元のタイルと、位置か等級が有限の数でないために除いた星の数も返します。データの入口が使います)。星はFaintStarで、rightAscension、declination、magnitude、colourIndex(ない星はundefined)を持ちます。読み込み役の設定はFaintSkyOptions(baseUrl、fetch、maxTiles)で、返すものはFaintSkyです。タイルのファイルは、星1つにつき1バイトずつの6つの面(プレーン)で、decodeFaintTileの説明にあります。中心の部分は純粋(じゅんすい)で、時計もDOMも使いません。入出力をするのはfaintSkyだけで、それも、渡されたfetchを通してです。FAINT_LIMITは12です。
デモの地図で
デモの地図には暗い星の層があります。はじめから入っていて、ほかの層と同じようにアドレスに残ります(layers=milky,lines,names,gridなら、この層は消えます)。望遠鏡なら7等より暗い星が見えるあたりから始まります。深さは、「いちばん暗い星」のスライダーの値に、拡大が10倍になるごとに2.5等を足したもので、12等までです。UCAC4には6.5等から8等の星がとても少ないので、地図をおよそ3倍まで拡大すると、深さは8.5等にとび、そこから同じ割合で深くなり、およそ100倍で12等になります。操作の下の1行にここでは9.5等の星まで見えていますと、描いた暗い星の数が出ます。星は数本のパスで描き、1つずつのノードにはしません。1つの見かたで描くのは多くても6,000個で、明るいほうからです。6,000個で打ち切ったときは、深さが浅く出ます。止まっているときは、何も描かず、何も取ってきません。
全天の地図で
whole-sky.htmlにも、同じ暗い星の層があります。はじめから入っていて、アドレスに残るのも同じです(layers=milky,boundaries,lines,namesなら、この層は消えます)。深さの決めかたも6,000個という上限も同じコード(深さの決めかたと点の描画はdemo/faint-layer.ts、タイルの取得はdemo/faint.ts)を使っているので、角度が同じ幅の空なら、どちらのページでも同じ深さになります。全天の地図の拡大率は、1度あたりのピクセル数が同じになる星図の拡大率に直して使います(全体表示の地図は、全体表示の星図の1.27倍です)。星図の「いちばん暗い星」のスライダーの代わりには6等を使います。このページがいつも描いている明るい星の限界です。層は7等より深いところ、拡大がおよそ2倍のところから始まります。ただ、それだけ広い範囲だと、必要なタイルがページが一度に取ってくる数(48枚)を超えるので、最初の星が出るのはおよそ6倍からで、そこで深さは薄い帯をとび越えて8.5等になります。最大まで拡大した24倍では、地図はおよそ10等の深さになり、取ってくるタイルはレベル0(10等まで)だけです。地図の下の1行に、ここでの深さがここでは9.7等の星まで見えています (暗い星1,204個を表示)のように出ます。拡大していないときは、どれだけ拡大すればよいかが出ます。
地図は、楕円(モルワイデ図法かハンマー図法)か長方形で、座標は銀河座標か赤道座標なので、画面に映る空の部分は丸くありません。ページは、画面の縁、画面にかけた格子、楕円のふちが空のどこにあたるかを調べ、それをすべて含む小さな円を求め、タイルを取ってくる丸い範囲(faintTilesFor)にします。そこに余白を足すので、少し動かしても、必要なタイルがすでに手元にあります。地図のつなぎ目をまたぐときも、地図や空の極のところでも同じです。テストでは、6通りの投影法と座標の組み合わせそれぞれで、4倍、8倍、24倍に拡大し、中心、極、つなぎ目、楕円の四隅に向けて、それぞれの見かたに、星5,000個と、ランダムに選んだ画面の点400個を置き、画面に映るものがすべてこの範囲に入ることを確かめています。点は、地図の上に重ねた専用のピクセルの層に描きます。大きさは、地図に描いてある明るい星のうちいちばん暗いものより少し小さく、数本のパスにまとめて、星1つずつのノードにはしません。止まっているときは、何も描かず、何も取ってきません。タイルは1枚につき一度だけ取ってきて、そのまま保持します。印刷する地図には入りません。
この日本語は、まだ日本語を母語とする方の確認を受けていません。訂正を歓迎します。