Using OpenStreetMap vector tiles.
A simple vector tiles map with Mapzen vector tiles. This example uses the TopoJSON format's layerName
option to determine the layer ("water", "roads", "buildings") for styling. Note: [ol/format/MVT
] is an even more efficient format for vector tiles.
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 {fromLonLat} from 'ol/proj.js';
const key = 'Your Nextzen API key from https://developers.nextzen.org/';
const rules = [
{
filter: ['==', ['get', 'layer'], 'water'],
style: {
'fill-color': '#9db9e8',
},
},
{
else: true,
filter: ['all', ['==', ['get', 'layer'], 'roads'], ['get', 'railway']],
style: {
'stroke-color': '#7de',
'stroke-width': 1,
'z-index': ['number', ['get', 'sort_key'], 0],
},
},
{
else: true,
filter: ['==', ['get', 'layer'], 'roads'],
style: {
'stroke-color': [
'match',
['get', 'kind'],
'major_road',
'#776',
'minor_road',
'#ccb',
'highway',
'#f39',
'none',
],
'stroke-width': ['match', ['get', 'kind'], 'highway', 1.5, 1],
'z-index': ['number', ['get', 'sort_key'], 0],
},
},
{
else: true,
filter: [
'all',
['==', ['get', 'layer'], 'buildings'],
['<', ['resolution'], 10],
],
style: {
'fill-color': '#6666',
'stroke-color': '#4446',
'stroke-width': 1,
'z-index': ['number', ['get', 'sort_key'], 0],
},
},
];
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: 16,
url:
'https://tile.nextzen.org/tilezen/vector/v1/all/{z}/{x}/{y}.topojson?api_key=' +
key,
}),
style: rules,
}),
],
target: 'map',
view: new View({
center: fromLonLat([-74.0064, 40.7142]),
maxZoom: 19,
zoom: 15,
}),
});
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>OSM Vector Tiles</title>
<link rel="stylesheet" href="node_modules/ol/ol.css">
<style>
.map {
width: 100%;
height: 400px;
}
.map {
background: #f8f4f0;
}
</style>
</head>
<body>
<div id="map" class="map"></div>
<script type="module" src="main.js"></script>
</body>
</html>
{
"name": "osm-vector-tiles",
"dependencies": {
"ol": "10.2.1"
},
"devDependencies": {
"vite": "^3.2.3"
},
"scripts": {
"start": "vite",
"build": "vite build"
}
}