1 |
|
2 |
|
3 | goog.require('ol.Map');
|
4 | goog.require('ol.View');
|
5 | goog.require('ol.extent');
|
6 | goog.require('ol.format.OSMXML');
|
7 | goog.require('ol.layer.Tile');
|
8 | goog.require('ol.layer.Vector');
|
9 | goog.require('ol.source.BingMaps');
|
10 | goog.require('ol.source.Vector');
|
11 | goog.require('ol.style.Style');
|
12 |
|
13 | var emptyFn = function() {};
|
14 | var labelEngine = new labelgun['default'](emptyFn, emptyFn);
|
15 |
|
16 | var context, pixelRatio;
|
17 | function measureText(text) {
|
18 | return context.measureText(text).width * pixelRatio;
|
19 | }
|
20 |
|
21 | var extent, letters;
|
22 | function collectDrawData(letter, x, y, angle) {
|
23 | ol.extent.extend(extent, [x, y, x, y]);
|
24 | letters.push([x, y, angle, letter]);
|
25 | }
|
26 |
|
27 | var style = new ol.style.Style({
|
28 | renderer: function(coords, context) {
|
29 | var feature = context.feature;
|
30 | var text = feature.get('name');
|
31 |
|
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 |
|
47 | var rasterLayer = new ol.layer.Tile({
|
48 | source: new ol.source.BingMaps({
|
49 | key: 'As1HiMj1PvLPlqc_gtM7AqZfBL8ZL3VrjaS3zIb22Uvb9WKhuJObROC-qUpa81U5',
|
50 | imagerySet: 'Aerial'
|
51 | })
|
52 | });
|
53 |
|
54 | var source = new ol.source.Vector();
|
55 |
|
56 | fetch('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 |
|
68 | var 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 |
|
77 | var viewExtent = [1817379, 6139595, 1827851, 6143616];
|
78 | var 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 |
|
89 | vectorLayer.on('precompose', function() {
|
90 | labelEngine.destroy();
|
91 | });
|
92 | vectorLayer.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 |
|
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 | });
|