UNPKG

3.5 kBJavaScriptView Raw
1// NOCOMPILE
2/* global labelgun, labelSegment, textPath */
3goog.require('ol.Map');
4goog.require('ol.View');
5goog.require('ol.extent');
6goog.require('ol.format.OSMXML');
7goog.require('ol.layer.Tile');
8goog.require('ol.layer.Vector');
9goog.require('ol.source.BingMaps');
10goog.require('ol.source.Vector');
11goog.require('ol.style.Style');
12
13var emptyFn = function() {};
14var labelEngine = new labelgun['default'](emptyFn, emptyFn);
15
16var context, pixelRatio; // Will be set in the map's postcompose listener
17function measureText(text) {
18 return context.measureText(text).width * pixelRatio;
19}
20
21var extent, letters; // Will be set in the style's renderer function
22function collectDrawData(letter, x, y, angle) {
23 ol.extent.extend(extent, [x, y, x, y]);
24 letters.push([x, y, angle, letter]);
25}
26
27var style = new ol.style.Style({
28 renderer: function(coords, context) {
29 var feature = context.feature;
30 var text = feature.get('name');
31 // Only create label when geometry has a long and straight segment
32 var path = labelSegment(coords, Math.PI / 8, measureText(text));
33 if (path) {
34 extent = ol.extent.createEmpty();
35 letters = [];
36 textPath(text, path, measureText, collectDrawData);
37 ol.extent.buffer(extent, 5 * pixelRatio, extent);
38 var bounds = {
39 bottomLeft: ol.extent.getBottomLeft(extent),
40 topRight: ol.extent.getTopRight(extent)
41 };
42 labelEngine.ingestLabel(bounds, feature.getId(), 1, letters, text, false);
43 }
44 }
45});
46
47var rasterLayer = new ol.layer.Tile({
48 source: new ol.source.BingMaps({
49 key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5',
50 imagerySet: 'Aerial'
51 })
52});
53
54var source = new ol.source.Vector();
55// Request streets from OSM, using the Overpass API
56fetch('https://overpass-api.de/api/interpreter', {
57 method: 'POST',
58 body: '(way["highway"](48.19642,16.32580,48.22050,16.41986));(._;>;);out meta;'
59}).then(function(response) {
60 return response.text();
61}).then(function(responseText) {
62 var features = new ol.format.OSMXML().readFeatures(responseText, {
63 featureProjection: 'EPSG:3857'
64 });
65 source.addFeatures(features);
66});
67
68var vectorLayer = new ol.layer.Vector({
69 source: source,
70 style: function(feature) {
71 if (feature.getGeometry().getType() == 'LineString' && feature.get('name')) {
72 return style;
73 }
74 }
75});
76
77var viewExtent = [1817379, 6139595, 1827851, 6143616];
78var map = new ol.Map({
79 layers: [rasterLayer, vectorLayer],
80 target: 'map',
81 view: new ol.View({
82 extent: viewExtent,
83 center: ol.extent.getCenter(viewExtent),
84 zoom: 17,
85 minZoom: 14
86 })
87});
88
89vectorLayer.on('precompose', function() {
90 labelEngine.destroy();
91});
92vectorLayer.on('postcompose', function(e) {
93 context = e.context;
94 pixelRatio = e.frameState.pixelRatio;
95 context.save();
96 context.font = 'normal 11px "Open Sans", "Arial Unicode MS"';
97 context.fillStyle = 'white';
98 context.textBaseline = 'middle';
99 context.textAlign = 'center';
100 var labels = labelEngine.getShown();
101 for (var i = 0, ii = labels.length; i < ii; ++i) {
102 // Render label letter by letter
103 var letters = labels[i].labelObject;
104 for (var j = 0, jj = letters.length; j < jj; ++j) {
105 var labelData = letters[j];
106 context.save();
107 context.translate(labelData[0], labelData[1]);
108 context.rotate(labelData[2]);
109 context.scale(pixelRatio, pixelRatio);
110 context.fillText(labelData[3], 0, 0);
111 context.restore();
112 }
113 }
114 context.restore();
115});