A new version of the Milky Way halo page with some newly discovered streams based on the Gaia DR2 release, and a redesign of the colors palette for the stream members to better distinguish between them.
Monday, November 2, 2020
Wednesday, June 10, 2020
Milky Way Halo Update
Here are some new data for my Milky Way halo page based on recent analyses of the Gaia DR2 releaae.
Some recent papers (see below) present Gaia-based evidence for several groups of globular clusters that came with their progenitor galaxies which were captured by the Milky Way. Apart from the already known Sagittarius and Gaia-Enceladus dwarf galaxies there are now Seqoia, a dwarf accreted about 10 Gyr ago, Omega Cen may be the its former nucleus. 21 associated GCs came from the somewhat larger Koala according to Forbes et al.(2020), as well as the Helmi stream, which may have been accreted 5 to 8 Gyrs ago. The number of 76 cluster between those 5 galaxies represent a significant fraction of the total for the Milky Way. 184 are known at the moment, some of the others also show characteristics of accretion but can not be associated with a known progenitor.
Krujissen et al. (2018) The formation and assembly history of the Milky Way revealed by its globular cluster population. arXiv:astro-ph/1806.05680v2Massari et al. (2019)Origin of the system of globular clusters in the Milky Way. arXiv:astro-ph/1906.08271v2
Marsakov et al. (2020) Globular Clusters of the Galaxy: Chemical Composition vs Kinematics. arXiv:astro-ph/2002.10692v1
Forbes et al. (2020) Reverse engineering the Milky Way. arXiv:astro-ph/2002.01512v1
Wednesday, June 3, 2020
D3-Celestial: Automatic Time Zone Setting
Another new feature for D3-Celestial: Automatic time zone setting, thanks to TimeZoneDB , which provides an easy unterface to get the current time zone for any location on earth. The only limitation for a free account is a maximum of one request per second. So if you want to use it, I suggest register for your own account on that sevice. If you do, put your account ID in the config under 'timezoneid', if you don't want the time zone changed automatically, set 'settimezone' to false.
Thursday, May 14, 2020
D3-Celestial: SVG and PNG-Export
A long requested feature for D3-Celestial: Export a map view as SVG, and for good measure I also implemented saving a PNG image. Both are available as buttons below the form. Ther isn't much to write about; a simple click saves the current view in the chosen format. the configuration parameter formFields.download = true
enables the feature.
Tuesday, May 12, 2020
D3-Celestial: Better DSO Names
Now here is the final naming feature for D3-Celestial: Deep Space Objects (DSOs), again thanks to Stellarium, which provides names and translations for many DSOs through their fantastic sky cultures feature, already providing thranslations in many languages. With this it made sense to separate the names from the data, and put them in a common file named dsonames.json that is indexed by the most commn designator for each object, e.g. NGC 224 (the Andromade Galaxy) of M 45 (Pleiades).
Friday, May 1, 2020
D3-Celestial: Even Better Star Names
Yet another step in the name refactoring for D3-Celestial: Star names in many languages, selectable in the "Proper names" select box, or via the global override "Object Names", which sets all object types that have it available to the chosen language. This was possible with the Stellarium application again, which provides translations for many star names through their fantastic sky cultures feature, that I already used extensively to provide ancient Chinese constellations.
Sunday, April 19, 2020
D3-Celestial: Better Names in General, and Simpler
Another naming feature for D3-Celestial: A global override to consistently change all the object names to the same kind, with the select box below called, surprisingly "Object Names". With this setting all object types that have the chosen language available. A further new switch hides some of the more advanced settings to simplify the form, and only leaves the new global override for language changes. It is — also surprisingly — called "Advanced Options."
The relevant new options in the configuration file are pretty simple:
advanced: true, // Display fewer form fields if false lang: "", // Global language override for names, any name setting that has the chosen language available // Default:desig or empty string for designations, other: // (ar) Arabic, (cn) Chinese, (cz) Czech, (en) English, (ee) Estonian, (fi) Finnish, (fr) French, (de) German, // (gr) Greek, (il) Hebrew, (in) Hindi, (it) Italian, (jp) Japanese, (kr) Korean, (lat) Latin, (ir) Persian, // (ru) Russian, (es) Spanish, (tr) Turkish
Friday, April 3, 2020
D3-Celestial: Better Planetary Names (and Symbols)
Another extended name feature thanks to Wikipedia: Planetary names in different languages. While at it, I also made the way Solar System bodies are displayed selectable between symbol - how they were displayed until now, letter - The first one or two letters of each body's english name, and disk, a colored circle scaled by apparent magnitude. With the last one I cheated somewhat with the Sun and the Moon so that they don't overwhelm everything else.
The above map shows all the language options for constellations and planets as well as the display options for the latter randomly changing. The relevant new options for planets are:
planets: { //Show planet locations, if date-time is set show: false, // 3-letter designations of all solar system objects that should be displayed which: ["sol", "mer", "ven", "ter", "lun", "mar", "jup", "sat", "ura", "nep", "cer", "plu"], // Symbols as unicode codepoints, letter abbreviations and colors to be displayed symbols: { "sol": {symbol: "\u2609", letter:"Su", fill: "#ffff00"}, "mer": {symbol: "\u263f", letter:"Me", fill: "#cccccc"}, "ven": {symbol: "\u2640", letter:"V", fill: "#eeeecc"}, "ter": {symbol: "\u2295", letter:"T", fill: "#00ccff"}, "lun": {symbol: "\u25cf", letter:"L", fill: "#ffffff"}, "mar": {symbol: "\u2642", letter:"Ma", fill: "#ff6600"}, "cer": {symbol: "\u26b3", letter:"C", fill: "#cccccc"}, "ves": {symbol: "\u26b6", letter:"Ma", fill: "#cccccc"}, "jup": {symbol: "\u2643", letter:"J", fill: "#ffaa33"}, "sat": {symbol: "\u2644", letter:"Sa", fill: "#ffdd66"}, "ura": {symbol: "\u2645", letter:"U", fill: "#66ccff"}, "nep": {symbol: "\u2646", letter:"N", fill: "#6666ff"}, "plu": {symbol: "\u2647", letter:"P", fill: "#aaaaaa"}, "eri": {symbol: "\u26aa", letter:"E", fill: "#eeeeee"} }, // Style options for planetary symbols symbolStyle: { fill: "#00ccff", opacity:1, font: "bold 17px 'Lucida Sans Unicode', Consolas, sans-serif", align: "center", baseline: "middle" }, symbolType: "symbol", // Type of planetary symbol to be displayed: 'symbol', 'letter' or 'disk' names: false, // Show name next to symbol // Style options for planetary names nameStyle: { fill: "#00ccff", font: "14px 'Lucida Sans Unicode', Consolas, sans-serif", align: "right", baseline: "top" }, namesType: "en" // Language in which the name is displayed, supported options: // (desig) 3-Letter-Designation, (ar) Arabic, (cn) Chinese, (en) English, (fr) French, (de) German, (gr) Greek, (il) Hebrew, // (in) Hindi, (it) Italian, (jp) Japanese, (lat) Latin, (ru) Russian, (es) Spanish },
Sunday, March 22, 2020
D3-Celestial: Chinese Constellations
Here is the payoff for the effort to make the D3-Celestial naming options more flexible: Traditional Chinese constellations and star names. Many thanks to Stellarium for the extensive data that made my work pretty easy. You can select the type of constellation- and star names in the form below the map between Chinese, Pinyin (Western transcription), and English translation. For orientation purposes I also included the option to display their IAU star designations.
Background on Chinese constellations on Wikipedia. Since I don't speak Chinese, I could only replicate the data as given by Stellarium. Except the constellation boundaries, which in the Chinese tradition are called the 28 Mansions, so they are only kinda-sorta equivalent to the concept of western constellations. In the Stellarium data those reach from pole to pole, but on old maps they are generally delineated between +/- 50 degrees, so I adopted that. Another difference are the 3 Enclosures, in the map shown as long pink lines. The constellation lines appear somewhat different as in the maps, and I can't vouch at all for the names. I'd be really happy with help from somebody who speaks Chinese.
Tuesday, March 17, 2020
D3-Celestial: Better Constellation Names
The next step to more flexible naming options constellations can now be displayed in many languages, helped greatly by this Wikipedia page with a table listing lots of them. Note that this is not from the original Wikipedia, where this page has been deleted; apparently it was too useful. You can select the constellation-language in the form below the map, and zoom in to any constellation in the other select box, where the displayed names are automatically adapted to the language-selection, amended with the IAU 3-letter designation for convenience.
These are the relevant options in the configuration object, all renamed from previous versions to better represent the actual meaning. Different parameter names in older versions are transformed automatically to preserve backward compatibility.
{ constellations: { names: true, // Show constellation names namesType: "desig", // What kind of name to show (default 3 letter designations) // Available options: (name) Official IAU name, (desig) 3-Letter-Designation, (lat) Latin, (en) English, (ar) Arabic, //(cn) Chinese, (cz) Czech, (ee) Estonian, (fi) Finnish, (fr) French, (de) German, (gr) Greek, (il) Hebrew, //(it) Italian, (jp) Japanese, (kr) Korean, (in) Marathi, (ir) Persian, (ru) Russian, (es) Spanish, (tr) Turkish // Different fonts for brighter & darker constellations nameStyle: { fill:"#cccc99", align: "center", baseline: "middle", opacity:0.8, font: ["14px 'Lucida Sans Unicode', Helvetica, Arial, sans-serif", "12px 'Lucida Sans Unicode', Helvetica, Arial, sans-serif", "11px 'Lucida Sans Unicode', Helvetica, Arial, sans-serif"]}, lines: true, // Show constellation lines lineStyle: { stroke: "#cccccc", width: 1.5, opacity: 0.6 }, bounds: false, // Show constellation boundaries boundStyle: { stroke: "#ccff00", width: 1, opacity: 0.8, dash: [2, 4] } }}
Tuesday, March 3, 2020
D3-Celestial Version 0.7: Better Star Names
To be able to present constellations and star names from other cultures like the traditional Chinese ones(upcoming feature), I refactored the star-naming system so that it is possible to display different types of names. The feature is selectable in the form below with the Stars -> Show section. The select box has the star name options Beyer, Flamsteed, variables, Gliese and designation, which is a combination of all the previous options, and contains whichever applies first.
Try selecting a different constellation, dial up the display limits and select different star designations to see the effect.
To facilitate the extended naming capability, I extracted all the different names and designations from the stellar data files into a separate file unsurprisingly called 'starnames.json' that contains all the names apart from the Hipparcos number. That also reduces redundancy, since most names only need to appear once.
These are the relevant options in the configuration object, all renamed from previous versions to better represent the actual meaning:
{ stars: { designation: true, // Show star names (Bayer, Flamsteed, Variable star, Gliese or designation, // i.e. whichever of the previous applies first); may vary with culture setting designationType: "desig", // Which kind of name is displayed as designation (fieldname in starnames.json) designationStyle: { fill: "#ddddbb", font: "11px 'Palatino Linotype', Georgia, Times, 'Times Roman', serif", align: "left", baseline: "top" }, designationLimit: 2.5, // Show only names for stars brighter than nameLimit propername: false, // Show proper name (if present) propernameType: "name", // Field in starnames.json that contains proper name; may vary with culture setting propernameStyle: { fill: "#ddddbb", font: "13px 'Palatino Linotype', Georgia, Times, 'Times Roman', serif", align: "right", baseline: "bottom" }, propernameLimit: 1.5, // Show proper names for stars brighter than propernameLimit }}
The different parameter names in older versions are transformed automatically to preserve backward compatibility.
Finally, I've also exposed an additional function, 'Celestial.showConstellation(id)', that zooms in and focuses on the selected constellation given with the three-letter-code ID (case-insensitive).
// Zoom in on the constellation Orion Celestial.showConstellation('ori');
Tuesday, January 14, 2020
D3 Celestial Gelolocator: Night Sky
[Previously: part I Geolocator, part II Sky color, part III Geomarker]
The next feature for the geolocator-globe, a plugin to display the current night hemisphere with increasing levels of darkness, depending on the state of twilight. The distinction is between civil twilight, which lasts from sunset until the sun is 6 degrees below the horizon, followed by nautical twilight until 12 degrees and finally astronomical twilight lasting to 18 degrees below. In reverse order the same is true for dawn. The subsolar point, where the Sun is directly above, is market with a small yellow circle.
[Update: javascript Date object only knows local time, therefore the timezone offset needs to be calculated from that. For this Celestial also gets a new function: Celestial.timezone(tz) for setting and with no argument getting current timezone.]
A small update for the Geomarker plugin as well, where the marker is invisible when the current position on the globe is rotated out of view.
// This plugin shows concentric hemispheres with increasing opacities, // specifically to show the dark side with increasing levels of twilight. function hemisphere(options) { var pos = {}, options = options || {}; options.color = options.color || 'black'; options.alpha = options.alpha || 0.12; // Current antisolar point, directly opposite of the Sun var setOrigin = function(lng, lat) { pos.lng = lng; pos.lat = lat; }; var drawHemisphere = function(context, planet, pos) { // First, the subsolar point as a small yellow circle with black border context.fillStyle = "#ff0"; context.lineStyle = "#000"; var circle = d3.geo.circle().origin([pos.lng + 180, -pos.lat]).angle(1.5)(); context.beginPath(); planet.path.context(context)(circle); context.fill(); context.stroke(); context.fillStyle = options.color; context.globalAlpha = options.alpha; // Draw the concentric circles of darkness with the Sun at 0°, 6°, 12° and 18° below the horizon for (var i = 0; i <= 3; i++) { circle = d3.geo.circle().origin([pos.lng, pos.lat]).angle(90 - i*6)(); context.beginPath(); planet.path.context(context)(circle); context.fill(); } }; return function(planet) { planet.plugins.hemisphere = { origin: setOrigin }; planet.onInit(function() {}); planet.onDraw(function() { if (!pos.hasOwnProperty("lat")) return; planet.withSavedContext(function(context) { drawHemisphere(context, planet, pos); }); }); }; }; // callback funtion, where the celestial map data is used to update the geolocator globe Celestial.addCallback(function () { // put the marker on the current location var loc = Celestial.location(); globe.plugins.markers.remove("*"); globe.plugins.markers.add(loc[1], loc[0]); // Sun location, current date and timezone offset var sol = Celestial.getPlanet("sol"), dt = Celestial.date(), tz = Celestial.timezone() - dt.getTimezoneOffset(); if (sol) { // lat & lng of current nadir point directly opposite the solar position var lat = -sol.ephemeris.pos[1], // Simple assumption: UTC time equals sun angle from Greenwich meridian, trap: dt still is local lng = -(dt.getUTCHours() * 3600 + dt.getUTCMinutes() * 60 + dt.getUTCSeconds() + tz * 60) / 3600 * 15; var antisol = [lat, lng]; globe.plugins.hemisphere.origin(antisol[1], antisol[0]); } });
Time zone still needs to be set manually and horizontal refraction isn't considered yet, so the result need not be entirely accurate.
Saturday, December 28, 2019
D3-Celestial Geolocator: Markers
[Previously: part I Geolocator, part II Sky color]
A new feature for my d3-celestial star map: Celestial.addCallback allows to define a callback function that will be executed in the local client context every time the map is redrawn. This enables other display elements to react to changes, for example the marker position in the geolocator-globe above. Usage is pretty simple: add an anonymous function as the parameter for addCallback:
Celestial.addCallback(function () { var loc = Celestial.location(); globe.plugins.markers.remove("*"); globe.plugins.markers.add(loc[1], loc[0]); });
It also demonstrates the other new feature, a geo-marker, implemented as a plugin for the geolocator-globe. This takes the position of the last mouse position and puts a marker on it. These can be of different colors and sizes, so can be added in any form or number you like. The remove function takes an asterisk to remove all, an arry index or the exact position to remove one.
function markers(config) { var marks = []; config = config || {}; var addMark = function(lng, lat, options) { options = options || {}; options.color = options.color || config.color || 'white'; options.size = options.size || config.size || 5; var mark = { options: options }; if (config.latitudeFirst) { mark.lat = lng; mark.lng = lat; } else { mark.lng = lng; mark.lat = lat; } marks.push(mark); }; var removeMark = function(lng, lat) { if (lng === "*") { marks = []; return; } if (arguments.length === 1 && lng < marks.length) { marks.splice(lng, 1); return; } if (arguments.length === 2) { for (var i=0; i <= marks.length; i++) { if (marks[i].lng === lng && marks[i].lat === lat) { marks.splice(i, 1); return; } } } } var drawMarks = function(planet, context) { for (var i = 0; i < marks.length; i++) { var mark = marks[i]; drawMark(planet, context, mark); } }; var drawMark = function(planet, context, mark) { var color = mark.options.color, size = mark.options.size * 5, pos = planet.projection([mark.lng, mark.lat]); context.fillStyle = color; context.beginPath(); context.moveTo(pos[0], pos[1]); context.arc(pos[0], pos[1] - size, size/2, Math.PI, 0); context.fill(); context.fillStyle = "#fff"; context.beginPath(); context.arc(pos[0], pos[1]- size, size/4, 0, 2 * Math.PI); context.fill(); }; return function (planet) { planet.plugins.markers = { add: addMark, remove: removeMark }; planet.onDraw(function() { planet.withSavedContext(function(context) { drawMarks(planet, context); }); }); }; };
[Next: part IV Night sky.]
Time zone still needs to be set manually and horizontal refraction isn't considered yet, so the result need not be entirely accurate.
Saturday, December 7, 2019
Holiday project 2.0: Wallmap of the Universe
Something for the Holidays: Printable wall map of the universe with a d3-celestial sky map combined with a logarithmic chart of the whole universe from our Sun straight through to the big bang! Click on the images below to download large versions with 8000 px width, combined or in separate parts.
Stellar Wallmap:
Logarithmic universe:
Sunday, December 1, 2019
D3-Celestial Sky Color
[Previously: part I Geolocator.]
A new feature for my d3-celestial star map: A sky color gradient that shows the current sky state at the set time and date if the projection is hemispheric. No extra coding needed, just set daylight.show to true in the configuration of check "Daylight Sky" in the form. Time zone still needs to be set manually and horizontal refraction isn't considered yet, so the result need not be entirely accurate.
[Next: part III Geolocator: Markers.]
Monday, November 18, 2019
D3-Celestial Geolocator
I was looking for a simple graphical location-selector, a globe that can be spun, zoomed in and clicked on to get an approximate location. I found none so obviously I had to make my own. A good starting point was planetary.js which already takes care of the spinnable and zoomable globe and is pretty easy to extend with plugins. See my fork for details about the mouse-actions plugin.
All the work is done in a callback function for the mouse actions mousedown and mouseup. We could just use click, but that would also cause a positioning update on dragging actions on the globe. Only updating when the mouse coordinates don't change between down and up takes care of that. The rest is pretty straight forward, take mouse coordinates, calculate geographic position with the d3.js function projection.invert, and if that is valid (i.e. inside the globe) update the geolocation of the sky view.
globe.loadPlugin(mouse({ onMousedown: function() { var x = d3.event.offsetX, y = d3.event.offsetY; position = [x, y]; }, onMouseup: function() { var x = d3.event.offsetX, y = d3.event.offsetY, format = d3.format("-.3f"); if (position[0] !== x || position[1] !== y) return; var pos = this.projection.invert([x,y]); if (!isNaN(pos[0])) { // latitude, longitude convention is the opposite for sky coordinates Celestial.skyview({"location": [format(pos[1]), format(pos[0])]}); } return pos; } }));
Time zones are not taken into account yet, so the result is not necessarily valid. That will be fixed later, as well as putting a position marker on the globe, showing the current terminator between day and night, and optionally also show the current sky state on the current view changing between blue and transparent.
[Next: part II Sky color.]