坐标转换库
关于
若使用mars3d, 可直接调用方法
JavaScript
const result = mars3d.PointTrans.proj4TransArr([[494771.7940021906397,2509038.9633831670508,56.7851091288603]], 'EPSG:4547', 'EPSG:4326' )
问题来源
1.模型在转成3dtiles
后加载到场景中,这时的模型位置是在转换时通过空间参考来决定的。 但由于业务需求,在模型上或模型四周存在一些标注信息,比如文字
或者标注线
,这些内容的位置信息本身也是建模场景的局部坐标系
, 想要在cesium场景
中正确显示位置,则需要对这些局部坐标
进行转换从而得到能在cesium
中实际使用的坐标
。
2.局部坐标
设置好的相机参数
。
proj4.js
js
//安装
npm install proj4
//引入
import proj4 from "proj4";
/* coordinateInfo示例 */
"投影坐标系": {
"x偏移": "0",
"y偏移": "500000",
"中央子午线角度": "109.6",
"地理坐标系": "cgcs2000"
},
/**
* 坐标转换,将源坐标转换为引擎所使用的坐标
* @param {x} x x值
* @param {y} y y值
* @param {z} z z值
* @param {coordinateInfo} coordinateInfo 投影字符串信息[七参数]
* @returns {object} 转换完成后的坐标信息
*/
function cartesianToLatLng(x, y, z, coordinateInfo) {
//WGS84[cesium场景使用的坐标系]投影字符串
const wgs84 = "+proj=longlat +datum=WGS84 +no_defs";
let utm50n = "+proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=31500000 +y_0=0 +ellps=GRS80 +units=m +no_defs";
//获取七参数值来定义源坐标系投影字符串
if (coordinateInfo && Object.keys(coordinateInfo).length) {
utm50n = `+proj=tmerc +lat_0=0 +lon_0=${coordinateInfo["中央子午线角度"]} +k=1 +x_0=${coordinateInfo["y偏移"]} +y_0=${coordinateInfo["x偏移"]} +ellps=GRS80 +units=m +no_defs`;
}
//将源坐标系的x,y处理为经纬度[注:proj4库不处理z值]
const [lng, lat] = proj4(utm50n, wgs84, [x, y]);
return { lng: lng, lat: lat, alt: z };
}
注意
坐标转换时七参数的准确值很重要,以上只是整个流程,具体代码需要根据proj4.js库的官方文档来使用