Proj4js 是地理坐标参考系的转换javascript库, 它同时支持不同大地基准面的转换.
maptalks能和proj4js一同工作, 载入不同空间参考系的地图数据.
你所需的只是用proj4js定义一个projection对象, 并设置给地图对象的spatialReference(空间参考)属性.
以下的例子用proj4js来实现了默认的EPSG:3857空间参考.
<!DOCTYPE html>
<html>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>瓦片图层与地理投影 - 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>