vue + cesium(2): 地图转换方法(transform.js)

141 阅读1分钟
/*
* 说明:   地图转换方法
*/

import * as Cesium from "cesium/Cesium.js";
import { isNull,} from '@/util/common'


/**
 * 根据一组点位([纬度,经度])计算出中心点
 * @param pointArray
 * @returns {*[]}
 */
export const calculateCenterPoint = (pointArray) => {
    const sortedLongitudeArray=pointArray.map(item=>item.lng).sort();
    const sortedLatitudeArray=pointArray.map(item=>item.lat).sort();
    const centerLongitude=((sortedLongitudeArray[0]+sortedLongitudeArray[sortedLongitudeArray.length-1])/2);
    const centerLatitude=((sortedLatitudeArray[0]+sortedLatitudeArray[sortedLatitudeArray.length-1])/2);
    return [centerLongitude,centerLatitude];
}

/**
 * cartesian3转经纬度(此高度获取不准确在3dtiles)
 * @param cartesian3
 * @returns {(Number|*)[]}
 */
export const cartesian3ToDegrees = (viewer, cartesian3) => {
    let ellipsoid = viewer.scene.globe.ellipsoid;
    let cartographic = ellipsoid.cartesianToCartographic(cartesian3);
    let lat = Cesium.Math.toDegrees(cartographic.latitude);
    let lng = Cesium.Math.toDegrees(cartographic.longitude);
    let alt = cartographic.height;
    return [lng, lat]
}
/**Cesium
 * cartesian3转经纬度(3dtiles下获取位置、在显示地形情况下点击创建点)
 * @param viewer, position
 * @returns {[Number|*, Number|*, Number]}
 */
export const pickPositionCartesian3ToLonLatHeight = (viewer, position) => {
    let cartesian = viewer.scene.pickPosition(position);
    if (Cesium.defined(cartesian)) {
        let cartographic = Cesium.Cartographic.fromCartesian(cartesian);
        let lon = Cesium.Math.toDegrees(cartographic.longitude);
        let lat = Cesium.Math.toDegrees(cartographic.latitude);
        let height = cartographic.height;//模型高度
        return {cartesian: cartesian, lonlat: {lon: lon, lat: lat}}
    }
}

/**
 * cartesian3转经纬度(平面下获取位置、在椭球下点击创建点)
 * @param viewer, position
 * @returns {[Number|*, Number|*, Number]}
 */
export const pickEllipsoidCartesian3ToLonLatHeight = (viewer, position) => {
    let cartesian = viewer.camera.pickEllipsoid(position, viewer.scene.globe.ellipsoid);
    if (Cesium.defined(cartesian)) {
        let cartographic = Cesium.Cartographic.fromCartesian(cartesian);
        let lon = parseFloat(Cesium.Math.toDegrees(cartographic.longitude).toFixed(6));
        let lat = parseFloat(Cesium.Math.toDegrees(cartographic.latitude).toFixed(6));
        return {cartesian: cartesian, lonlat: {lon: lon, lat: lat}}
    }
}
/**
 * rgba 颜色转换
 * @param rgba
 * @returns {Color}
 */
export const rgbaToCesiumColor = (rgba) => {
    return Cesium.Color.fromCssColorString(rgba)
}


/**
 * 后台数据格式转换
 * @param data
 * @returns {*[]}
 */

export const transFormDataFromResponse = (data) => {
    let arr = JSON.parse(JSON.stringify(data))
    for(let item of arr) {
        item.lon = item.lon ? parseFloat((parseFloat(item.lon) / 10000000).toFixed(6)) : null
        item.lat = item.lat ? parseFloat((parseFloat(item.lat) / 10000000).toFixed(6)) : null
        if(!isNull(item.geoJson)) {
            let pointsArr = JSON.parse(item.geoJson)
            // console.log('pointsArr', pointsArr)
            let arr = pointsArr.map(item => {
                return [parseFloat((parseFloat(item.lon) / 10000000).toFixed(6)), parseFloat((parseFloat(item.lat) / 10000000).toFixed(6))]
            })
            item.location = pointsArr.map(item => {
                item.lon = parseFloat( (parseFloat(item.lon) / 10000000).toFixed(6))
                item.lat = parseFloat((parseFloat(item.lat) / 10000000).toFixed(6))
                item.lonTemp = item.lon  //临时存储用于修改用
                item.latTemp = item.lat   //临时存储用于修改用
                item.edit = false
                return item
            })
            let lal = [].concat(...arr)
            item.lal = lal
        }
    }
    return arr;
}

export const transFormDataFromResponsePort = (data) => {
    let arr = JSON.parse(JSON.stringify(data))
    for(let item of arr) {
        if(!isNull(item.points)) {
            let pointsArr = JSON.parse(item.points)
            let arr = pointsArr.map(item => {
                return [parseFloat(item.lon), parseFloat(item.lat)]
            })
            item.lal = arr
        }
    }
    return arr;
}