| | |
| | | import * as Cesium from 'cesium'; |
| | | import * as turf from '@turf/turf'; |
| | | import * as Cesium from 'cesium' |
| | | import * as turf from '@turf/turf' |
| | | |
| | | export const getLngLatDistance = (lat1, lng1, lat2, lng2) => { |
| | | const radLat1 = (lat1 * Math.PI) / 180.0 |
| | |
| | | Math.asin( |
| | | Math.sqrt( |
| | | Math.pow(Math.sin(a / 2), 2) + |
| | | Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2), |
| | | ), |
| | | Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2) |
| | | ) |
| | | ) |
| | | s = s * 6378.137 // EARTH_RADIUS; |
| | | s = Math.round(s * 10000) / 10000 |
| | |
| | | } |
| | | |
| | | // 获取限polyline长度 |
| | | export const getPolylineLength = (entity) => { |
| | | export const getPolylineLength = entity => { |
| | | let length = 0 |
| | | |
| | | // 获取Polyline的所有顶点位置 |
| | |
| | | // const distance = new Cesium.EllipsoidGeodesic(startCartesianPosition, endCartesianPosition, ellipsoid) |
| | | // return distance |
| | | const { longitude, latitude, height } = end |
| | | const cartographic = Cesium.Cartographic.fromDegrees( |
| | | longitude, |
| | | latitude, |
| | | height, |
| | | ) |
| | | const cartographic = Cesium.Cartographic.fromDegrees(longitude, latitude, height) |
| | | const cartesianPosition = ellipsoid.cartographicToCartesian(cartographic) |
| | | const haeHeight = ellipsoid.cartesianToCartographic(cartesianPosition).height |
| | | return haeHeight |
| | |
| | | export const cartesian3Convert = (cartesian3Position, viewer) => { |
| | | // 转换为经纬度 |
| | | const ellipsoid = viewer.scene.globe.ellipsoid |
| | | const cartographicPosition = Cesium.Cartographic.fromCartesian( |
| | | cartesian3Position, |
| | | ellipsoid, |
| | | ) |
| | | const cartographicPosition = Cesium.Cartographic.fromCartesian(cartesian3Position, ellipsoid) |
| | | const longitude = Cesium.Math.toDegrees(cartographicPosition.longitude) |
| | | const latitude = Cesium.Math.toDegrees(cartographicPosition.latitude) |
| | | const height = cartographicPosition.height |
| | |
| | | // Cesium Cartesian2 转正常经纬度 |
| | | export const cartesian2Convert = (position, viewer) => { |
| | | const ellipsoid = viewer.scene.globe.ellipsoid |
| | | const c3Position = viewer.scene.globe.pick( |
| | | viewer.camera.getPickRay(position), |
| | | viewer.scene, |
| | | ) |
| | | const c3Position = viewer.scene.globe.pick(viewer.camera.getPickRay(position), viewer.scene) |
| | | const c2Postion = ellipsoid.cartesianToCartographic(c3Position) |
| | | const longitude = Cesium.Math.toDegrees(c2Postion.longitude) |
| | | const latitude = Cesium.Math.toDegrees(c2Postion.latitude) |
| | |
| | | |
| | | // 根据经纬度获取距离 |
| | | export const getLnglatDist = (lng1, lat1, lng2, lat2) => { |
| | | const start = new Cesium.Cartesian3.fromDegrees( |
| | | Number(lng1), |
| | | Number(lat1), |
| | | 0, |
| | | ) |
| | | const start = new Cesium.Cartesian3.fromDegrees(Number(lng1), Number(lat1), 0) |
| | | const end = new Cesium.Cartesian3.fromDegrees(Number(lng2), Number(lat2), 0) |
| | | return Cesium.Cartesian3.distance(start, end) |
| | | } |
| | |
| | | * @param coordinateList {Array<Array<Object>>} [[{lat, lng}]] |
| | | * @return { Object } {lat lng} |
| | | */ |
| | | export const getCenterPoint = (coordinateList) => { |
| | | coordinateList = coordinateList.map((item) => { |
| | | export const getCenterPoint = coordinateList => { |
| | | coordinateList = coordinateList.map(item => { |
| | | const [lng, lat] = item |
| | | return [{ lat, lng }] |
| | | }) |
| | |
| | | const cartographic = Cesium.Cartographic.fromDegrees(longitude, latitude) |
| | | |
| | | // 获取地形数据的Promise |
| | | const promise = Cesium.sampleTerrainMostDetailed(terrainProvider, [ |
| | | cartographic, |
| | | ]) |
| | | const promise = Cesium.sampleTerrainMostDetailed(terrainProvider, [cartographic]) |
| | | |
| | | // 使用 Cesium.when 处理 Promise |
| | | promise |
| | |
| | | const terrainProvider = viewer?.terrainProvider |
| | | |
| | | // 创建 Cartographic 对象 |
| | | const cartographics = data.map((item) => { |
| | | const cartographics = data.map(item => { |
| | | const [lng, lat] = item?.['Point']?.['coordinates']?.['#text'].split(',') |
| | | |
| | | return Cesium.Cartographic.fromDegrees(Number(lng), Number(lat)) |
| | | }) |
| | | |
| | | // 获取地形数据的Promise |
| | | const promise = Cesium.sampleTerrainMostDetailed( |
| | | terrainProvider, |
| | | cartographics, |
| | | ) |
| | | const promise = Cesium.sampleTerrainMostDetailed(terrainProvider, cartographics) |
| | | |
| | | // 使用 Cesium.when 处理 Promise |
| | | promise |
| | |
| | | const longitude = Cesium.Math.toDegrees(item.longitude) |
| | | const latitude = Cesium.Math.toDegrees(item.latitude) |
| | | |
| | | let FinalHeight = Number(data[index]?.['ellipsoidHeight']?.['#text']) + Number(item.height) |
| | | let FinalHeight = |
| | | Number(data[index]?.['ellipsoidHeight']?.['#text']) + Number(item.height) |
| | | |
| | | if (droneHeight) { |
| | | FinalHeight = Number(data[index]?.['ellipsoidHeight']?.['#text']) + droneHeight |
| | |
| | | const cesiumSamplePoints = [] |
| | | for (let i = 0; i < turfSamplePoints.features.length; i++) { |
| | | const coord = turfSamplePoints.features[i].geometry.coordinates |
| | | cesiumSamplePoints.push( |
| | | Cesium.Cartographic.fromDegrees(coord[0], coord[1]), |
| | | ) |
| | | cesiumSamplePoints.push(Cesium.Cartographic.fromDegrees(coord[0], coord[1])) |
| | | } |
| | | |
| | | // 获取地形数据的Promise |
| | | const promise = Cesium.sampleTerrainMostDetailed( |
| | | terrainProvider, |
| | | cesiumSamplePoints, |
| | | ) |
| | | const promise = Cesium.sampleTerrainMostDetailed(terrainProvider, cesiumSamplePoints) |
| | | |
| | | promise |
| | | .then(function (updatedPositions) { |
| | | const newPosition = updatedPositions.map((item) => Number(item.height)) |
| | | const newPosition = updatedPositions.map(item => Number(item.height)) |
| | | |
| | | resolve(Math.max(...newPosition)) |
| | | }) |
| | |
| | | } |
| | | |
| | | // 展示当前的高度 |
| | | export const getWaylineShowHeight = (positions) => { |
| | | export const getWaylineShowHeight = positions => { |
| | | const { lng, lat } = getCenterPoint(positions) |
| | | let maxDist = 0 |
| | | positions.forEach((item) => { |
| | | positions.forEach(item => { |
| | | const [lng1, lat1] = item |
| | | let pointsDist = getLnglatDist(lng1, lat1, lng, lat) |
| | | if (pointsDist > maxDist) { |
| | |
| | | } |
| | | |
| | | // 获取当前面是否有交叉点 |
| | | export const isIntersection = (coordinates) => { |
| | | export const isIntersection = coordinates => { |
| | | const polyDikuai = turf.polygon([coordinates]) |
| | | const result = turf.kinks(polyDikuai) |
| | | const resultFeatures = result.features |