Proj4js is a JavaScript library to transform point coordinates from one coordinate system to another, including datum transformations.
Maptalks can work with proj4js to load maps or data from different geo projections.
All you need to do is to define a projection object with proj4js and set to map's spatial reference.
Below is a proj4js version of the default EPSG:3857 projection.
<!DOCTYPE html> <html> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>TileLayer and Geo-Projections - TileLayer of custom projection by proj4js</title> <style type="text/css"> html,body{margin:0px;height:100%;width:100%} .container{width:100%;height:100%} </style> <link rel="stylesheet" href="https://unpkg.com/maptalks/dist/maptalks.css"> <script type="text/javascript" src="https://unpkg.com/maptalks/dist/maptalks.min.js"></script> <body> <script type="text/javascript" src="proj4.js"></script> <div id="map" class="container"></div> <script> // EPSG:3857's proj definition var proj3857 = '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs'; var proj4 = proj4('WGS84', proj3857); // define a custom projection object var projection = { code : 'proj4-merc', // code of the projection project : function (c) { // from wgs84 to EPSG3857 var pc = proj4.forward(c.toArray()); return new maptalks.Coordinate(pc); }, unproject : function (pc) { // from EPSG3857 to wgs84 var c = proj4.inverse(pc.toArray()); return new maptalks.Coordinate(c); }, // tell projection how to measure // for cartesian coordinates change this to: // measure: 'identity' measure: 'EPSG:4326' }; var map = new maptalks.Map('map', { center: [-0.113049, 51.498568], zoom: 13, // spatial reference definition spatialReference : { projection : projection, // geo projection, defined by proj4js resolutions : [ // map's zoom levels and resolutions 156543.03392804097, 78271.51696402048, 9135.75848201024, 19567.87924100512, 9783.93962050256, 4891.96981025128, 2445.98490512564, 1222.99245256282, 611.49622628141, 305.748113140705, 152.8740565703525, 76.43702828517625, 38.21851414258813, 19.109257071294063, 9.554628535647032, 4.777314267823516, 2.388657133911758, 1.194328566955879, 0.5971642834779395, 0.29858214173896974 ], fullExtent : { // map's full extent 'top': 6378137 * Math.PI, 'left': -6378137 * Math.PI, 'bottom': -6378137 * Math.PI, 'right': 6378137 * Math.PI } }, baseLayer : new maptalks.TileLayer('base',{ urlTemplate: 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png', subdomains: ["a","b","c","d"], attribution: '© <a href="http://osm.org">OpenStreetMap</a> contributors, © <a href="https://carto.com/">CARTO</a>' }) }); </script> </body> </html>