openlayers 地图默认使用 3857坐标系(墨卡托坐标系) <===> 我们常用的 4326坐标系(WGS84坐标系)
既然是两种不同坐标系,那就需要对经纬度进行转换,openlayers官方给出的转换公式是(你可以直接调用 fromLonLat和toLonLat):
// 4326坐标转3857坐标, 这是官方的源码,很好理解,就是你直接用fromLonLat然后只传第一参数,默认就是 4326 转 3857
export function fromLonLat(coordinate, opt_projection) {
return transform(
coordinate,
'EPSG:4326',
opt_projection !== undefined ? opt_projection : 'EPSG:3857'
);
}
// 3857坐标转4326坐标, 你直接用toLonLat然后只传第一参数,默认就是 3857 转 4326
export function toLonLat(coordinate, opt_projection) {
const lonLat = transform(
coordinate,
opt_projection !== undefined ? opt_projection : 'EPSG:3857',
'EPSG:4326'
);
const lon = lonLat[0];
if (lon < -180 || lon > 180) {
lonLat[0] = modulo(lon + 180, 360) - 180;
}
return lonLat;
}
然后我这里给出的是经纬度转换计算公式:
// 3857坐标系转4326坐标系
// 经度= 平面坐标x/20037508.34*180
// 纬度= 180/(PI*(2*atan(exp(平面坐标y/20037508.34*180*PI/180))-PI/2)
export function toLonLat(x, y) {
let lon = (x / 20037508.34) * 180
let lat = (y / 20037508.34) * 180
lat = (180 / Math.PI) * (2 * Math.atan(Math.exp((lat * Math.PI) / 180)) - Math.PI / 2)
return [lon, lat]
}
// 4326坐标系转3857坐标系
// 平面坐标x = 经度*20037508.34/108 平面坐标y = log(tan((90+纬度)*PI/360))/(PI/360)*20037508.34/180
export function fromLonLat(lon, lat) {
let x = (lon * 20037508.34) / 180
let y = Math.log(Math.tan(((90 + lat) * Math.PI) / 360)) / (Math.PI / 180)
y = (y * 20037508.34) / 180
return [x, y]
}