2000坐标系转经纬度工具_【Leaflet开发】L.CRS + 搞定Leaflet多坐标系拓展

b4fe92840fa9132d4a3b2ade3b15b21c.png

一、CRS源码解析

CRS的定义就几个函数:

12060c44fa3e84f7f22a5bd2b64c7d26.png

没错。你看出来了,其实这玩意就是提供了wgs84坐标系与目标坐标系之间转换的一种算法。因为leaflet内部都是用经纬度坐标系表达的坐标,所以leaflet内部表达所用的坐标系都是wgs84,也就是EPSG:4326。所以啊。不管是计算瓦片行列号,计算瓦片最终在地图上的位置,都需要对应的坐标系的定义进行转换。L.CRS就是定义了这样的一种转换算法。我们来看一下L.CRS.latLngToPoint内部实现:5d135dbc7592a1467e3cea56dcc389df.png 没错。调用了this.projection.project()这个函数。那this.projection的定义呢?没错。单独使用L.CRS这个是无法实现坐标转换的。这只是一个模板,是一个壳,真正做转换的其实是this.projection做的事情。于是我们往下看,Leaflet到底在这个L.CRS里做了什么文章:4601756e83665d999a183fbca57fd7ba.png
 弄了一个Earth对象,继承了CRS的所有属性,新增了distance方法,用来计算两个经纬度之间的距离。这个我们过。

b42cde0673f512dff3a67e97859852af.png

EPSG3857的定义不就出来了?果然在继承的对象中添加了projection对象。并将SphericalMercator赋值给了它。自然而然,我们就找到了EPSG:3857坐标系的投影算法:c824894efab884705f134b3fe232b4b3.png

到这里想必大家看明白了。为了验证我们的想法,马上去看了一下L.CRS提供的4326的算法。果然:结果如我们想象的一样:585ba7f70559d23437754c6cb9c7e866.png0eaba03094c498de78ef8694d4406ddc.png
自己转自己,当然就是随意赋值给自己拉。

二、拓展坐标系

proj4.js是一个开源的,专门用来进行坐标定义和坐标转换的工具。官档只有一个api:

proj4(fromProj, toProj, coord)

 
demo也很简单:

 //2437自定义-->4326var proj1 = '+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=502000 +y_0=2000 +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +units=m +no_defs'; var proj2 = '+proj=longlat +datum=WGS84 +no_defs';var projPoint = proj4(proj1, proj2, [x, y]);

 上面的 proj1 和proj2均可以在 epsg.io网站上获取到

如:获取 4326 的 proj数据

http://epsg.io/4326 在下面部门就可以有

599757c7abd712805d8cfb83f79631a3.png

基于proj4的leaflet扩展可以参考 https://gitee.com/seelingzheng/Proj4Leaflet

部分代码结构如下:

fef90ad4c544a38eb7ba951234832c44.png

使用方式(案例来自Proj4Leaflet 的github仓库)

// RT90 with map's pixel origin at RT90 coordinate (0, 0)var crs = new L.Proj.CRS('EPSG:2400',  '+lon_0=15.808277777799999 +lat_0=0.0 +k=1.0 +x_0=1500000.0 ' +  '+y_0=0.0 +proj=tmerc +ellps=bessel +units=m ' +  '+towgs84=414.1,41.3,603.1,-0.855,2.141,-7.023,0 +no_defs',  {    resolutions: [8192, 4096, 2048] // 3 example zoom level resolutions  });var map = L.map('map', {  crs: crs,  continuousWorld: true,  worldCopyJump: false});L.tileLayer('http://tile.example.com/example/{z}/{x}/{y}.png').addTo(map);

Leaflet入门系列


leaflet 入门系列 hello world

Leaflet入门系列 图层管理控件

Leaflet入门系列 比例尺控件Scale

Leaflet入门系列 Zoom控件

Leaflet入门系列 属性控件

Leaflet入门系列 图标(marker) 样式和事件处理

LeafLet入门系列 图标(marker)属性配置

Leaflet入门系列 popup

LeafLet入门系列 常用插件

LeafLet入门系统 加载wkt文件

LeafLet入门系列 GeoJSON图层

LeafLet入门系列 加载矢量切片

LeafLet入门系列 借助 turfjs 绘制点线面缓冲区

LeafLet入门系列 leaflet 常用插件

LeafLet入门系列 调用百度瓦片地图服务

【Leaflet开发】


【Leaflet开发】L.Control 自定义一个Control

【Leaflet开发】Leaflet 类扩展

【Leaflet开发】L.GridLayer 扩展

【Leaflet开发】热力图

END

 

请:右下点在看65c7c91d6610b47f7b24fdc81a2109f6.gif,右上点【···】分享

bec24c049bc0b19ddc58517774b7b7cc.png

关注我

发现更多精彩