|
|
|
/*
|
|
|
|
* @Author: cbwu 504-wuchengbo@htsdfp.com
|
|
|
|
* @Date: 2024-03-22 09:11:54
|
|
|
|
* @LastEditors: cbwu
|
|
|
|
* @LastEditTime: 2024-04-01 09:21:17
|
|
|
|
* @Description: 坐标系转化
|
|
|
|
*/
|
|
|
|
import { Cartesian2, Viewer, Math, Cartographic, Cartesian3 } 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) {
|
|
|
|
return cartesian3ToWGS84(cartesian3)
|
|
|
|
} else return []
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* 笛卡尔坐标转WGS84坐标
|
|
|
|
* @param pos 笛卡尔坐标
|
|
|
|
* @returns 经纬度坐标
|
|
|
|
*/
|
|
|
|
function cartesian3ToWGS84(pos: Cartesian3) {
|
|
|
|
if (pos) {
|
|
|
|
const cartographic = Cartographic.fromCartesian(pos)
|
|
|
|
const lon = Math.toDegrees(cartographic.longitude) // 经度
|
|
|
|
const lat = Math.toDegrees(cartographic.latitude) // 纬度
|
|
|
|
const alt = cartographic.height // 高度
|
|
|
|
return [lon, lat, alt]
|
|
|
|
}
|
|
|
|
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,cartesian3ToWGS84 }
|