In addition to using const and let, this also upgrades our linter config and removes lint (mostly whitespace).
101 lines
2.4 KiB
JavaScript
101 lines
2.4 KiB
JavaScript
import Map from '../src/ol/Map.js';
|
|
import View from '../src/ol/View.js';
|
|
import KML from '../src/ol/format/KML.js';
|
|
import TileLayer from '../src/ol/layer/Tile.js';
|
|
import VectorLayer from '../src/ol/layer/Vector.js';
|
|
import Stamen from '../src/ol/source/Stamen.js';
|
|
import VectorSource from '../src/ol/source/Vector.js';
|
|
import CircleStyle from '../src/ol/style/Circle.js';
|
|
import Fill from '../src/ol/style/Fill.js';
|
|
import Stroke from '../src/ol/style/Stroke.js';
|
|
import Style from '../src/ol/style/Style.js';
|
|
|
|
|
|
const styleCache = {};
|
|
const styleFunction = function(feature) {
|
|
// 2012_Earthquakes_Mag5.kml stores the magnitude of each earthquake in a
|
|
// standards-violating <magnitude> tag in each Placemark. We extract it from
|
|
// the Placemark's name instead.
|
|
const name = feature.get('name');
|
|
const magnitude = parseFloat(name.substr(2));
|
|
const radius = 5 + 20 * (magnitude - 5);
|
|
let style = styleCache[radius];
|
|
if (!style) {
|
|
style = new Style({
|
|
image: new CircleStyle({
|
|
radius: radius,
|
|
fill: new Fill({
|
|
color: 'rgba(255, 153, 0, 0.4)'
|
|
}),
|
|
stroke: new Stroke({
|
|
color: 'rgba(255, 204, 0, 0.2)',
|
|
width: 1
|
|
})
|
|
})
|
|
});
|
|
styleCache[radius] = style;
|
|
}
|
|
return style;
|
|
};
|
|
|
|
const vector = new VectorLayer({
|
|
source: new VectorSource({
|
|
url: 'data/kml/2012_Earthquakes_Mag5.kml',
|
|
format: new KML({
|
|
extractStyles: false
|
|
})
|
|
}),
|
|
style: styleFunction
|
|
});
|
|
|
|
const raster = new TileLayer({
|
|
source: new Stamen({
|
|
layer: 'toner'
|
|
})
|
|
});
|
|
|
|
const map = new Map({
|
|
layers: [raster, vector],
|
|
target: 'map',
|
|
view: new View({
|
|
center: [0, 0],
|
|
zoom: 2
|
|
})
|
|
});
|
|
|
|
const info = $('#info');
|
|
info.tooltip({
|
|
animation: false,
|
|
trigger: 'manual'
|
|
});
|
|
|
|
const displayFeatureInfo = function(pixel) {
|
|
info.css({
|
|
left: pixel[0] + 'px',
|
|
top: (pixel[1] - 15) + 'px'
|
|
});
|
|
const feature = map.forEachFeatureAtPixel(pixel, function(feature) {
|
|
return feature;
|
|
});
|
|
if (feature) {
|
|
info.tooltip('hide')
|
|
.attr('data-original-title', feature.get('name'))
|
|
.tooltip('fixTitle')
|
|
.tooltip('show');
|
|
} else {
|
|
info.tooltip('hide');
|
|
}
|
|
};
|
|
|
|
map.on('pointermove', function(evt) {
|
|
if (evt.dragging) {
|
|
info.tooltip('hide');
|
|
return;
|
|
}
|
|
displayFeatureInfo(map.getEventPixel(evt.originalEvent));
|
|
});
|
|
|
|
map.on('click', function(evt) {
|
|
displayFeatureInfo(evt.pixel);
|
|
});
|