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