You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
GCSGUI/src/utils/map/coordinate.ts

74 lines
2.4 KiB
TypeScript

/*
* @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 }