Skip to content

Instantly share code, notes, and snippets.

@evaristoc
Last active December 28, 2018 11:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save evaristoc/ea78ec910cefe9339e2589607ab4e3da to your computer and use it in GitHub Desktop.
Save evaristoc/ea78ec910cefe9339e2589607ab4e3da to your computer and use it in GitHub Desktop.
<!DOCTYPE html>
<head>
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<title>Hello, world!</title>
<!-- include three.js library -->
<script src='js/three.js'></script>
<!-- include jsartookit -->
<script src="jsartoolkit5/artoolkit.min.js"></script>
<script src="jsartoolkit5/artoolkit.api.js"></script>
<!-- include threex.artoolkit -->
<script src="threex/threex-artoolkitsource.js"></script>
<script src="threex/threex-artoolkitcontext.js"></script>
<script src="threex/threex-arbasecontrols.js"></script>
<script src="threex/threex-armarkercontrols.js"></script>
</head>
<body style='margin : 0px; overflow: hidden; font-family: Monospace;'>
<!--
Example created by Lee Stemkoski: https://github.com/stemkoski
Based on the AR.js library and examples created by Jerome Etienne: https://github.com/jeromeetienne/AR.js/
-->
<script>
/// add data
var DAT = DAT || {};
DAT.Globe = function() {
var scene, camera, renderer, clock, deltaTime, totalTime;
var arToolkitSource, arToolkitContext;
var markerRoot1, listofpoints;
var light;
var mesh1, point;
var colorFn = function(x) {
//let c = new THREE.Color;
//console.log(x.toFixed(1));
//return new THREE.Color( "hsl("+String(60 - (x*.5)*100)+"% , 100%, 100%)" );
//return new THREE.Color(x.toFixed(1) , 1, 1 );
return new THREE.Color(x.toFixed(1) , .3, 1 );
};
function initialize(){
scene = new THREE.Scene();
let ambientLight = new THREE.AmbientLight( 0xcccccc, 0.5 );
scene.add( ambientLight );
camera = new THREE.Camera();
scene.add(camera);
renderer = new THREE.WebGLRenderer({
antialias : true,
alpha: true
});
renderer.autoClear = false;
renderer.setClearColor(new THREE.Color('lightgrey'), 0)
renderer.setSize( 640, 580 );
renderer.domElement.style.position = 'absolute'
renderer.domElement.style.top = '0px'
renderer.domElement.style.left = '0px'
document.body.appendChild( renderer.domElement );
clock = new THREE.Clock();
deltaTime = 0;
totalTime = 0;
////////////////////////////////////////////////////////////
// setup arToolkitSource
////////////////////////////////////////////////////////////
arToolkitSource = new THREEx.ArToolkitSource({
sourceType : 'webcam',
});
function onResize()
{
arToolkitSource.onResize()
arToolkitSource.copySizeTo(renderer.domElement)
if ( arToolkitContext.arController !== null )
{
arToolkitSource.copySizeTo(arToolkitContext.arController.canvas)
}
}
arToolkitSource.init(function onReady(){
onResize()
});
// handle resize event
window.addEventListener('resize', function(){
onResize()
});
////////////////////////////////////////////////////////////
// setup arToolkitContext
////////////////////////////////////////////////////////////
// create atToolkitContext
arToolkitContext = new THREEx.ArToolkitContext({
cameraParametersUrl: 'data/camera_para.dat',
detectionMode: 'mono'
});
// copy projection matrix to camera when initialization complete
arToolkitContext.init( function onCompleted(){
camera.projectionMatrix.copy( arToolkitContext.getProjectionMatrix() );
});
////////////////////////////////////////////////////////////
// setup markerRoots
////////////////////////////////////////////////////////////
// build markerControls
markerRoot1 = new THREE.Group();
//scene.add(markerRoot1);
let markerControls1 = new THREEx.ArMarkerControls(arToolkitContext, markerRoot1, {
type: 'pattern', patternUrl: "data/hiro.patt",
})
let geometry1 = new THREE.SphereGeometry(1, 32,32);
console.log(geometry1)
let loader = new THREE.TextureLoader();
let texture = loader.load(
'images/earth-sphere.jpg',
render );
let material1 = new THREE.MeshLambertMaterial( {
map: texture,
opacity: 0.75 } );
mesh1 = new THREE.Mesh( geometry1, material1 );
mesh1.position.y = 1;
//https://github.com/mayaman/mayaman.github.io/blob/master/ufo/globe.js
pointgeometry = new THREE.BoxGeometry(0.025, 0.025, 1);
pointgeometry.applyMatrix(new THREE.Matrix4().makeTranslation(0,0,-0.1));
//following book, I am adding a material to point (I haven't: it was added at part of the object createPoints().points)
var pointmaterial = new THREE.MeshNormalMaterial({transparent: true, opacity: 0.5});
point = new THREE.Mesh(pointgeometry, pointmaterial);
point.castShadow = true;
//markerRoot1.add( point );
//let pointLight = new THREE.PointLight( 0xffffff, 1, 100 );
//pointLight.position.set(0.5,3,2);
//// create a mesh to help visualize the position of the light
//pointLight.add(
// new THREE.Mesh(
// new THREE.SphereBufferGeometry( 0.05, 16,8 ),
// new THREE.MeshBasicMaterial({ color: 0xffffff, opacity: 0.20 })
// )
//);
//markerRoot1.add( pointLight );
light = new THREE.DirectionalLight( 0xffffff ,2);
light.position.set( 20, 20, 20 );
scene.add(light);
}
/*
- addData is called when data is coming
- addPoint is part of addData where first base geometry of point is appended
--- addPoint transforms coordinates into radians and define matrix of points to be merged to a subgeometry
--- it also append to existing mesh, so I have to pass markerroot1 and add it mesh to it
--- it also creates the merged geometry and mesh to be passed to createPoints to be finally added to the scene
- createPoints lies each point (as a an attribute of `this`) on top of the sphere and add them to the scene
*/
/////////////////////////////////
addData = function(data, opts, mesh) {
var lat, lng, size, color, i, step, colorFnWrapper;
opts.animated = opts.animated || false;
this.is_animated = opts.animated;
opts.format = opts.format || 'magnitude'; // other option is 'legend'
if (opts.format === 'magnitude') {
step = 3;
colorFnWrapper = function(data, i) { return colorFn(data[i+2]); }
} else if (opts.format === 'legend') {
step = 4;
colorFnWrapper = function(data, i) { return colorFn(data[i+3]); }
} else {
throw('error: format not supported: '+opts.format);
}
if (opts.animated) {
if (this._baseGeometry === undefined) {
this._baseGeometry = new THREE.Geometry();
for (i = 0; i < data.length; i += step) {
lat = data[i];
lng = data[i + 1];
size = data[i + 2];
color = colorFnWrapper(data,i); //pallete
//color = new THREE.Color( 0x001900 );
//size = size*200;
//size = 1;
addPoint(lat, lng, size, color, this._baseGeometry);
}
}
if(this._morphTargetId === undefined) {
this._morphTargetId = 0;
} else {
this._morphTargetId += 1;
}
opts.name = opts.name || 'morphTarget'+this._morphTargetId;
}
//var sg = new THREE.Group();
var subgeo = new THREE.Geometry();
for (i = 0; i < data.length; i += step) {
lat = data[i];
lng = data[i + 1];
//color = colorFnWrapper(data,i);
//https://stackoverflow.com/questions/11252592/how-to-change-face-color-in-three-js
color = colorFnWrapper(data,i); //pallete
//color = new THREE.Color( 0x001900 );
size = data[i + 2];
//size = size*200;
//size = 1;
addPoint(lat, lng, size, color, subgeo);
}
if (opts.animated) {
this._baseGeometry.morphTargets.push({'name': opts.name, vertices: subgeo.vertices});
} else {
this._baseGeometry = subgeo; //this is passed to createPoints
}
};
////////////////////////////////
///////////////////////////////
function addPoint(lat, lng, size, color, subgeo) {
var phi = (90.0 - lat) * Math.PI / 180.0;
//var theta = (180.0 - lng) * Math.PI / 180.0;
var theta = 1.05*Math.PI + (180.0 - lng) * Math.PI / 180.0; //good point!!! but it appears that points are being rendered later after the sphere, so by the time the sphere renders the points go behind so NOTHING to do with this
//var theta = (90 - lat) * Math.PI / 180;
//var phi = (180 - lng) * Math.PI / 180;
point.position.x = Math.sin(phi) * Math.cos(theta);
point.position.y = Math.cos(phi) + 1; //good!!! this is because points are in relation to sphere, whose COORDINATES are read as ONE (NOTHING to do with screen!!! RELATIVE relation)
point.position.z = Math.sin(phi) * Math.sin(theta);
//point.lookAt(mesh.position);
point.lookAt(mesh1.position);
point.scale.z = Math.max( 2*size, 0.2 ); // avoid non-invertible matrix
point.updateMatrix();
var i;
for (i = 0; i < point.geometry.faces.length; i++) {
//console.log(point);
point.geometry.faces[i].color = color;
}
//console.log(subgeo);
//subgeo.add(point);
//https://codepen.io/karolpodlesny/pen/BNJmKQ
if(point.matrixAutoUpdate){
point.updateMatrix();
}
subgeo.merge(point.geometry, point.matrix);
//subgeo.merge(subgeo, point); //very likely a grouping utility...
}
///////////////////////////////
///////////////////////////////
function createPoints() {
if (this._baseGeometry !== undefined) {
if (this.is_animated === false) {
this.points = new THREE.Mesh(this._baseGeometry, new THREE.MeshBasicMaterial({
//olor: 0x00ff00,
//color: 'red',
vertexColors: THREE.FaceColors,
morphTargets: false
}));
} else {
if (this._baseGeometry.morphTargets.length < 8) {
//console.log(this._baseGeometry.morphTargets);
var padding = 8-this._baseGeometry.morphTargets.length;
for(var i=0; i<=padding; i++) {
this._baseGeometry.morphTargets.push({'name': 'morphPadding'+i, vertices: this._baseGeometry.vertices});
}
}
this.points = new THREE.Mesh(this._baseGeometry, new THREE.MeshBasicMaterial({
//color: 0x00ff00,
vertexColors: THREE.FaceColors,
morphTargets: true
}));
}
//console.log(this.points);
//scene.add(this.points); //originally addObject
markerRoot1.add(this.points);
listofpoints = this.points;
}
markerRoot1.add( mesh1 );
scene.add(markerRoot1);
scene.updateMatrixWorld(true);
var position1 = new THREE.Vector3();
var position2 = new THREE.Vector3();
var position3 = new THREE.Vector3();
position1.setFromMatrixPosition( mesh1.matrixWorld );
position2.setFromMatrixPosition( listofpoints.matrixWorld );
position3.setFromMatrixPosition( markerRoot1.matrixWorld );
//alert(position1.x + ',' + position1.y + ',' + position1.z + '\n\n' + position2.x + ',' + position2.y + ',' + position2.z + '\n\n' + position3.x + ',' + position3.y + ',' + position3.z);
}
function update()
{
if ( markerRoot1.visible )
mesh1.rotation.y += 0.001;
listofpoints.rotation.y += 0.001;
//console.log(mesh1);
// update artoolkit on every frame
if ( arToolkitSource.ready !== false )
arToolkitContext.update( arToolkitSource.domElement );
}
function animate()
{
requestAnimationFrame(animate);
//deltaTime = clock.getDelta();
//totalTime += deltaTime;
render();
}
function render()
{
renderer.clear();
renderer.render( scene, camera );
update();
}
//function render() {
// zoom(curZoomSpeed);
//
// rotation.x += (target.x - rotation.x) * 0.1;
// rotation.y += (target.y - rotation.y) * 0.1;
// distance += (distanceTarget - distance) * 0.3;
//
// camera.position.x = distance * Math.sin(rotation.x) * Math.cos(rotation.y);
// camera.position.y = distance * Math.sin(rotation.y);
// camera.position.z = distance * Math.cos(rotation.x) * Math.cos(rotation.y);
//
// vector.copy(camera.position);
//
// renderer.clear();
// renderer.render(scene, camera);
// renderer.render(sceneAtmosphere, camera);
//}
initialize();
this.render = render;
this.animate = animate;
//this.__defineSetter__('time', function(t) {
// var validMorphs = [];
// var morphDict = this.points.morphTargetDictionary;
// for(var k in morphDict) {
// if(k.indexOf('morphPadding') < 0) {
// validMorphs.push(morphDict[k]);
// }
// }
// validMorphs.sort();
// var l = validMorphs.length-1;
// var scaledt = t*l+1;
// var index = Math.floor(scaledt);
// for (i=0;i<validMorphs.length;i++) {
// this.points.morphTargetInfluences[validMorphs[i]] = 0;
// }
// var lastIndex = index - 1;
// var leftover = scaledt - index;
// if (lastIndex >= 0) {
// this.points.morphTargetInfluences[lastIndex] = 1 - leftover;
// }
// this.points.morphTargetInfluences[index] = leftover;
// this._time = t;
//});
this.addData = addData;
this.createPoints = createPoints;
this.renderer = renderer;
this.scene = scene;
return this;
};
//https://itnext.io/promise-loading-with-three-js-78a6297652a5
//https://www.aeon-creation.com/blog/blender-threejs-arjs/
//https://stackoverflow.com/questions/11363170/units-of-three-js-calculating-rotation-orbit-speeds
//https://threejs.org/docs/#manual/en/introduction/How-to-update-things
var globe = new DAT.Globe();
var xhr;
xhr = new XMLHttpRequest();
xhr.open('GET', 'data/user_locations.json', true);
xhr.onreadystatechange = function(e) {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var data = JSON.parse(xhr.responseText);
//console.log(data);
window.data = data;
for (i=0;i<data.length;i++) {
globe.addData(data[i][1], {format: 'magnitude', name: data[i][0], animated: true});
}
globe.createPoints();
globe.animate();
}
}
};
xhr.send(null);
</script>
</body>
</html>
[["data", [34.52813,69.17233,0.0416,41.3275,19.81889,0.012,36.7525,3.04197,0.1956,35.69111,-0.64167,0.1196,-34.61315,-58.37723,0.0932,-32.94682,-60.63932,0.0048,40.18111,44.51361,0.05,-34.92866,138.59863,0.024,48.75955,-122.48822,0.0308,-27.46794,153.02809,0.0496,-35.28346,149.12807,0.0136,-28.00029,153.43088,0.008,28.08363,-80.60811,0.0928,56.39522,-3.43139,0.0292,46.1351,-60.1831,0.1032,38.90122,-77.26526,0.0348,40.37767,49.89201,0.0072,22.3384,91.83168,0.0072,23.7104,90.40744,0.0788,53.9,27.56667,0.0476,50.85045,4.34878,0.048,51.05,3.71667,0.0068,39.97776,-105.13193,0.0176,37.10415,-113.58412,0.0052,14.31944,-87.67917,0.0092,14.9127,120.56659,0.0052,44.75874,19.21437,0.0084,43.84864,18.35644,0.0264,-22.73917,-47.33139,0.004,-23.55083,-51.46083,0.004,-10.91111,-37.07167,0.0172,-19.92083,-43.93778,0.024,-27.59444,-48.60694,0.0224,-29.16806,-51.17944,0.004,-25.42778,-49.27306,0.0252,-3.71722,-38.54306,0.0236,-25.39048,-51.46541,0.016,-26.30444,-48.84556,0.004,-5.795,-35.20944,0.0084,-30.03306,-51.23,0.0276,-8.05389,-34.88111,0.0192,-22.90278,-43.2075,0.0976,-12.97111,-38.51083,0.0348,-23.96083,-46.33361,0.042,-23.50167,-47.45806,0.0108,-20.31944,-40.33778,0.0144,42.69751,23.32415,0.0204,11.56245,104.91601,0.0164,4.04827,9.70428,0.0072,51.05011,-114.08529,0.042,53.55014,-113.46871,0.0364,49.20678,-122.91092,0.0072,49.10635,-122.82509,0.0076,45.63873,-122.66149,0.0884,49.8844,-97.14704,0.0176,46.11594,-64.80186,0.004,53.71667,-1.85,0.0132,44.40011,-79.66634,0.0064,-37.87822,175.4402,0.0064,55.76667,-4.03333,0.0048,41.92704,-73.99736,0.0064,42.98339,-81.23304,0.3032,43.5789,-79.6583,0.024,43.76681,-79.4163,0.0152,41.34559,-88.84258,0.0408,43.70011,-79.4163,0.096,25.42533,-100.15205,0.0368,39.9075,116.39723,0.0752,28.19874,112.97087,0.006,30.66667,104.06667,0.0048,23.11667,113.25,0.018,30.58333,114.26667,0.0072,10.96854,-74.78132,0.01,7.12539,-73.1198,0.0072,3.43722,-76.5225,0.0076,13.35,123.55,0.0148,-26.62207,-54.10842,0.0052,45.81444,15.97798,0.038,23.13302,-82.38304,0.0064,34.68406,33.03794,0.0072,35.17531,33.3642,0.0068,49.19522,16.60796,0.0136,49.83465,18.28204,0.004,50.08804,14.42076,0.026,55.67594,12.56553,0.0112,55.39594,10.38831,0.0044,22.58667,-80.24361,0.042,-0.22985,-78.52495,0.0072,31.31129,-92.44514,0.0044,30.06263,31.24967,0.1896,42.5467,-83.21132,0.0288,39.98526,-104.82053,0.01,36.59649,-82.18847,0.0128,41.7001,-71.68284,0.0104,37.54557,-97.26893,0.0084,50.83088,-0.1672,0.0044,41.15367,-81.35789,0.0056,53.79648,-1.54785,0.02,-33.9,150.93333,0.0088,38.597,-90.50929,0.048,52.04172,-0.75583,0.0128,42.02834,-97.417,0.0188,38.36067,-75.59937,0.0068,53.38297,-1.4659,0.0144,50.90395,-1.40428,0.0116,53.39254,-2.58024,0.0052,39.9626,-76.72774,0.5812,59.43696,24.75353,0.0204,9.02497,38.74689,0.0152,60.16952,24.93545,0.022,61.49911,23.78712,0.008,60.45148,22.26869,0.0044,43.61092,3.87723,0.0052,47.21725,-1.55336,0.004,33.66094,-95.55551,0.1008,41.69411,44.83368,0.008,52.52437,13.41053,0.0852,52.26594,10.52673,0.0052,50.8357,12.92922,0.0056,53.57532,10.01534,0.02,51.33962,12.37129,0.0056,48.13743,11.57549,0.0364,48.78232,9.17702,0.0152,5.55602,-0.1969,0.0352,34.80287,-86.97167,0.1384,14.64072,-90.51327,0.0172,14.0818,-87.20681,0.0052,22.28552,114.15769,0.0556,47.49801,19.03991,0.0632,23.02579,72.58727,0.0764,19.87757,75.34226,0.0044,23.25469,77.40289,0.012,30.73629,76.7884,0.0112,13.08784,80.27847,0.1484,11.00555,76.96612,0.016,28.65381,77.22897,0.3808,13.6978,123.4892,0.0052,28.4601,77.02635,0.0444,26.1844,91.7458,0.006,26.22983,78.17337,0.004,25.39242,68.37366,0.1796,22.71792,75.8333,0.0208,26.91962,75.78781,0.0596,22.56263,88.36304,0.0808,11.24802,75.7804,0.014,12.91723,74.85603,0.0084,19.07283,72.88261,0.176,12.29791,76.63925,0.0128,28.58,77.33,0.0324,32.06167,118.77778,0.004,50.7236,-3.52751,0.004,18.51957,73.85535,0.1192,23.34777,85.33856,0.0076,25.56892,91.88313,0.0124,31.10442,77.16662,0.0092,32.49268,74.53134,0.0164,25.31668,83.01041,0.01,5.88737,10.01176,0.052,-6.90389,107.61861,0.0372,-6.21462,106.84513,0.1004,-7.81667,112.01667,0.0072,3.58333,98.66667,0.0056,-7.4478,112.7183,0.0044,-7.78278,110.36083,0.006,51.89797,-8.47061,0.0048,32.54044,-82.90375,0.0892,32.81841,34.9885,0.0148,31.76904,35.21633,0.0124,32.08088,34.78057,0.07,37.49223,15.07041,0.004,40.85631,14.24641,0.008,33.15917,129.72278,0.008,35.6895,139.69171,0.0504,31.95522,35.94503,0.1352,51.1801,71.44598,0.008,-0.10221,34.76171,0.0124,-1.28333,36.81667,0.0676,42.67272,21.16688,0.0048,42.87,74.59,0.0164,56.946,24.10589,0.0136,33.88894,35.49442,0.0136,54.68916,25.2798,0.03,41.99646,21.43141,0.0512,41.4375,22.64333,0.024,5.9749,116.0724,0.0056,3.1412,101.68653,0.0884,4.1748,73.50888,0.034,31.73333,-106.48333,0.036,40.62862,-3.16185,0.0564,29.1026,-110.97732,0.0104,19.42847,-99.12766,0.0808,25.67507,-100.31847,0.03,19.04334,-98.20193,0.0116,32.5027,-117.00371,0.016,47.90771,106.88324,0.0136,33.58831,-7.61138,0.0336,31.63416,-7.99994,0.02,-25.96553,32.58322,0.0144,21.97473,96.08359,0.0076,16.80528,96.15611,0.0116,27.70169,85.3206,0.0444,42.93869,-74.18819,0.0756,42.78702,-73.97096,0.0224,52.07667,4.29861,0.012,-36.86667,174.76667,0.0356,50.73583,-1.78129,0.0124,-37.81819,145.00176,0.0296,11.36389,76.78525,0.0112,12.13282,-86.2504,0.0112,9.05785,7.49508,0.026,4.9517,8.322,0.0052,10.52641,7.43879,0.0076,37.10202,-8.67422,0.1472,4.77742,7.0134,0.0156,63.43049,10.39506,0.0072,33.72148,73.04329,0.0328,24.9056,67.0822,0.0656,31.54972,74.34361,0.06,34.008,71.57849,0.0176,30.15946,-85.65983,0.0124,-6.72208,146.98469,0.0048,40.74255,-84.10523,0.0416,8.48222,124.64722,0.0048,7.07306,125.61278,0.0296,14.6042,120.9822,0.2024,14.6488,121.0509,0.0132,9.789,125.495,0.01,53.1235,18.00762,0.0048,54.35205,18.64637,0.0156,54.4418,18.56003,0.0156,52.22977,21.01178,0.0856,41.55032,-8.42005,0.0376,38.71667,-9.13333,0.0628,41.14961,-8.61099,0.03,9.95974,-84.08165,0.0468,25.27932,51.52245,0.0124,44.43225,26.10626,0.1352,47.06667,21.93333,0.0052,45.8,24.15,0.0044,52.29778,104.29639,0.004,55.33333,86.08333,0.0044,45.04484,38.97603,0.0084,46.73239,-117.00017,0.1188,58.01046,56.25017,0.0048,27.77086,-82.67927,0.0232,43.10562,131.87353,0.0048,56.8519,60.6122,0.0128,21.54238,39.19797,0.0068,24.68773,46.72185,0.0136,55.95206,-3.19648,0.032,55.86515,-4.25763,0.0088,44.80401,20.46513,0.0964,45.25167,19.83694,0.0148,-4.61667,55.45,0.0076,1.28967,103.85007,0.1552,48.14816,17.10674,0.0244,46.05108,14.50513,0.0132,-33.92584,18.42322,0.0452,-29.8579,31.0292,0.0124,-26.20227,28.04363,0.0572,35.10278,129.04028,0.0848,35.87028,128.59111,0.0108,35.15472,126.91556,0.0096,35.82194,127.14889,0.004,37.566,126.9784,0.0932,10.13333,-64.7,0.044,36.53998,-4.62473,0.0048,4.73245,-74.26419,0.0752,20.57196,-101.19154,0.004,7.90639,125.09417,0.018,20.68812,-88.19936,0.0048,7.48971,-74.86919,0.004,7.7102,81.6924,0.0064,-25.29167,-49.22417,0.0172,59.33258,18.0649,0.0396,55.60587,13.00073,0.0096,41.88753,-88.30535,0.012,34.72682,36.72339,0.0052,25.04776,121.53185,0.1512,13.75398,100.50144,0.0436,18.79038,98.98468,0.0104,36.81897,10.16579,0.022,39.91987,32.85427,0.0244,0.31628,32.58219,0.0072,48.29149,25.94034,0.01,48.45,34.98333,0.0232,49.98081,36.25272,0.0204,50.45466,30.5238,0.152,31.84568,-102.36764,0.0152,24.46667,54.36667,0.0104,25.0657,55.17128,0.0364,45.33341,-79.21632,0.0072,41.73058,-88.3459,0.006,35.19807,-111.65127,0.006,33.44838,-112.07404,0.114,34.54002,-112.4685,0.006,33.50921,-111.89903,0.114,33.41477,-111.90931,0.114,32.22174,-110.92648,0.0188,33.44873,-84.45493,0.0156,34.74648,-92.28959,0.0184,37.76521,-122.24164,0.154,35.37329,-119.01871,0.008,37.87159,-122.27275,0.154,38.54491,-121.74052,0.008,38.67796,-121.17606,0.0052,41.35033,-83.12186,0.0296,5.15264,-75.03624,0.034,34.13612,-117.86534,0.0104,34.05223,-118.24368,0.348,37.6391,-120.99688,0.014,37.38605,-122.08385,0.0144,34.22834,-118.53675,0.0048,37.80437,-122.2708,0.154,39.10733,-76.57108,0.026,39.77978,-84.1241,0.0308,-19.86528,-47.44,0.0852,34.10834,-117.28977,0.02,-13.66667,-76.15,0.0048,9.89898,-84.00287,0.1328,37.773972,-122.431297,0.4332,35.28275,-120.65962,0.0312,16.0009,120.4023,0.0216,34.39166,-118.54259,0.0052,-3.44882,-79.95952,0.0044,33.49364,-117.14836,0.0072,40.01499,-105.27055,0.0324,38.83388,-104.82136,0.0216,39.73915,-104.9847,0.118,40.58526,-105.08442,0.0188,41.76371,-72.68509,0.0236,41.30815,-72.92816,0.0168,50.8742,0.00772,0.0068,42.54648,-71.17367,0.0048,26.33981,-81.7787,0.0068,26.12231,-80.14338,0.0316,33.62594,-97.13335,0.0232,39.73394,-90.22901,0.0248,28.03947,-81.9498,0.006,25.77427,-80.19366,0.0956,29.95465,-90.07507,0.0364,28.53834,-81.37924,0.0744,30.42131,-87.21691,0.008,30.43826,-84.28073,0.0048,27.33643,-82.53065,0.0076,26.71534,-80.05337,0.0348,33.749,-84.38798,0.2468,32.08354,-81.09983,0.0068,43.6135,-116.20345,0.0172,43.46658,-112.03414,0.0072,46.71621,-122.9543,0.01,41.85003,-87.65005,0.2848,40.69365,-89.58899,0.008,40.70365,-89.40731,0.008,34.07029,-117.39588,0.0148,37.97476,-87.55585,0.004,39.76838,-86.15804,0.0444,41.68338,-86.25001,0.01,42.03471,-93.61994,0.0104,42.00833,-91.64407,0.0104,47.40177,-122.32429,0.0268,39.83865,-86.02526,0.0096,37.69224,-97.33754,0.012,40.27948,-86.51084,0.004,42.19454,-71.83563,0.0076,39.29038,-76.61219,0.004,39.41427,-77.41054,0.0116,43.22862,-88.11037,0.0056,39.64176,-77.71999,0.004,38.99067,-77.02609,0.0192,52.97633,-0.02664,0.2144,33.98154,-81.23621,0.012,42.32509,-72.6412,0.008,42.27756,-83.74088,0.0444,42.33143,-83.04575,0.054,43.01253,-83.68746,0.056,42.96336,-85.66809,0.0132,42.29171,-85.58723,0.012,41.56476,-87.53893,0.0056,42.13982,-71.51617,0.004,44.97997,-93.26384,0.1024,28.2489,-81.28118,0.01,44.94441,-93.09327,0.0148,42.24587,-84.40135,0.0056,36.50921,-86.885,0.0072,45.67965,-111.03856,0.004,46.87215,-113.994,0.0088,-34.86649,-61.5302,0.0088,41.25861,-95.93779,0.0364,36.17497,-115.13722,0.0464,39.52963,-119.8138,0.0112,44.53651,-122.90703,0.0064,40.72816,-74.07764,0.0168,40.48622,-74.45182,0.0196,39.68372,-75.74966,0.0068,39.95373,-74.19792,0.0108,35.08449,-106.65114,0.0156,37.88687,-122.29775,0.0284,45.17191,-93.87469,0.0224,42.44063,-76.49661,0.006,40.71427,-74.00597,0.5852,51.38764,0.50546,0.0248,41.08939,-112.06467,0.006,35.60095,-82.55402,0.0144,35.22709,-80.84313,0.0624,35.7721,-78.63861,0.0856,35.97987,-78.50972,0.0092,36.07264,-79.79198,0.0092,46.80833,-100.78374,0.004,39.162,-84.45689,0.0604,35.15952,-84.87661,0.0476,41.42973,-97.36838,0.0524,39.75895,-84.19161,0.0168,35.46756,-97.51643,0.0368,36.15398,-95.99277,0.0252,44.05207,-123.08675,0.0108,40.8176,-73.00011,0.0076,27.87725,-97.32388,0.1596,40.2737,-76.88442,0.0136,39.95233,-75.16379,0.1428,40.44062,-79.99589,0.074,41.82399,-71.41283,0.0256,39.49615,-88.17615,0.0048,35.61507,-87.03528,0.008,34.94957,-81.93205,0.0104,5.01111,-9.03889,0.0192,35.04563,-85.30968,0.0164,38.29674,-85.75996,0.0064,35.96064,-83.92074,0.018,35.14953,-90.04898,0.0052,36.16589,-86.78444,0.0596,43.66663,-92.97464,0.1928,32.78306,-96.80667,0.1576,31.75872,-106.48693,0.0084,32.72541,-97.32085,0.0312,29.76328,-95.36327,0.1488,31.11712,-97.7278,0.0064,15.3062,120.856,0.042,40.39162,-111.85077,0.0116,40.23384,-111.65853,0.0268,40.76078,-111.89105,0.0852,48.19871,-122.12514,0.0056]]]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment