/* * @Author: cbwu 504-wuchengbo@htsdfp.com * @Date: 2024-03-22 09:11:54 * @LastEditors: cbwu * @LastEditTime: 2024-03-26 13:33:42 * @Description: 坐标系转化 */ import { Cartesian2, Viewer, Math, Cartographic } from 'cesium' import type {coordPoint} from '@/utils/map/geometry.ts' /** * 屏幕坐标转笛卡尔坐标 * @param viewer * @param windowPosition :屏幕二维坐标 * @returns :笛卡尔坐标 */ function cartesian2ToCartesian3(viewer: Viewer, windowPosition: Cartesian2) { const ray = viewer.camera.getPickRay(windowPosition) if (ray != undefined) { return viewer.scene.globe.pick(ray, viewer.scene) } else return undefined } /** * 屏幕坐标转地理坐标 * @param viewer * @param windowPosition :屏幕坐标 * @returns :WGS84坐标 */ function cartesian2ToWGS84(viewer: Viewer, windowPosition: Cartesian2) { const cartesian3 = cartesian2ToCartesian3(viewer, windowPosition) if (cartesian3 != undefined) { const cartographic = Cartographic.fromCartesian(cartesian3) const lon = Math.toDegrees(cartographic.longitude) // 经度 const lat = Math.toDegrees(cartographic.latitude) // 纬度 const alt = cartographic.height // 高度 return [lon, lat, alt] } else return [] } /** * 十进制经纬度转度分秒。 * @param lon 经度 * @param lat 纬度 * @constructor */ function DecimalDegree2DMS_Point(lon: number, lat: number): coordPoint { let coord_dms : coordPoint = { lon: '', lat: '' } coord_dms.lon = DecimalDegree2DMS(lon) coord_dms.lat = DecimalDegree2DMS(lat) return coord_dms } function DecimalDegree2DMS(decimal_var: number|string): string { if(!decimal_var.toString().includes('.')) return decimal_var.toString() + '°0\'0\'\'' let decimalStr = decimal_var.toString().split('.') let degreeStr = decimalStr[0] if (decimalStr[1]){ let minutes = Number(decimalStr[1]) * 60 / 1000 //十进制度默认显示小数点后3位 if(!minutes.toString().includes('.')) return degreeStr + '°'+ minutes.toString() +'\'0\'\'' let minuteSecondsStr = minutes.toString().split('.') if (minuteSecondsStr[1]){ let secondStr = (Number(minuteSecondsStr[1]) * 60).toFixed(0) return degreeStr + '°'+ minuteSecondsStr[0] +'\'' + secondStr.slice(0,2) + '\'\'' } } return '' } export { cartesian2ToCartesian3, cartesian2ToWGS84, DecimalDegree2DMS_Point }