On this post I'm going to pick-up what I've described on my previous two posts and creating a demo of Mapbox Vector Tiles integrated with Mapbox GL.
I'll be more or less recreating what I did on this experiment: http://psousa.net/demos/maps-and-boardgames-part-2/demo3.html
That old experiment used:
- TileMill to create the raster tiles
- UTFGrid tiles to provide meta-information on the hexagons
- Leaflet as the mapping technology
- Tipecanoe to generate the vector tiles (from geojson sources)
- Mapbox GL JS as the mapping technology
With that said, I'm actually going to start with the end-result, followed by the break-down on how it's built.
I didn't try to replicate the experience at 100%, but it's close enough.
Live demo at: http://psousa.net/demos/vector/part3/
How this was done:
Step 1: Creating the vector tiles
This map has two layers: a base-map with the various countries, like what I did on my previous point and an hexagon layer.
Creating the geojson for the countries layer.
I'll summarize the steps I did for my previous post:
- Downloaded the file from: https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/50m/cultural/ne_50m_admin_0_countries.zip
- Converted it to Geojson (I've used QGIS)
Creating the geojson for the hexagon layer
- Used my own tool at: https://github.com/pmcxs/world-hexagon-map
- It's not the scope of this post to explain how I've generated the Geojson layer with hexagons. For now, I'll simply include the end-result on the sample repo
(please see my last post on how to install/use tippecanoe)
tippecanoe -o world.mbtiles -z6 world.geojson hexagons.geojson
Step 2: Creating the Mapbox GL JS map
I won't explain the code in detail (you can see it at: https://github.com/pmcxs/blog-experiments/tree/master/vector-tiles-part-3).
As such, I'll try to keep all my new experiments in Github and leveraging the README there, instead of pasting all the instructions on the blog post.
I'll highlight a couple of key points/features though:
- The helicopters can be dragged. When dropping them, they'll snap to the hexagon's center
- This operation actually uses the real data in the Vector Tiles
- The helicopters have two level of detail icons
- The zoom level is restricted between zoom level 3 and 6
The main code is actually quite small:
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<title>Simple Hexagon Map</title>
<meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />
<script src='https://api.tiles.mapbox.com/mapbox-gl-js/v0.54.0/mapbox-gl.js'></script>
<script src="hexagons.js"></script>
<link href='https://api.tiles.mapbox.com/mapbox-gl-js/v0.54.0/mapbox-gl.css' rel='stylesheet' />
<style>
body {
margin: 0;
padding: 0;
}
#map {
position: absolute;
top: 0;
bottom: 0;
width: 100%;
}
</style>
</head>
<body>
<div id='map'></div>
<script>
var map = new mapboxgl.Map({
container: 'map',
style: 'server/style.json',
center: [0, 42],
maxZoom: 6.0,
minZoom: 3.0,
zoom: 4.5
});
var markers = [];
map.on('load', function () {
addHelicopter(166, 33);
addHelicopter(170, 30);
addHelicopter(175, 20);
addHelicopter(180, 20);
updateHelicoptersVisibility(map.getZoom());
});
map.on('zoom', function () {
updateHelicoptersVisibility(map.getZoom());
});
function addHelicopter(u, v) {
var hexagon = new HexDefinition(500);
var centerPoint = hexagon.getCenterPointXY(u, v);
var centerCoordinate = hexagon.pixelXYToLatLong(centerPoint.x, centerPoint.y, 10);
var el = document.createElement('div');
el.className = 'marker';
var marker = new mapboxgl.Marker(el)
.setLngLat([centerCoordinate.longitude, centerCoordinate.latitude])
.setDraggable(true)
.addTo(map);
marker.on('dragend', function (e) {
var coordinate = e.target.getLngLat();
var point = map.project(coordinate);
var features = map.queryRenderedFeatures(point, { layers: ['hexagons'] });
if (features.length > 0) {
var u = features[0].properties["U"];
var v = features[0].properties["V"];
var centerPoint = hexagon.getCenterPointXY(u, v);
var centerCoordinate = hexagon.pixelXYToLatLong(centerPoint.x, centerPoint.y, 10);
e.target.setLngLat([centerCoordinate.longitude, centerCoordinate.latitude]);
}
});
markers.push(marker);
}
function updateHelicoptersVisibility(zoomLevel) {
for (var i = 0; i < markers.length; i++) {
var element = markers[i].getElement();
if (zoomLevel > 4.7) {
element.style.backgroundImage = 'url(heli_1.png)';
element.style.width = '64px';
element.style.height = '64px';
}
else {
element.style.backgroundImage = 'url(heli_2.png)';
element.style.width = '32px';
element.style.height = '32px';
}
}
}
</script>
</body>
</html>


Pedro'S Tech Mumblings: Playing With Mapbox Vector Tiles (Part 3 - Using Mabox Gl) >>>>> Download Now
ReplyDelete>>>>> Download Full
Pedro'S Tech Mumblings: Playing With Mapbox Vector Tiles (Part 3 - Using Mabox Gl) >>>>> Download LINK
>>>>> Download Now
Pedro'S Tech Mumblings: Playing With Mapbox Vector Tiles (Part 3 - Using Mabox Gl) >>>>> Download Full
>>>>> Download LINK e5