Add a custom style layer
Use a custom style layer to render custom WebGL content.
<!DOCTYPE html><html><head><meta charset="utf-8" /><title>Add a custom style layer</title><meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" /><script src="https://unpkg.com/trackasia-gl@1.0.5/dist/trackasia-gl.js"></script><link href="https://unpkg.com/trackasia-gl@1.0.5/dist/trackasia-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>const map = new trackasiagl.Map({container: 'map',zoom: 7,center: {"lat":10.762622,"lng":106.660172},style: 'https://maps.track-asia.com/styles/v1/streets.json?key=public_key',antialias: true // create the gl context with MSAA antialiasing, so custom layers are antialiased}); // create a custom style layer to implement the WebGL contentconst highlightLayer = {id: 'highlight',type: 'custom', // method called when the layer is added to the map// https://docs.track-asia.com/api/properties/#styleimageinterface#onaddonAdd: function (map, gl) {// create GLSL source for vertex shaderconst vertexSource = `#version 300 es uniform mat4 u_matrix;in vec2 a_pos;void main() {gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0);}`; // create GLSL source for fragment shaderconst fragmentSource = `#version 300 es out highp vec4 fragColor;void main() {fragColor = vec4(0.9, 0.3, 0.3, 0.9);}`; // create a vertex shaderconst vertexShader = gl.createShader(gl.VERTEX_SHADER);gl.shaderSource(vertexShader, vertexSource);gl.compileShader(vertexShader); // create a fragment shaderconst fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);gl.shaderSource(fragmentShader, fragmentSource);gl.compileShader(fragmentShader); // link the two shaders into a WebGL programthis.program = gl.createProgram();gl.attachShader(this.program, vertexShader);gl.attachShader(this.program, fragmentShader);gl.linkProgram(this.program); this.aPos = gl.getAttribLocation(this.program, 'a_pos');// define vertices of the triangle to be rendered in the custom style layerconst helsinki = trackasiagl.MercatorCoordinate.fromLngLat({"lng":106.53,"lat":11.244});const berlin = trackasiagl.MercatorCoordinate.fromLngLat({"lng":106.343,"lat":10.635});const kyiv = trackasiagl.MercatorCoordinate.fromLngLat({"lng":107.261,"lat":10.78}); // create and initialize a WebGLBuffer to store vertex and color datathis.buffer = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);gl.bufferData(gl.ARRAY_BUFFER,new Float32Array([helsinki.x,helsinki.y,berlin.x,berlin.y,kyiv.x,kyiv.y]),gl.STATIC_DRAW);}, // method fired on each animation frame// https://docs.track-asia.com/api/map/#map.event:renderrender: function (gl, matrix) {gl.useProgram(this.program);gl.uniformMatrix4fv(gl.getUniformLocation(this.program, 'u_matrix'),false,matrix);gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);gl.enableVertexAttribArray(this.aPos);gl.vertexAttribPointer(this.aPos, 2, gl.FLOAT, false, 0, 0);gl.enable(gl.BLEND);gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);gl.drawArrays(gl.TRIANGLE_STRIP, 0, 3);}}; // add the custom style layer to the mapmap.on('load', function () {map.addLayer(highlightLayer, 'waterway');});</script> </body></html>