-
-
Notifications
You must be signed in to change notification settings - Fork 3k
/
icon-sprite-webgl.js
155 lines (145 loc) · 4.08 KB
/
icon-sprite-webgl.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
import Feature from '../src/ol/Feature.js';
import ImageTile from '../src/ol/source/ImageTile.js';
import Map from '../src/ol/Map.js';
import Point from '../src/ol/geom/Point.js';
import TileLayer from '../src/ol/layer/WebGLTile.js';
import VectorSource from '../src/ol/source/Vector.js';
import View from '../src/ol/View.js';
import WebGLPointsLayer from '../src/ol/layer/WebGLPoints.js';
import {fromLonLat} from '../src/ol/proj.js';
const key = 'get_your_own_D6rA4zTHduk6KOKTXzGB';
const attributions =
'<a href="https://www.maptiler.com/copyright/" target="_blank">© MapTiler</a> ' +
'<a href="https://www.openstreetmap.org/copyright" target="_blank">© OpenStreetMap contributors</a>';
const map = new Map({
layers: [
new TileLayer({
source: new ImageTile({
attributions: attributions,
url:
'https://api.maptiler.com/maps/satellite/{z}/{x}/{y}.jpg?key=' + key,
}),
}),
],
target: document.getElementById('map'),
view: new View({
center: [0, 4000000],
zoom: 2,
}),
});
const oldColor = [255, 160, 110];
const newColor = [180, 255, 200];
const style = {
variables: {
filterShape: 'all',
},
filter: [
'any',
['==', ['var', 'filterShape'], 'all'],
['==', ['var', 'filterShape'], ['get', 'shape']],
],
'icon-src': 'data/ufo_shapes.png',
'icon-width': 128,
'icon-height': 64,
'icon-color': [
'interpolate',
['linear'],
['get', 'year'],
1950,
oldColor,
2013,
newColor,
],
'icon-offset': [
'match',
['get', 'shape'],
'light',
[0, 0],
'sphere',
[32, 0],
'circle',
[32, 0],
'disc',
[64, 0],
'oval',
[64, 0],
'triangle',
[96, 0],
'fireball',
[0, 32],
[96, 32],
],
'icon-size': [32, 32],
'icon-scale': 0.5,
};
const shapeSelect = document.getElementById('shape-filter');
shapeSelect.addEventListener('input', function () {
style.variables.filterShape = shapeSelect.value;
map.render();
});
function fillShapeSelect(shapeTypes) {
Object.keys(shapeTypes)
.sort(function (a, b) {
return shapeTypes[b] - shapeTypes[a];
})
.forEach(function (shape) {
const option = document.createElement('option');
const sightings = shapeTypes[shape];
option.text = `${shape} (${sightings} sighting${
sightings === 1 ? '' : 's'
})`;
option.value = shape;
shapeSelect.appendChild(option);
});
}
const client = new XMLHttpRequest();
client.open('GET', 'data/csv/ufo_sighting_data.csv');
client.addEventListener('load', function () {
const csv = client.responseText;
// key is shape name, value is sightings count
const shapeTypes = {};
const features = [];
let prevIndex = csv.indexOf('\n') + 1; // scan past the header line
let curIndex;
while ((curIndex = csv.indexOf('\n', prevIndex)) !== -1) {
const line = csv.substring(prevIndex, curIndex).split(',');
prevIndex = curIndex + 1;
const coords = [parseFloat(line[5]), parseFloat(line[4])];
const shape = line[2];
shapeTypes[shape] = (shapeTypes[shape] || 0) + 1;
features.push(
new Feature({
datetime: line[0],
year: parseInt(/[0-9]{4}/.exec(line[0])[0], 10), // extract the year as int
shape: shape,
duration: line[3],
geometry: new Point(fromLonLat(coords)),
}),
);
}
shapeTypes['all'] = features.length;
map.addLayer(
new WebGLPointsLayer({
source: new VectorSource({
features: features,
attributions: 'National UFO Reporting Center',
}),
style: style,
}),
);
fillShapeSelect(shapeTypes);
});
client.send();
const info = document.getElementById('info');
map.on('pointermove', function (evt) {
if (map.getView().getInteracting() || map.getView().getAnimating()) {
return;
}
const text = map.forEachFeatureAtPixel(evt.pixel, function (feature) {
const datetime = feature.get('datetime');
const duration = feature.get('duration');
const shape = feature.get('shape');
return `On ${datetime}, lasted ${duration} seconds and had a "${shape}" shape.`;
});
info.innerText = text || '';
});