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
| import Map from 'ol/Map.js'; import TopoJSON from 'ol/format/TopoJSON.js'; import VectorTileLayer from 'ol/layer/VectorTile.js'; import VectorTileSource from 'ol/source/VectorTile.js'; import View from 'ol/View.js'; import {Fill, Stroke, Style} from 'ol/style.js'; import {fromLonLat} from 'ol/proj.js';
const key = 'Your Nextzen API key from https://developers.nextzen.org/';
const roadStyleCache = {}; const roadColor = { 'major_road': '#776', 'minor_road': '#ccb', 'highway': '#f39', }; const buildingStyle = new Style({ fill: new Fill({ color: '#666', opacity: 0.4, }), stroke: new Stroke({ color: '#444', width: 1, }), }); const waterStyle = new Style({ fill: new Fill({ color: '#9db9e8', }), }); const roadStyle = function (feature) { const kind = feature.get('kind'); const railway = feature.get('railway'); const sort_key = feature.get('sort_key'); const styleKey = kind + '/' + railway + '/' + sort_key; let style = roadStyleCache[styleKey]; if (!style) { let color, width; if (railway) { color = '#7de'; width = 1; } else { color = roadColor[kind]; width = kind == 'highway' ? 1.5 : 1; } style = new Style({ stroke: new Stroke({ color: color, width: width, }), zIndex: sort_key, }); roadStyleCache[styleKey] = style; } return style; };
const map = new Map({ layers: [ new VectorTileLayer({ source: new VectorTileSource({ attributions: '© OpenStreetMap contributors, Who’s On First, ' + 'Natural Earth, and osmdata.openstreetmap.de', format: new TopoJSON({ layerName: 'layer', layers: ['water', 'roads', 'buildings'], }), maxZoom: 19, url: 'https://tile.nextzen.org/tilezen/vector/v1/all/{z}/{x}/{y}.topojson?api_key=' + key, }), style: function (feature, resolution) { switch (feature.get('layer')) { case 'water': return waterStyle; case 'roads': return roadStyle(feature); case 'buildings': return resolution < 10 ? buildingStyle : null; default: return null; } }, }), ], target: 'map', view: new View({ center: fromLonLat([-74.0064, 40.7142]), maxZoom: 19, zoom: 15, }), });
|