perf: 优化经度转换相关代码组织,度分秒精确至毫秒

pull/3/head
zhaipx 12 months ago
parent 3e32f4387e
commit d19a9b94ec

@ -4,48 +4,40 @@
创建人Zhaipeixiu
-->
<script setup lang="ts">
import { DecimalDegree2DMS_Point} from '@/utils/map/coordinate.ts'
import { Angle } from '@/utils/map/angle.ts'
import {ScreenSpaceEventHandler, Math, ScreenSpaceEventType} from 'cesium'
import {coordPoint} from "@/utils/map/geometry.ts";
import {onMounted, ref} from "vue";
let nowLatStr: string, nowLonStr: string
let lonlatStr = ref('')
let isDecimal = ref(true)
let coord_dms : coordPoint = {
lon: '',
lat: ''
}
onMounted(()=>{
let _viewer = window.Viewer
let _viewer = window.viewer
let canvas = _viewer.scene.canvas
let handler = new ScreenSpaceEventHandler(canvas)
handler.setInputAction((e:any)=> {
//
let position: any = _viewer.scene.pickPosition(e.endPosition)
if (!position) {
position = _viewer.scene.camera.pickEllipsoid(
e.startPosition,
_viewer.scene.globe.ellipsoid);
position = _viewer.scene.camera.pickEllipsoid(e.startPosition, _viewer.scene.globe.ellipsoid)
}
if (position) {
//
let cartographic = _viewer.scene.globe.ellipsoid.cartesianToCartographic(position);
try{
//
nowLatStr = Math.toDegrees(cartographic.latitude).toFixed(3) //
nowLonStr = Math.toDegrees(cartographic.longitude).toFixed(3) //
nowLatStr = Math.toDegrees(cartographic.latitude).toFixed(7) //
nowLonStr = Math.toDegrees(cartographic.longitude).toFixed(7) //
let camera_alt = (_viewer.camera.positionCartographic.height / 1000) //
// 250-80
let needElevation: boolean = camera_alt < 250 && (_viewer.camera.pitch < -(Math.PI/180)*80)
let elevStr = needElevation? _viewer.scene.globe.getHeight(cartographic)?.toFixed(2)?? '-' : '-' //
let elevStr = needElevation? _viewer.scene.globe.getHeight(cartographic)?.toFixed(2)?? '' : '' //
if(isDecimal.value) { //
lonlatStr.value = `经度:${nowLonStr} , 纬度:${nowLatStr} , 海拔${elevStr} + m`
lonlatStr.value = `经度:${nowLonStr} , 纬度:${nowLatStr} , 海拔(m)${elevStr}`
}
else {
coord_dms = DecimalDegree2DMS_Point(Number(nowLonStr), Number(nowLatStr))
lonlatStr.value = `经度:${coord_dms.lon} , 纬度:${coord_dms.lat} , 海拔:${elevStr} + m`
lonlatStr.value = `经度:${Angle.DecimalDegree2DMS(nowLonStr)} , 纬度:${Angle.DecimalDegree2DMS(nowLatStr)} , 海拔(m)${elevStr}`
}
} catch (e) {}
}
@ -55,11 +47,10 @@ onMounted(()=>{
function lonlatClick() {
let elevStr = lonlatStr.value.split('海拔')[1]
if(isDecimal.value){
coord_dms = DecimalDegree2DMS_Point(Number(nowLonStr), Number(nowLatStr))
lonlatStr.value = `经度:${coord_dms.lon} , 纬度:${coord_dms.lat} , 海拔` + elevStr
lonlatStr.value = `经度:${Angle.DecimalDegree2DMS(nowLonStr)} , 纬度:${Angle.DecimalDegree2DMS(nowLatStr)} , 海拔(m)` + elevStr
}
else {
lonlatStr.value = `经度:${nowLonStr} , 纬度:${nowLatStr} , 海拔` + elevStr
lonlatStr.value = `经度:${nowLonStr} , 纬度:${nowLatStr} , 海拔(m)` + elevStr
}
isDecimal.value = !isDecimal.value
}

@ -88,7 +88,7 @@ export function getTDTTerrainProvider() {
terrainUrls.push(url)
}
const provider = new window.cesium.GeoTerrainProvider({
const provider = new Cesium.GeoTerrainProvider({
urls: terrainUrls,
})
return provider

@ -0,0 +1,30 @@
class Angle {
constructor() {}
/**
*
* @param decimal_var
* @constructor
*/
static DecimalDegree2DMS(decimal_var: number|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]) / Math.pow(10,decimalStr[1].length) * 60
if(!minutes.toString().includes('.'))
return degreeStr + '°'+ minutes.toString() +'\'0\'\''
let minuteSecondsStr = minutes.toString().split('.')
if (minuteSecondsStr[1]){
let secondStr = Number(minuteSecondsStr[1]) / Math.pow(10,minuteSecondsStr[1].length) * 60
return degreeStr + '°'+ minuteSecondsStr[0] +'\'' + secondStr.toFixed(3) + '\'\''
}
}
return ''
}
}
export { Angle }

@ -6,7 +6,6 @@
* @Description:
*/
import { Cartesian2, Viewer, Math, Cartographic, Cartesian3 } from 'cesium'
import type {coordPoint} from '@/utils/map/geometry.ts'
/**
*
@ -48,37 +47,4 @@ function cartesian3ToWGS84(pos: Cartesian3) {
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 }
export { cartesian2ToCartesian3, cartesian2ToWGS84, cartesian3ToWGS84 }

Loading…
Cancel
Save