Skip to content

Instantly share code, notes, and snippets.

@darosh
Last active November 5, 2019 23:29
Show Gist options
  • Save darosh/2d12a584a14910032ab8 to your computer and use it in GitHub Desktop.
Save darosh/2d12a584a14910032ab8 to your computer and use it in GitHub Desktop.
Planetary Grid
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
<!DOCTYPE html>
<meta charset="utf-8">
<style>
.cool-point {
fill: none;
stroke: #33e;
stroke-width: 1.5;
stroke-opacity: 0.33;
}
.hot-point {
fill: none;
stroke: #f33;
stroke-width: 1.5;
stroke-opacity: 0.33;
}
.balance-point {
fill: none;
stroke: #333;
stroke-width: 1;
stroke-opacity: 0.33;
}
.graticule {
fill: none;
stroke: #333;
stroke-width: 0.125;
stroke-opacity: 0.66;
}
.cool-edge {
fill: none;
stroke: #33e;
stroke-width: 1.5;
stroke-opacity: .25;
}
.hot-edge {
fill: none;
stroke: #f33;
stroke-width: 1.5;
stroke-opacity: .25;
}
.balance-edge {
fill: none;
stroke: #333;
stroke-width: 1;
stroke-opacity: .25;
}
.country {
fill: #ddd;
stroke-width: 0.5;
stroke-opacity: .75;
stroke: #fff;
}
.place {
fill: #666;
fill-opacity: 0.87;
stroke-width: 0.75;
stroke-opacity: 0.87;
stroke: #444;
}
.place-pyramid {
fill: #ff0;
stroke-width: 1;
stroke: #444;
}
.place-megalith {
fill: #88f;
stroke-width: 1;
stroke: #444;
}
.place-temple {
fill: #f0f;
stroke-width: 1;
stroke: #444;
}
.place-mound {
fill: #4c4;
stroke-width: 1;
stroke: #444;
}
.place-volcano {
fill: #f44;
stroke-width: 1;
stroke: #444;
}
</style>
<body>
<script src="//cdnjs.cloudflare.com/ajax/libs/d3/3.5.6/d3.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/topojson/1.6.19/topojson.min.js"></script>
<script src="togeojson.js"></script>
<script src="/darosh/raw/2fe464efd794bde5ed68/hexakis-icosahedron.js"></script>
<script>
var width = 960, height = 500;
var projection = d3.geo
.mercator()
.translate([width / 2, height / 2 + 30])
.scale(153);
var projectionLines = d3.geo
.mercator()
.rotate([33, 0, 0])
.translate([width / 2, height / 2 + 30])
.scale(153);
var path = d3.geo.path()
.projection(projection);
var pathLines = d3.geo.path()
.projection(projectionLines);
var svg = d3.select('body').append('svg').attr('width', width).attr('height', height);
svg.append('path').datum(d3.geo.graticule()).attr('class', 'graticule').attr('d', path);
var countries = svg.append('path').attr('class', 'country');
var h = d3.geo.hexakisIcosahedron;
svg.append('path').datum(h.icosahedronEdges).attr('class', 'cool-edge').attr('d', pathLines);
svg.append('path').datum(h.hexakisCenterEdges).attr('class', 'hot-edge').attr('d', pathLines);
svg.append('path').datum(h.hexakisSideEdges).attr('class', 'balance-edge').attr('d', pathLines);
svg.append('path').datum(h.icosahedronPoints).attr('class', 'cool-point').attr('d', pathLines);
svg.append('path').datum(h.hexakisCenterPoints).attr('class', 'hot-point').attr('d', pathLines);
svg.append('path').datum(h.hexakisCrossPoints).attr('class', 'balance-point').attr('d', pathLines);
d3.json('countries.json', function (topo) {
var p = topojson.feature(topo, topo.objects.countries);
countries.attr('d', path(p));
});
d3.xml('places.kml', function (xml) {
var g = toGeoJSON.kml(xml);
svg.selectAll('a')
.data(g.features)
.enter()
.append('a')
.attr('xlink:href', function (d) {
return 'https://www.google.com/maps/@' +
d.geometry.coordinates[1] + ',' + d.geometry.coordinates[0]
+ ',12z';
})
.attr('target', '_blank')
.append('path')
.attr('class', function (d) {
return 'place place-' + d.properties.description;
})
.attr('transform', function (d) {
var p = path.centroid(d);
return 'translate(' + p[0] + ',' + p[1] + ')';
})
.attr('d', function (d) {
var t = {
megalith: 'square',
temple: 'cross',
mound: 'triangle-up',
pyramid: 'triangle-up',
place: 'circle',
undefined: 'circle'
};
var s = t[d.properties.description] === 'circle' ? 24 : 40;
return d3.svg.symbol().size(s).type(t[d.properties.description])();
})
.append('title').text(function (d) {
return d.properties.name;
});
});
</script>
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns='http://www.opengis.net/kml/2.2'>
<Document>
<name>Places</name>
<Placemark>
<name>Stonehenge</name>
<description><![CDATA[megalith]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-1.8262150000000474,51.178882,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>The Great Pyramid at Giza</name>
<description><![CDATA[pyramid]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>31.13420199999996,29.979234000000005,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Rapa Nui National Park</name>
<description><![CDATA[megalith]]></description>
<styleUrl>#icon-503-F4EB37</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-109.34857899999997,-27.072877,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Mohenjo-daro</name>
<description><![CDATA[place]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>68.13568899999996,27.324293,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Tana Toraja Regency</name>
<styleUrl>#icon-503-DB4436-nodesc</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>119.74260400000003,-3.0753003000000003,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Machu Picchu</name>
<description><![CDATA[place]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-72.544963,-13.163141,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Standing Stones of Stenness</name>
<description><![CDATA[megalith]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-3.2080570000000534,58.994045,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Silbury Hill</name>
<description><![CDATA[mound]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-1.8573178000000325,51.415952399999995,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Le Grand Menhir</name>
<description><![CDATA[megalith]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-2.9501529000000346,47.571255,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Alignements de Carnac</name>
<description><![CDATA[megalith]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-3.082542,47.59257800000001,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Jættestuen</name>
<description><![CDATA[megalith]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>10.46154899999999,54.865022,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Yazılıkkaya</name>
<description><![CDATA[temple]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>34.63192700000002,40.025575,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Grave Creek Mound</name>
<description><![CDATA[mound]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-80.74431600000004,39.91692,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Leshan Giant Buddha</name>
<description><![CDATA[temple]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>103.77153699999997,29.544131,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Angkor Wat</name>
<description><![CDATA[temple]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>103.86698600000001,13.412469,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Xixia Imperial Tombs</name>
<styleUrl>#icon-503-DB4436-nodesc</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>106.00361799999996,38.426868000000006,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>The General Tomb</name>
<description><![CDATA[pyramid]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>126.22631030000002,41.1576865,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Virupaksha Temple</name>
<description><![CDATA[temple]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>76.45917400000008,15.335022000000002,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Sri Chairman Arunachalam Temple</name>
<description><![CDATA[temple]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>78.69311900000002,10.850914,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>The Monastery</name>
<description><![CDATA[temple]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>35.43098299999997,30.338116000000003,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Great Ziggurat of Ur</name>
<description><![CDATA[temple]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>46.103209600000014,30.9626595,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Crimean Pyramids</name>
<description><![CDATA[pyramid]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>33.42354830000001,44.55505430000001,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Pyramid of the Sun</name>
<description><![CDATA[pyramid]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>18.181960000000004,43.991194,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Philae Temple</name>
<description><![CDATA[temple]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>32.899828999999954,24.088938,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Valley of the Kings</name>
<description><![CDATA[place]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>32.601410999999985,25.740164,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Luxor Temple</name>
<description><![CDATA[temple]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>32.639050999999995,25.699502000000003,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Monks Mound</name>
<description><![CDATA[mound]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-90.06246599999997,38.6601576,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Emerald Mound</name>
<description><![CDATA[mound]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-91.24705460000001,31.6359989,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Crystal River Archaeological State Park</name>
<description><![CDATA[mound]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-82.628469,28.909226999999998,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>El Castillo</name>
<description><![CDATA[pyramid]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-88.56864900000001,20.682986,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Ancient Mayan Civilization</name>
<description><![CDATA[pyramid]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-89.62311699999998,17.221725,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Pyramid of the Sun</name>
<description><![CDATA[pyramid]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-98.84348999999997,19.6928569,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Pyramid of the Moon</name>
<description><![CDATA[pyramid]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-98.8440286,19.6993766,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Copán Ruinas</name>
<description><![CDATA[place]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-89.14678320000002,14.8497254,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>El Tazumal</name>
<description><![CDATA[pyramid]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-89.67427399999997,13.979088,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Puma Punku</name>
<description><![CDATA[temple]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-68.68009899999998,-16.561737,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Muyuq Marka</name>
<description><![CDATA[temple]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-71.982754,-13.509221000000002,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Lake Titicaca</name>
<description><![CDATA[place]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-69.38509899999997,-15.801008000000001,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Apollo-nemrut Dağı</name>
<description><![CDATA[place]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>38.74001899999996,37.980528,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Pyramids of Güímar</name>
<description><![CDATA[pyramid]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-16.413753000000042,28.320814,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Mount Etna</name>
<description><![CDATA[volcano]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>14.993434900000013,37.751005,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Pyramid of Hellinikon</name>
<description><![CDATA[pyramid]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>22.671412000000032,37.587291,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Pyramide de Falicon</name>
<description><![CDATA[pyramid]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>7.260367999999971,43.749902,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Yellowstone Caldera</name>
<description><![CDATA[volcano]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-110.723184,44.41226409999999,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Kangrinboqe Peak</name>
<description><![CDATA[place]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>81.31194440000002,31.067500000000003,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Pyramids of Meroe</name>
<description><![CDATA[pyramid]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>33.74880899999994,16.938183,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Mauritius</name>
<description><![CDATA[pyramid]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>57.55215199999998,-20.348404,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Nazca Lines</name>
<description><![CDATA[place]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-75.130005,-14.739027,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Ngorongoro Crater</name>
<description><![CDATA[volcano]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>35.58766969999999,-3.1617522,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Uluru</name>
<description><![CDATA[place]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>131.03436149999993,-25.3525939,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Cave of Altamira</name>
<description><![CDATA[place]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-4.122346999999991,43.377452,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Extremadura</name>
<description><![CDATA[megalith]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-6.067919399999937,39.4937392,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Dolmen de Soto</name>
<description><![CDATA[megalith]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-6.751480000000015,37.352092,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Koh Ker Temple</name>
<description><![CDATA[pyramid]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>104.53720900000008,13.783105000000003,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Borobudur Temple</name>
<description><![CDATA[pyramid]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>110.20375100000001,-7.607874000000001,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Prambanan Temple</name>
<description><![CDATA[temple]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>110.49146700000006,-7.752021,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Cape Reinga</name>
<description><![CDATA[place]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>172.68048699999997,-34.4287786,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Chaco Culture National Historical Park</name>
<styleUrl>#icon-503-DB4436-nodesc</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-107.96176100000004,36.060771,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Temple of the Jaguar</name>
<description><![CDATA[pyramid]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-88.65330699999998,17.765103,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Temple of the Sun</name>
<description><![CDATA[pyramid]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-92.045887,17.482787,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Sanctuary of Bel</name>
<description><![CDATA[temple]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>38.274071000000056,34.547476,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Göbekli Tepe</name>
<description><![CDATA[place]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>38.854254399999945,37.2170459,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Templo del Adivino</name>
<description><![CDATA[pyramid]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-89.76748470000001,20.36048,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Coral Castle Museum</name>
<description><![CDATA[place]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-80.4443,25.500722,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Hacienda Zuleta</name>
<description><![CDATA[place]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-78.26666699999998,0.233333,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>HAARP Government Research Facility</name>
<styleUrl>#icon-503-DB4436-nodesc</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-145.15053,62.392372,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>SANAP Meteorological and Biological Station</name>
<description><![CDATA[place]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>37.85883799999999,-46.875822,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>SANAP Weather Station</name>
<description><![CDATA[place]]></description>
<styleUrl>#icon-503-DB4436</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-9.879711000000043,-40.349668,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>John Kennedy’s Assassination Site</name>
<styleUrl>#icon-503-DB4436-nodesc</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-96.80870900000002,32.778995,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Triangle Air Field</name>
<styleUrl>#icon-503-DB4436-nodesc</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-112.633645,33.745111,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Eye of the Sahara</name>
<styleUrl>#icon-503-DB4436-nodesc</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-11.402092000000039,21.126779,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Mauna Kea</name>
<styleUrl>#icon-503-DB4436-nodesc</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-155.46809359999997,19.8206105,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Giant Rock</name>
<styleUrl>#icon-503-DB4436-nodesc</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-116.38862610000002,34.3330562,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Washington</name>
<styleUrl>#icon-503-DB4436-nodesc</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>-77.03687070000001,38.9071923,0.0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Perm</name>
<styleUrl>#icon-503-DB4436-nodesc</styleUrl>
<ExtendedData>
</ExtendedData>
<Point>
<coordinates>56.26679160000003,58.02968129999999,0.0</coordinates>
</Point>
</Placemark>
<Style id='icon-503-DB4436-normal'>
<IconStyle>
<color>ff3644DB</color>
<scale>1.1</scale>
<Icon>
<href>http://www.gstatic.com/mapspro/images/stock/503-wht-blank_maps.png</href>
</Icon>
<hotSpot x='16' y='31' xunits='pixels' yunits='insetPixels'>
</hotSpot>
</IconStyle>
<LabelStyle>
<scale>0.0</scale>
</LabelStyle>
</Style>
<Style id='icon-503-DB4436-highlight'>
<IconStyle>
<color>ff3644DB</color>
<scale>1.1</scale>
<Icon>
<href>http://www.gstatic.com/mapspro/images/stock/503-wht-blank_maps.png</href>
</Icon>
<hotSpot x='16' y='31' xunits='pixels' yunits='insetPixels'>
</hotSpot>
</IconStyle>
<LabelStyle>
<scale>1.1</scale>
</LabelStyle>
</Style>
<StyleMap id='icon-503-DB4436'>
<Pair>
<key>normal</key>
<styleUrl>#icon-503-DB4436-normal</styleUrl>
</Pair>
<Pair>
<key>highlight</key>
<styleUrl>#icon-503-DB4436-highlight</styleUrl>
</Pair>
</StyleMap>
<Style id='icon-503-DB4436-nodesc-normal'>
<IconStyle>
<color>ff3644DB</color>
<scale>1.1</scale>
<Icon>
<href>http://www.gstatic.com/mapspro/images/stock/503-wht-blank_maps.png</href>
</Icon>
<hotSpot x='16' y='31' xunits='pixels' yunits='insetPixels'>
</hotSpot>
</IconStyle>
<LabelStyle>
<scale>0.0</scale>
</LabelStyle>
<BalloonStyle>
<text><![CDATA[<h3>$[name]</h3>]]></text>
</BalloonStyle>
</Style>
<Style id='icon-503-DB4436-nodesc-highlight'>
<IconStyle>
<color>ff3644DB</color>
<scale>1.1</scale>
<Icon>
<href>http://www.gstatic.com/mapspro/images/stock/503-wht-blank_maps.png</href>
</Icon>
<hotSpot x='16' y='31' xunits='pixels' yunits='insetPixels'>
</hotSpot>
</IconStyle>
<LabelStyle>
<scale>1.1</scale>
</LabelStyle>
<BalloonStyle>
<text><![CDATA[<h3>$[name]</h3>]]></text>
</BalloonStyle>
</Style>
<StyleMap id='icon-503-DB4436-nodesc'>
<Pair>
<key>normal</key>
<styleUrl>#icon-503-DB4436-nodesc-normal</styleUrl>
</Pair>
<Pair>
<key>highlight</key>
<styleUrl>#icon-503-DB4436-nodesc-highlight</styleUrl>
</Pair>
</StyleMap>
<Style id='icon-503-F4EB37-normal'>
<IconStyle>
<color>ff37EBF4</color>
<scale>1.1</scale>
<Icon>
<href>http://www.gstatic.com/mapspro/images/stock/503-wht-blank_maps.png</href>
</Icon>
<hotSpot x='16' y='31' xunits='pixels' yunits='insetPixels'>
</hotSpot>
</IconStyle>
<LabelStyle>
<scale>0.0</scale>
</LabelStyle>
</Style>
<Style id='icon-503-F4EB37-highlight'>
<IconStyle>
<color>ff37EBF4</color>
<scale>1.1</scale>
<Icon>
<href>http://www.gstatic.com/mapspro/images/stock/503-wht-blank_maps.png</href>
</Icon>
<hotSpot x='16' y='31' xunits='pixels' yunits='insetPixels'>
</hotSpot>
</IconStyle>
<LabelStyle>
<scale>1.1</scale>
</LabelStyle>
</Style>
<StyleMap id='icon-503-F4EB37'>
<Pair>
<key>normal</key>
<styleUrl>#icon-503-F4EB37-normal</styleUrl>
</Pair>
<Pair>
<key>highlight</key>
<styleUrl>#icon-503-F4EB37-highlight</styleUrl>
</Pair>
</StyleMap>
</Document>
</kml>
toGeoJSON = (function() {
'use strict';
var removeSpace = (/\s*/g),
trimSpace = (/^\s*|\s*$/g),
splitSpace = (/\s+/);
// generate a short, numeric hash of a string
function okhash(x) {
if (!x || !x.length) return 0;
for (var i = 0, h = 0; i < x.length; i++) {
h = ((h << 5) - h) + x.charCodeAt(i) | 0;
} return h;
}
// all Y children of X
function get(x, y) { return x.getElementsByTagName(y); }
function attr(x, y) { return x.getAttribute(y); }
function attrf(x, y) { return parseFloat(attr(x, y)); }
// one Y child of X, if any, otherwise null
function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
// https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
function norm(el) { if (el.normalize) { el.normalize(); } return el; }
// cast array x into numbers
function numarray(x) {
for (var j = 0, o = []; j < x.length; j++) o[j] = parseFloat(x[j]);
return o;
}
function clean(x) {
var o = {};
for (var i in x) if (x[i]) o[i] = x[i];
return o;
}
// get the content of a text node, if any
function nodeVal(x) {
if (x) { norm(x); }
return (x && x.firstChild && x.firstChild.nodeValue) || '';
}
// get one coordinate from a coordinate array, if any
function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
// get all coordinates from a coordinate array as [[],[]]
function coord(v) {
var coords = v.replace(trimSpace, '').split(splitSpace),
o = [];
for (var i = 0; i < coords.length; i++) {
o.push(coord1(coords[i]));
}
return o;
}
function coordPair(x) {
var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
ele = get1(x, 'ele');
if (ele) ll.push(parseFloat(nodeVal(ele)));
return ll;
}
// create a new feature collection parent object
function fc() {
return {
type: 'FeatureCollection',
features: []
};
}
var serializer;
if (typeof XMLSerializer !== 'undefined') {
serializer = new XMLSerializer();
// only require xmldom in a node environment
} else if (typeof exports === 'object' && typeof process === 'object' && !process.browser) {
serializer = new (require('xmldom').XMLSerializer)();
}
function xml2str(str) { return serializer.serializeToString(str); }
var t = {
kml: function(doc, o) {
o = o || {};
var gj = fc(),
// styleindex keeps track of hashed styles in order to match features
styleIndex = {},
// atomic geospatial types supported by KML - MultiGeometry is
// handled separately
geotypes = ['Polygon', 'LineString', 'Point', 'Track'],
// all root placemarks in the file
placemarks = get(doc, 'Placemark'),
styles = get(doc, 'Style');
for (var k = 0; k < styles.length; k++) {
styleIndex['#' + attr(styles[k], 'id')] = okhash(xml2str(styles[k])).toString(16);
}
for (var j = 0; j < placemarks.length; j++) {
gj.features = gj.features.concat(getPlacemark(placemarks[j]));
}
function kmlColor(v) {
var color, opacity;
v = v || "";
if (v.substr(0, 1) === "#") v = v.substr(1);
if (v.length === 6 || v.length === 3) color = v;
if (v.length === 8) {
opacity = parseInt(v.substr(0, 2), 16) / 255;
color = v.substr(2);
}
return [color, isNaN(opacity) ? undefined : opacity];
}
function gxCoord(v) { return numarray(v.split(' ')); }
function gxCoords(root) {
var elems = get(root, 'coord', 'gx'), coords = [];
for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
return coords;
}
function getGeometry(root) {
var geomNode, geomNodes, i, j, k, geoms = [];
if (get1(root, 'MultiGeometry')) return getGeometry(get1(root, 'MultiGeometry'));
if (get1(root, 'MultiTrack')) return getGeometry(get1(root, 'MultiTrack'));
for (i = 0; i < geotypes.length; i++) {
geomNodes = get(root, geotypes[i]);
if (geomNodes) {
for (j = 0; j < geomNodes.length; j++) {
geomNode = geomNodes[j];
if (geotypes[i] == 'Point') {
geoms.push({
type: 'Point',
coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
});
} else if (geotypes[i] == 'LineString') {
geoms.push({
type: 'LineString',
coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
});
} else if (geotypes[i] == 'Polygon') {
var rings = get(geomNode, 'LinearRing'),
coords = [];
for (k = 0; k < rings.length; k++) {
coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
}
geoms.push({
type: 'Polygon',
coordinates: coords
});
} else if (geotypes[i] == 'Track') {
geoms.push({
type: 'LineString',
coordinates: gxCoords(geomNode)
});
}
}
}
}
return geoms;
}
function getPlacemark(root) {
var geoms = getGeometry(root), i, properties = {},
name = nodeVal(get1(root, 'name')),
styleUrl = nodeVal(get1(root, 'styleUrl')),
description = nodeVal(get1(root, 'description')),
timeSpan = get1(root, 'TimeSpan'),
extendedData = get1(root, 'ExtendedData'),
lineStyle = get1(root, 'LineStyle'),
polyStyle = get1(root, 'PolyStyle');
if (!geoms.length) return [];
if (name) properties.name = name;
if (styleUrl && styleIndex[styleUrl]) {
properties.styleUrl = styleUrl;
properties.styleHash = styleIndex[styleUrl];
}
if (description) properties.description = description;
if (timeSpan) {
var begin = nodeVal(get1(timeSpan, 'begin'));
var end = nodeVal(get1(timeSpan, 'end'));
properties.timespan = { begin: begin, end: end };
}
if (lineStyle) {
var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
color = linestyles[0],
opacity = linestyles[1],
width = parseFloat(nodeVal(get1(lineStyle, 'width')));
if (color) properties.stroke = color;
if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
if (!isNaN(width)) properties['stroke-width'] = width;
}
if (polyStyle) {
var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
pcolor = polystyles[0],
popacity = polystyles[1],
fill = nodeVal(get1(polyStyle, 'fill')),
outline = nodeVal(get1(polyStyle, 'outline'));
if (pcolor) properties.fill = pcolor;
if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
if (fill) properties['fill-opacity'] = fill === "1" ? 1 : 0;
if (outline) properties['stroke-opacity'] = outline === "1" ? 1 : 0;
}
if (extendedData) {
var datas = get(extendedData, 'Data'),
simpleDatas = get(extendedData, 'SimpleData');
for (i = 0; i < datas.length; i++) {
properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
}
for (i = 0; i < simpleDatas.length; i++) {
properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
}
}
return [{
type: 'Feature',
geometry: (geoms.length === 1) ? geoms[0] : {
type: 'GeometryCollection',
geometries: geoms
},
properties: properties
}];
}
return gj;
},
gpx: function(doc, o) {
var i,
tracks = get(doc, 'trk'),
routes = get(doc, 'rte'),
waypoints = get(doc, 'wpt'),
// a feature collection
gj = fc();
for (i = 0; i < tracks.length; i++) {
gj.features.push(getTrack(tracks[i]));
}
for (i = 0; i < routes.length; i++) {
gj.features.push(getRoute(routes[i]));
}
for (i = 0; i < waypoints.length; i++) {
gj.features.push(getPoint(waypoints[i]));
}
function getPoints(node, pointname) {
var pts = get(node, pointname), line = [];
for (var i = 0; i < pts.length; i++) {
line.push(coordPair(pts[i]));
}
return line;
}
function getTrack(node) {
var segments = get(node, 'trkseg'), track = [];
for (var i = 0; i < segments.length; i++) {
track.push(getPoints(segments[i], 'trkpt'));
}
return {
type: 'Feature',
properties: getProperties(node),
geometry: {
type: track.length === 1 ? 'LineString' : 'MultiLineString',
coordinates: track.length === 1 ? track[0] : track
}
};
}
function getRoute(node) {
return {
type: 'Feature',
properties: getProperties(node),
geometry: {
type: 'LineString',
coordinates: getPoints(node, 'rtept')
}
};
}
function getPoint(node) {
var prop = getProperties(node);
prop.sym = nodeVal(get1(node, 'sym'));
return {
type: 'Feature',
properties: prop,
geometry: {
type: 'Point',
coordinates: coordPair(node)
}
};
}
function getProperties(node) {
var meta = ['name', 'desc', 'author', 'copyright', 'link',
'time', 'keywords'],
prop = {},
k;
for (k = 0; k < meta.length; k++) {
prop[meta[k]] = nodeVal(get1(node, meta[k]));
}
return clean(prop);
}
return gj;
}
};
return t;
})();
if (typeof module !== 'undefined') module.exports = toGeoJSON;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment