坐标转换
坐标转换指的是将地理坐标转成屏幕坐标,或者转成webgl坐标,这些功能一般都是插件开发时才会用到,这里就不多介绍了,在高级功能里我们会介绍插件的开发,里面会详细的介绍的
- 转成屏幕坐标,一般是开发2d的插件
- 转成webgl坐标,一般是开发webgl3d插件
WARNING
- 注意这里我们说的坐标转化和平时我们说的是么火星坐标转WGS坐标等不是一回事,火星坐标转WGS坐标这个事情是我们国内特色,我们这里说的引擎层面的内部运行原理
- 至于是么火星坐标转WGS坐标的工具我一般用 gcoord
经纬度和屏幕坐标转换
map上提供了coordinateToContainerPoint
方法
const point = map.coordinateToContainerPoint(coordiante);
一般在我们写插件和自定义图形时才需要用到
如果想屏幕坐标转经纬度
containerPointToCoordinate
方法
const coordinate = map.containerPointToCoordinate(point);
如果你的数据携带海拔,在maptalks内部海拔数据是另外处理的,你可以:
const glRes = map.getGLRes();
//coordinates to glpoint
const renderPoints = map.coordToPointAtRes(coordinate, glRes);
const altitude = coordinate.z || 0;
const point = map._pointAtResToContainerPoint(renderPoints, glRes, altitude);
WARNING
地图坐标的转换都属于实时的,即数据都是临时的,不具有唯一性,即不同的地图视角和状态下这些值都是不一样的 所以不要存储这些转换结果,没有意义
经纬度和gl 坐标转换
经纬度转glpoint你可以:
const glRes = map.getGLRes();
//coordinates to glpoint
const renderPoints = map.coordToPointAtRes(coordinate, glRes);
注意maptalks内部关于海拔都是独立处理的,如果你的数据携带海拔:
const glRes = map.getGLRes();
//coordinates to glpoint
const renderPoints = map.coordToPointAtRes(coordinate, glRes);
//cal atitude value glpoint
const altitudePoint = map.altitudeToPoint(100, glRes);
renderPoints.z = altitudePoint.x;
这个样子就可以和上面的经纬度转glpoint一起组成一个三维的glpoint了
glpoint转经纬度:
const glRes = map.getGLRes();
const coordinate = map.pointAtResToCoordinate(point, glRes);
WARNING
glpoint转经纬度 要注意:
这里的转换都是限于maptalks自身的体系,是么意思?即glpoint的数据应该来自maptalks引擎自身
不同的地图引擎将经纬度转成glpoint都会定义自己的一套坐标划分和转换规则,是么意思?举个例子:maptalks里 glpoint=[1,1]所代表的的经纬值和ceisum等引擎里glpoint=[1,1]所代表的经纬度完全不同,原因就出在不同引擎对 全球的经纬度所建立的glpoint划分和体系完全不一样
如果glpoint的值来自模型,这个就更糟糕了,因为模型的数据都是纯数学的值,都是相对坐标,和任何引擎结合都有问题, 这就是为什么任何引擎加载模型都要你指定中心点的原因,当然像3dtile这样的模型例外,因为其坐标系就是地理坐标系,所以地图引擎能 自动定位到这个模型在物理世界的某处
如果你的glpoint数组来自外部模型,转换的结果一定是不对的,因为glpoint坐标是个纯数学的值,且是个相对值 是无法确定的特定位置的,就像在maptalks上加载模型为什么要填写经纬度值?就是为了确定其中心点. 不像经纬度,其每个值都代表特定的物理世界的位置
每个地图引擎将经纬度转成glpoint都有自身的一套体系规则,互不相同,所以不存在其他引擎里获取的glpoint值放到 maptalks里来转经纬度
maptalks目前并没有开放让普通用户从地图获取glpoint的相关接口和功能(虽然内部有这个功能都是给库开发者自身使用的), 所以在maptalks里将glpoint转成经纬度是个伪需求
目前根据我所知提出这个需求的用户都是想把模型的glpoint或者类似threejs这样的引擎里的 glpoint(Vector3)转成经纬度转的,这个目前没法子做的,因为不同的引擎里对glpoint的规则和划分是不一样的
只有maptalks自身产生的glpoint的值才能在自身上转换起来