Skip to content

Instantly share code, notes, and snippets.

@syntagmatic
Forked from mbostock/.block
Last active April 29, 2016 14:43
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save syntagmatic/4446b31c6cd746eedaeb to your computer and use it in GitHub Desktop.
Save syntagmatic/4446b31c6cd746eedaeb to your computer and use it in GitHub Desktop.
Space Stations
<!DOCTYPE html>
<meta charset="utf-8">
<title>Space Stations</title>
<style>
svg {
font: 8px sans-serif;
}
.foreground path {
fill: none;
stroke: #222;
stroke-opacity: 0.4;
pointer-events: none;
stroke-width: 1px;
}
.axis .title {
font-size: 8px;
font-weight: bold;
text-transform: uppercase;
transform: rotate(-12deg) translate(-5px,-6px);
}
.axis line,
.axis path {
fill: none;
stroke: #000;
stroke-width: 1px;
}
.brush .extent {
fill-opacity: .3;
stroke: #fff;
stroke-width: 1px;
}
pre {
width: 900px;
margin: 10px 30px;
tab-size: 25;
font-size: 12px;
overflow: auto;
}
</style>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script>
<script>
var margin = {top: 50, right: 80, bottom: 20, left: 100},
width = 960 - margin.left - margin.right,
height = 340 - margin.top - margin.bottom;
var types = {
"Number": {
key: "Number",
coerce: function(d) { return +d; },
extent: d3.extent,
within: function(d, extent) { return extent[0] <= d && d <= extent[1]; },
defaultScale: d3.scale.linear().range([height, 0])
},
"String": {
key: "String",
coerce: String,
extent: function (data) { return data.sort(); },
within: function(d, extent, dim) { return extent[0] <= dim.scale(d) && dim.scale(d) <= extent[1]; },
defaultScale: d3.scale.ordinal().rangePoints([0, height])
},
"Date": {
key: "Date",
coerce: function(d) { return new Date(d); },
extent: d3.extent,
within: function(d, extent) { return extent[0] <= d && d <= extent[1]; },
defaultScale: d3.time.scale().range([0, height])
}
};
var dimensions = [
{
key: "name",
description: "Name",
type: types["String"]
},
{
key: "satelliteNumber",
description: "SatelliteNumber",
type: types["String"]
},
{
key: "classification",
description: "Classification",
type: types["String"]
},
{
key: "launchNumber",
description: "Launch Number",
type: types["Number"]
},
{
key: "launchPiece",
description: "Launch Piece",
type: types["String"]
},
{
key: "epochYear",
description: "Epoch Year",
type: types["String"]
},
{
key: "epochDay",
description: "Epoch Day",
type: types["Number"],
domain: [0,360]
},
{
key: "inclination",
description: "inclination",
type: types["Number"],
domain: [0,90]
},
{
key: "rightAscension",
description: "Right Ascension",
type: types["Number"],
domain: [0,360]
},
{
key: "eccentricity",
description: "Eccentricity",
type: types["Number"],
domain: [0,0.002]
},
{
key: "perigee",
description: "Perigee",
type: types["Number"],
domain: [0,360]
},
{
key: "meanAnomaly",
description: "Mean Anomaly",
type: types["Number"],
domain: [0,360]
},
{
key: "meanMotion",
description: "Mean Motion",
type: types["Number"]
},
{
key: "firstDerivMeanMotion",
description: "First Deriv Mean Motion",
type: types["Number"]
}
];
var x = d3.scale.ordinal()
.domain(dimensions.map(function(dim) { return dim.key; }))
.rangePoints([0, width]);
var line = d3.svg.line()
.defined(function(d) { return !isNaN(d[1]); });
var yAxis = d3.svg.axis()
.orient("left");
var svg = d3.select("body").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
var output = d3.select("body").append("pre");
var foreground = svg.append("g")
.attr("class", "foreground");
var axes = svg.selectAll(".axis")
.data(dimensions)
.enter().append("g")
.attr("class", "axis")
.attr("transform", function(d) { return "translate(" + x(d.key) + ")"; });
d3.csv("stations.csv", function(error, data) {
if (error) throw error;
data.forEach(function(d) {
dimensions.forEach(function(p) {
d[p.key] = p.type.coerce(d[p.key]);
});
});
// type/dimension default setting happens here
dimensions.forEach(function(dim) {
if (!("domain" in dim)) {
// detect domain using dimension type's extent function
dim.domain = d3.functor(dim.type.extent)(data.map(function(d) { return d[dim.key]; }));
// TODO - this line only works because the data encodes data with integers
// Sorting/comparing should be defined at the type/dimension level
dim.domain.sort(function(a,b) {
return a - b;
});
}
if (!("scale" in dim)) {
// use type's default scale for dimension
dim.scale = dim.type.defaultScale.copy();
}
dim.scale.domain(dim.domain);
});
foreground.selectAll("path")
.data(data)
.enter().append("path")
.attr("d", draw)
.style("stroke", function(d) { return "#6ac"; });
axes.append("g")
.attr("class", "axis")
.each(function(d) {
var renderAxis = "axis" in d
? d.axis.scale(d.scale) // custom axis
: yAxis.scale(d.scale); // default axis
d3.select(this).call(renderAxis);
})
.append("text")
.attr("class", "title")
.attr("text-anchor", "start")
.text(function(d) { return "description" in d ? d.description : d.key; });
// Add and store a brush for each axis.
axes.append("g")
.attr("class", "brush")
.each(function(d) {
d3.select(this).call(d.brush = d3.svg.brush()
.y(d.scale)
.on("brushstart", brushstart)
.on("brush", brush));
})
.selectAll("rect")
.attr("x", -8)
.attr("width", 16);
output.text(d3.tsv.format(data));
function draw(d) {
return line(dimensions.map(function(dim) {
return [x(dim.key), dim.scale(d[dim.key])];
}));
}
function brushstart() {
d3.event.sourceEvent.stopPropagation();
}
// Handles a brush event, toggling the display of foreground lines.
function brush() {
var actives = dimensions.filter(function(p) { return !p.brush.empty(); }),
extents = actives.map(function(p) { return p.brush.extent(); });
var selected = [];
d3.selectAll(".foreground path").style("display", function(d) {
if (actives.every(function(dim, i) {
// test if point is within extents for each active brush
return dim.type.within(d[dim.key], extents[i], dim);
})) {
selected.push(d);
return null;
}
return "none";
});
output.text(d3.tsv.format(selected));
}
});
</script>
<!DOCTYPE html>
<meta charset="utf-8">
<style>
body {
background: #fcfcfa;
}
text {
font-family: Menlo, monospace;
}
</style>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script>
<script>
d3.text("stations.txt", function(error, tledata) {
tleparse(tledata);
});
function tleparse(data) {
console.log(data);
var lines = data.split("\n");
console.log(lines);
var objects = [];
lines.forEach(function(line) {
if (line.length == 0) return;
if (line[0] == "1") {
var obj = objects[objects.length-1];
obj.satelliteNumber = line.slice(2,7);
obj.classification = line.slice(7,8);
obj.launchYear = line.slice(9,11);
obj.launchNumber = line.slice(11,14);
obj.launchPiece = line.slice(14,17);
obj.epochYear = line.slice(18,20);
obj.epochDay = line.slice(20,32);
obj.firstDerivMeanMotion = line.slice(33,43);
obj.secondDerivMeanMotion = line.slice(44,52);
obj.bstarDragTerm = line.slice(53,61);
obj.ephemerisType = line.slice(62,63);
obj.elementNumber = line.slice(65,68);
return;
}
if (line[0] == "2") {
var obj = objects[objects.length-1];
obj.inclination = line.slice(8,16);
obj.rightAscension = line.slice(17,25);
obj.eccentricity = "." + line.slice(26,33);
obj.perigee = line.slice(34,42);
obj.meanAnomaly = line.slice(43,51);
obj.meanMotion = line.slice(52,63);
obj.revolutionNumberAtEpoch = line.slice(63,68);
// trim whitespace
for (var k in obj) obj[k] = obj[k].trim();
return;
}
objects.push({
name: line
});
});
console.log(objects);
d3.select("body").append("pre").text(d3.csv.format(objects));
};
</script>
name satelliteNumber classification launchYear launchNumber launchPiece epochYear epochDay firstDerivMeanMotion secondDerivMeanMotion bstarDragTerm ephemerisType elementNumber inclination rightAscension eccentricity perigee meanAnomaly meanMotion revolutionNumberAtEpoch
ISS (ZARYA) 25544 U 98 067 A 15 220.14201569 .00006366 00000-0 99981-4 0 999 51.6445 184.6193 .0001190 50.9632 60.9475 15.55044901 95612
TIANGONG 1 37820 U 11 053 A 15 220.22582222 .00016885 00000-0 18235-3 0 999 42.7666 324.0133 .0013347 19.7325 62.5589 15.63234916 22146
SPINSAT 40314 U 98 067 FL 15 219.88718309 .00019559 00000-0 22242-3 0 999 51.6398 180.8824 .0004739 308.0564 52.0002 15.62302813 9074
FLOCK 1B-27 40422 U 98 067 FN 15 220.10831557 .00087761 00000-0 46759-3 0 999 51.6375 170.0695 .0003407 293.3518 155.6084 15.79679430 3427
FLOCK 1B-28 40423 U 98 067 FP 15 219.24788283 .05567779 12028-4 14293-2 0 999 51.6133 170.3484 .0007348 241.2767 118.7501 16.27910103 3419
FLOCK 1B-21 40427 U 98 067 FQ 15 220.17244066 .00113418 00000-0 60632-3 0 999 51.6348 169.6742 .0002024 341.5914 147.4219 15.79505042 3431
FLOCK 1B-22 40428 U 98 067 FR 15 220.12069744 .00092140 00000-0 51130-3 0 999 51.6365 170.9091 .0002544 336.4498 114.1655 15.78763696 3429
FLOCK 1B-10 40429 U 98 067 FS 15 220.20119405 .00195474 25025-4 64353-3 0 999 51.6296 168.3836 .0005910 26.6978 67.1007 15.90077971 3430
FLOCK 1D-1 40451 U 98 067 FU 15 220.14503916 .00106360 00000-0 55029-3 0 999 51.6355 170.3030 .0005794 339.2305 116.0448 15.80231569 3428
FLOCK 1D-2 40452 U 98 067 FV 15 220.13593804 .00048791 00000-0 41130-3 0 999 51.6406 176.3296 .0005769 338.6049 117.4290 15.69293657 3420
FLOCK 1B-5 40453 U 98 067 FW 15 220.14430539 .00846207 33415-3 18664-2 0 999 51.6321 169.5124 .0003592 196.6100 260.4302 15.97464509 3428
FLOCK 1B-6 40454 U 98 067 FX 15 220.10653247 .00070361 00000-0 43756-3 0 999 51.6379 171.6254 .0004407 309.2972 117.2228 15.76302694 3425
GEARRS-1 40456 U 98 067 FZ 15 220.08687398 .00093676 00000-0 60028-3 0 999 51.6402 173.2145 .0003283 299.4823 60.5849 15.75508462 3424
MICROMAS 40457 U 98 067 GA 15 213.38588329 .08885032 12472-4 72013-3 0 999 51.6142 195.6182 .0009646 310.7124 49.3640 16.38908268 3333
FLOCK 1B-11 40459 U 98 067 GC 15 220.11423693 .00094249 00000-0 49145-3 0 999 51.6331 170.8590 .0004498 7.7931 80.5822 15.80118750 3428
FLOCK 1B-12 40460 U 98 067 GD 15 220.12252502 .00077437 00000-0 48610-3 0 999 51.6384 173.2120 .0003439 322.3731 126.4640 15.76055417 3425
PROGRESS-M 28M 40713 U 15 031 A 15 196.49011771 .00017741 00000-0 26492-3 0 999 51.6454 302.6810 .0001491 236.5964 219.1604 15.55119641 192
FLOCK 1E-2 40722 U 98 067 GE 15 220.11343167 .00031733 00000-0 43197-3 0 999 51.6447 184.4829 .0005135 13.0644 72.6838 15.57251292 393
FLOCK 1E-1 40723 U 98 067 GF 15 220.11372066 .00019842 00000-0 27526-3 0 999 51.6445 184.4849 .0005713 15.9180 70.3039 15.57028627 388
FLOCK 1E-4 40724 U 98 067 GG 15 220.18578455 .00024122 00000-0 33633-3 0 999 51.6444 184.1797 .0002100 296.1008 166.7338 15.56772043 389
FLOCK 1E-3 40725 U 98 067 GH 15 220.17802303 .00051732 00000-0 69111-3 0 999 51.6451 184.1524 .0002786 290.2356 163.3131 15.57535029 386
FLOCK 1E-7 40726 U 98 067 GJ 15 220.11922285 .00034520 00000-0 47527-3 0 999 51.6424 184.5207 .0004681 28.9647 58.3644 15.56904589 373
FLOCK 1E-8 40727 U 98 067 GK 15 220.11970685 .00023065 00000-0 32182-3 0 999 51.6436 184.5209 .0004433 30.1090 58.2085 15.56774590 372
FLOCK 1E-5 40728 U 98 067 GL 15 219.36079981 .00022565 00000-0 31601-3 0 999 51.6437 188.3143 .0004907 359.1287 155.1719 15.56686820 361
FLOCK 1E-6 40729 U 98 067 GM 15 220.11920196 .00031964 00000-0 44197-3 0 999 51.6410 184.5197 .0004850 6.7269 80.9401 15.56827685 374
FLOCK 1E-9 40736 U 98 067 GN 15 220.12226089 .00030092 00000-0 41998-3 0 999 51.6437 184.5426 .0003596 51.4864 36.0323 15.56613949 371
FLOCK 1E-10 40737 U 98 067 GP 15 220.12270863 .00029481 00000-0 41125-3 0 999 51.6412 184.5423 .0003173 54.6051 35.0032 15.56639211 372
FLOCK 1E-11 40738 U 98 067 GQ 15 220.11930394 .00054644 00000-0 73959-3 0 999 51.6422 184.5180 .0003342 336.1890 114.6566 15.57160402 354
FLOCK 1E-12 40739 U 98 067 GR 15 220.12022914 .00029150 00000-0 40523-3 0 999 51.6402 184.5271 .0004092 357.8220 89.5522 15.56735331 355
FLOCK 1E-13 40740 U 98 067 GS 15 220.12066207 .00036910 00000-0 50983-3 0 999 51.6420 184.5321 .0004835 33.5129 53.6960 15.56783334 353
FLOCK 1E-14 40741 U 98 067 GT 15 220.12224720 .00027177 00000-0 37929-3 0 999 51.6429 184.5333 .0004267 31.5300 59.4600 15.56668076 352
ARKYD-3R 40742 U 98 067 GU 15 220.11211696 .00052881 00000-0 69940-3 0 999 51.6452 184.4780 .0004844 56.1585 29.2269 15.57786679 352
CENTENNIAL 1 40743 U 98 067 GV 15 220.11578127 .00036444 00000-0 49428-3 0 999 51.6437 184.4998 .0004568 57.7461 28.6359 15.57282221 352
SOYUZ-TMA 17M 40744 U 15 035 A 15 204.58592506 .00046589 00000-0 68003-3 0 999 51.6451 262.2726 .0001334 294.5630 156.6060 15.55189487 11
ISS (ZARYA)
1 25544U 98067A 15220.14201569 .00006366 00000-0 99981-4 0 9999
2 25544 51.6445 184.6193 0001190 50.9632 60.9475 15.55044901956123
TIANGONG 1
1 37820U 11053A 15220.22582222 .00016885 00000-0 18235-3 0 9995
2 37820 42.7666 324.0133 0013347 19.7325 62.5589 15.63234916221464
SPINSAT
1 40314U 98067FL 15219.88718309 .00019559 00000-0 22242-3 0 9998
2 40314 51.6398 180.8824 0004739 308.0564 52.0002 15.62302813 90746
FLOCK 1B-27
1 40422U 98067FN 15220.10831557 .00087761 00000-0 46759-3 0 9995
2 40422 51.6375 170.0695 0003407 293.3518 155.6084 15.79679430 34270
FLOCK 1B-28
1 40423U 98067FP 15219.24788283 .05567779 12028-4 14293-2 0 9997
2 40423 51.6133 170.3484 0007348 241.2767 118.7501 16.27910103 34192
FLOCK 1B-21
1 40427U 98067FQ 15220.17244066 .00113418 00000-0 60632-3 0 9995
2 40427 51.6348 169.6742 0002024 341.5914 147.4219 15.79505042 34313
FLOCK 1B-22
1 40428U 98067FR 15220.12069744 .00092140 00000-0 51130-3 0 9990
2 40428 51.6365 170.9091 0002544 336.4498 114.1655 15.78763696 34294
FLOCK 1B-10
1 40429U 98067FS 15220.20119405 .00195474 25025-4 64353-3 0 9993
2 40429 51.6296 168.3836 0005910 26.6978 67.1007 15.90077971 34305
FLOCK 1D-1
1 40451U 98067FU 15220.14503916 .00106360 00000-0 55029-3 0 9993
2 40451 51.6355 170.3030 0005794 339.2305 116.0448 15.80231569 34286
FLOCK 1D-2
1 40452U 98067FV 15220.13593804 .00048791 00000-0 41130-3 0 9999
2 40452 51.6406 176.3296 0005769 338.6049 117.4290 15.69293657 34209
FLOCK 1B-5
1 40453U 98067FW 15220.14430539 .00846207 33415-3 18664-2 0 9998
2 40453 51.6321 169.5124 0003592 196.6100 260.4302 15.97464509 34280
FLOCK 1B-6
1 40454U 98067FX 15220.10653247 .00070361 00000-0 43756-3 0 9990
2 40454 51.6379 171.6254 0004407 309.2972 117.2228 15.76302694 34253
GEARRS-1
1 40456U 98067FZ 15220.08687398 .00093676 00000-0 60028-3 0 9998
2 40456 51.6402 173.2145 0003283 299.4823 60.5849 15.75508462 34243
MICROMAS
1 40457U 98067GA 15213.38588329 .08885032 12472-4 72013-3 0 9998
2 40457 51.6142 195.6182 0009646 310.7124 49.3640 16.38908268 33335
FLOCK 1B-11
1 40459U 98067GC 15220.11423693 .00094249 00000-0 49145-3 0 9995
2 40459 51.6331 170.8590 0004498 7.7931 80.5822 15.80118750 34283
FLOCK 1B-12
1 40460U 98067GD 15220.12252502 .00077437 00000-0 48610-3 0 9993
2 40460 51.6384 173.2120 0003439 322.3731 126.4640 15.76055417 34257
PROGRESS-M 28M
1 40713U 15031A 15196.49011771 .00017741 00000-0 26492-3 0 9993
2 40713 51.6454 302.6810 0001491 236.5964 219.1604 15.55119641 1925
FLOCK 1E-2
1 40722U 98067GE 15220.11343167 .00031733 00000-0 43197-3 0 9995
2 40722 51.6447 184.4829 0005135 13.0644 72.6838 15.57251292 3930
FLOCK 1E-1
1 40723U 98067GF 15220.11372066 .00019842 00000-0 27526-3 0 9991
2 40723 51.6445 184.4849 0005713 15.9180 70.3039 15.57028627 3885
FLOCK 1E-4
1 40724U 98067GG 15220.18578455 .00024122 00000-0 33633-3 0 9992
2 40724 51.6444 184.1797 0002100 296.1008 166.7338 15.56772043 3893
FLOCK 1E-3
1 40725U 98067GH 15220.17802303 .00051732 00000-0 69111-3 0 9991
2 40725 51.6451 184.1524 0002786 290.2356 163.3131 15.57535029 3864
FLOCK 1E-7
1 40726U 98067GJ 15220.11922285 .00034520 00000-0 47527-3 0 9991
2 40726 51.6424 184.5207 0004681 28.9647 58.3644 15.56904589 3730
FLOCK 1E-8
1 40727U 98067GK 15220.11970685 .00023065 00000-0 32182-3 0 9992
2 40727 51.6436 184.5209 0004433 30.1090 58.2085 15.56774590 3722
FLOCK 1E-5
1 40728U 98067GL 15219.36079981 .00022565 00000-0 31601-3 0 9996
2 40728 51.6437 188.3143 0004907 359.1287 155.1719 15.56686820 3618
FLOCK 1E-6
1 40729U 98067GM 15220.11920196 .00031964 00000-0 44197-3 0 9992
2 40729 51.6410 184.5197 0004850 6.7269 80.9401 15.56827685 3742
FLOCK 1E-9
1 40736U 98067GN 15220.12226089 .00030092 00000-0 41998-3 0 9998
2 40736 51.6437 184.5426 0003596 51.4864 36.0323 15.56613949 3716
FLOCK 1E-10
1 40737U 98067GP 15220.12270863 .00029481 00000-0 41125-3 0 9990
2 40737 51.6412 184.5423 0003173 54.6051 35.0032 15.56639211 3728
FLOCK 1E-11
1 40738U 98067GQ 15220.11930394 .00054644 00000-0 73959-3 0 9991
2 40738 51.6422 184.5180 0003342 336.1890 114.6566 15.57160402 3545
FLOCK 1E-12
1 40739U 98067GR 15220.12022914 .00029150 00000-0 40523-3 0 9998
2 40739 51.6402 184.5271 0004092 357.8220 89.5522 15.56735331 3556
FLOCK 1E-13
1 40740U 98067GS 15220.12066207 .00036910 00000-0 50983-3 0 9996
2 40740 51.6420 184.5321 0004835 33.5129 53.6960 15.56783334 3537
FLOCK 1E-14
1 40741U 98067GT 15220.12224720 .00027177 00000-0 37929-3 0 9993
2 40741 51.6429 184.5333 0004267 31.5300 59.4600 15.56668076 3527
ARKYD-3R
1 40742U 98067GU 15220.11211696 .00052881 00000-0 69940-3 0 9999
2 40742 51.6452 184.4780 0004844 56.1585 29.2269 15.57786679 3525
CENTENNIAL 1
1 40743U 98067GV 15220.11578127 .00036444 00000-0 49428-3 0 9991
2 40743 51.6437 184.4998 0004568 57.7461 28.6359 15.57282221 3520
SOYUZ-TMA 17M
1 40744U 15035A 15204.58592506 .00046589 00000-0 68003-3 0 9997
2 40744 51.6451 262.2726 0001334 294.5630 156.6060 15.55189487 119
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment