openlayers6【五】自定义坐标系

1,589 阅读2分钟

1. 前言

openlayer默认只提供了EPSG:4326和EPSG:3857这两种坐标系,在实际的生产环境中我们往往需要自定义坐标系。

2. EPSG查找坐标系信息

目前坐标系基本都是有EPSG来维护的,点击epsg.io进入官网,查找需要定的坐标系,以下以EPSG:3395(极地坐标系-南极)为例

进入链接: epsg.io,输入查询的坐标系,如图所示

image.png

image.png

进入详情页,找到坐标系Projected boundsProj4jsWGS84 bounds选项对应的信息(推荐 turf.js 地图操作的类库,相交 包含等操作)

image.png

image.png

3. 定义作坐标系

openlayer6版本以下

已经拿到坐标系数据,下面创建坐标系实例,代码如下:

// 自定义坐标系
var projection_3395 = new ol.proj.Projection({
    code: 'EPSG:3395',
    extent:[-20026376.39,-15496570.74,20026376.39,18764656.23],
    units: 'm',
    axisOrientation: 'neu'
    getPointResolution(r) {//这个函数非常关键,如果不提供将会导致地图显示比例尺非常大 return r; }
});

proj4.defs("EPSG:3395","+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs");

注意 如果自定义坐标系统无getPointResolution函数,比例尺显示可能会如下:

image.png 自定义坐标系统中加入getPointResolution函数,比例尺显示正常:

image.png

openlayer6版本及以上

proj4.defs("EPSG:3395","+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs");

4. 添加proj4 转换方法

openlayer6版本以下

// 引入
npm i proj4
// 结合proj4在ol3中自定义坐标系,以4326为例(3857同理)
ol.proj.addProjection(projection_3395);
ol.proj.addCoordinateTransforms("EPSG:4326", "EPSG:3395",
    function(coordinate) {
        return proj4("EPSG:4326","EPSG:3395",coordinate);
    },
    function(coordinate) {
        return proj4("EPSG:3395","EPSG:4326",coordinate);;
    }
);
ol.proj.addCoordinateTransforms("EPSG:3857", "EPSG:3395",
    function(coordinate) {
        return proj4("EPSG:3857","EPSG:3395",coordinate);
    },
    function(coordinate) {
        return proj4("EPSG:3395","EPSG:3857",coordinate);;
    }
);

验证转换一个坐标,如果输出正常,祝贺你自定义坐标系成功

ol.proj.transform([118,32],'EPSG:4326','EPSG:3031');

openlayer6版本及以上

import { fromLonLat, transform } from 'ol/proj';
import { register } from 'ol/proj/proj4';

proj4.defs("EPSG:3395","+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs");

register(proj4);

验证转换一个坐标,如果输出正常,祝贺你自定义坐标系成功

ol.proj.transform([118,32],'EPSG:4326','EPSG:3395');

也可设置当前投影下的显示范围

const proj3395 = getProjection("EPSG:3395"); 
proj4526.setExtent([-50000, 50000, -1910, 1910]);

在view中引入

view: new View({ 
    projection: "EPSG:3395", 
    center: [],//中心点 
    zoom: 1, 
}),

注意事项

1.map实例设定对应的坐标系后,moveend 返回的coordinate做了转换,不必进行二次转换;