leaflet 自定义了EPSG4326 、EPSG3395、EPSG3857几个坐标系统,不足以满足我们平时工作的需要,所以一般要自定义坐标系统,并进行坐标转换。我们可以借助Proj4.js库来实现投影转换。
- https://spatialreference.org/
- https://epsg.io/:这个比较全面,支持坐标转换,并且提供各种形式的坐标系描述。
// Proj4js.defs('EPSG:4490', '+proj=longlat +ellps=GRS80 +no_defs');
// 定义坐标系
const defs = Proj4js.defs("EPSG:4522", "+proj=tmerc +towgs84=0.0000,0.0000,0.0000 +lat_0=0 +lon_0=102 +k=1 +x_0=34500000 +y_0=0 +ellps=GRS80 +units=m +no_defs +type=crs")
const crs = L.Proj.CRS(
'EPSG:4490',
{
def: defs,
// 这几个参数可以不按照显示顺序书写,scales参数官网说明为比例尺数组,但是根据官网书写会报错
/**
* 起点和比例尺表参数必须填写,设置origin参数才能正确计算切片的位置,设置比例尺表才能在地图初始化时设置
* 缩放级别,而zoom参数是生成地图必填参数
*/
origin: [34558537.09, 2864655.41],
// scales: 0.00000100000,
// scales: [0.00000100000],
// 比例尺因子
scaleDenominators: [1000000, 500000, 250000, 125000, 62500, 31250, 15625, 7812, 3906, 1953],
// 分辨率数组
resolutions: [
1000000.0,
500000.0,
250000.0,
125000.0,
62500.0,
31250.0,
15625.0,
7812.5,
3906.25,
1953.12
],
}
)
/**
* map中center参数为leaflet经纬度格式
*/
// 初始化地图信息
var map = L.map('map', {
crs: crs,
center: [24.904889, 102.801067],
// maxZoom: 10,
zoom: 8
});
// 添加图层
const layer = L.supermap.tiledMapLayer(url, { noWrap: true });
layer.addTo(map)
leaflet CRS中有两个投影方法,project用于将地理坐标转换为投影坐标,而unproject用于将投影坐标转换为地理坐标。
project(<LatLng> latlng) 传入(纬度,经度)格式的坐标,返回类型为 Point
Factory | Description |
---|---|
L.latLng( | 创建一个用给定经纬度代表地理坐标点的对象 |
L.latLng( | 希望数组形式为[Number, Number] 或者[Number, Number, Number]的坐标 |
L.latLng( coords) | 希望一个对象形式为 {lat: Number, lng: Number} 或者{lat: Number, lng: Number, alt: Number} 的坐标 |
unproject(<Point> point) 传入point类型,返回类型为 LatLng
Factory | Description |
---|---|
L.point( | 创建一个用具有(x,y)点的对象,如果round 为true,则舍入x,y的值 |
L.point( | 希望数组形式为[x, y]的坐标 |
L.point( coords) | 希望一个对象形式为 {x: Number, y: Number}的坐标 |