Showing off some new features and howtos for d3.celstial. First setting the Color of DSOs. The new settings below allow to display alle the deep space objects in a uniform default color if the 'colors' setting is set to false in the configuration-section under 'dsos'. The colr is determined by the 'fill' and 'stroke' properties.
dsos: { colors: false, // Show DSOs in symbol colors if true, use style settings below if false style: { fill: "#cccccc", stroke: "#cccccc", width: 2, opacity: 1 }, // Default style for dsos }
Second, how to convert cursor position to map coordinates. For this we need the function invert that is implemented for every map projection. If it gets valid x/y screen coordinates relative to the upper left corner of the map (that's why offsetLeft/Top are subtracted first [Correction: Turns out offsetX/Y does the trick]), it returns the sky position in decimal degrees. Caveat: A position outside of the projected map returns [NaN, NaN].
function getPosition(e) { var p = document.getElementById ('celestial-map17').getBoundingClientRect(), x = e.offsetX, y = e.offsetY, inv = Celestial.mapProjection.invert([x, y]); return inv; // [right ascension -180...180 degrees, declination -90...90 degrees] } document.getElementById('celestial-map17').addEventListener('mousemove', getPosition, false);
If you want to pretty print the coordinates in hms and dms as above, here are the conversion functions for your convenience:
function deg2hms (deg) { if (deg === null || isNaN(parseFloat(deg))) return; var ra = deg < 0 ? (deg + 360) / 15 : deg / 15, h = Math.floor (ra), rest1 = (ra - h) * 60, m = Math.floor(rest1), rest2 = (rest1 - m) * 60; s = Math.round(rest2); return '' + pad(h) + 'ʰ ' + pad(m) + 'ᵐ ' + pad(s) + 'ˢ'; } function deg2dms (deg) { if (deg === null || isNaN(parseFloat(deg))) return; var d = Math.floor (deg), rest1 = (deg - d) * 60, m = Math.floor(rest1), rest2 = (rest1 - m) * 60; s = Math.round(rest2); return '' + pad(d) + '° ' + pad(m) + '′ ' + pad(s) + '″'; } function pad(n) { if (n < 0) return n > -10 ? '-0' + Math.abs(n) : n; return n < 10 ? '0' + n : n; }
And last a simple added functionality, a download link that saves the current canvas content as an image.
var button = document.getElementById('btnDownload'); // Set the file name to your liking, e.g. add the displayed date/time button.setAttribute('download', 'd3-celestial.png'); button.addEventListener('click', function (e) { var canvas = document.querySelector('#celestial-map canvas'), // To get a download instead of image display, according to stack overflow dataURL = canvas.toDataURL('image/png').replace('image/png', 'image/octet-stream'); button.href = dataURL; });
This comment has been removed by the author.
ReplyDeleteThanks, hats off to you
ReplyDelete