泉州自助建站,网页设计与制作介绍,工业设计专业介绍,培训机构优化目录 想要实现的效果实现过程踩坑安装依赖引入页面 想要实现的效果
示例地址 实现过程
踩坑 示例是通过script引入的依赖#xff0c;但本人需要在react项目中实现该效果。按照react-globe.gl官方方法引入总是报错 Cant import the named export AmbientLight from non EcmaS… 目录 想要实现的效果实现过程踩坑安装依赖引入页面 想要实现的效果
示例地址 实现过程
踩坑 示例是通过script引入的依赖但本人需要在react项目中实现该效果。按照react-globe.gl官方方法引入总是报错 Cant import the named export AmbientLight from non EcmaScript module (only default export is available)。原因是通过import Globe from react-globe.gl;引入的是.mjs文件react-globe.gl.mjs。尝试各种方法都失败最终通过改为引入.js文件import Globe from ../../node_modules/react-globe.gl/dist/react-globe.gl.min;成功。 安装依赖
package.json版本 react-globe.gl: ^2.27.0,satellite.js: ^5.0.0,three: ^0.157.0,three-globe: ^2.30.0,web-vitals: ^2.1.4引入页面
import React, { Component, useState, useEffect, useRef, useMemo } from react;
import Globe from ../../node_modules/react-globe.gl/dist/react-globe.gl.min;
import * as THREE from three;
import * as satellite from satellite.js;function World() {const w window.screen.width * 0.5;const h (window.screen.height - 80) * 0.7;const EARTH_RADIUS_KM 6371; // kmconst SAT_SIZE 80; // kmconst TIME_STEP 3 * 1000; // per frameconst globeEl useRef();const [satData, setSatData] useState();const [globeRadius, setGlobeRadius] useState();const [time, setTime] useState(new Date());useEffect(() {// time ticker(function frameTicker() {requestAnimationFrame(frameTicker);setTime((time) new Date(time TIME_STEP));})();}, []);useEffect(() {// load satellite datafetch(//unpkg.com/globe.gl/example/datasets/space-track-leo.txt).then((r) r.text()).then((rawData) {const tleData rawData.replace(/\r/g, ).split(/\n(?[^12])/).filter((d) d).map((tle) tle.split(\n));const satData tleData.map(([name, ...tle]) ({satrec: satellite.twoline2satrec(...tle),name: name.trim().replace(/^0 /, ),}))// exclude those that cant be propagated.filter((d) !!satellite.propagate(d.satrec, new Date()).position).slice(0, 1500);setSatData(satData);});}, []);const objectsData useMemo(() {if (!satData) return [];// Update satellite positionsconst gmst satellite.gstime(time);return satData.map((d) {const eci satellite.propagate(d.satrec, time);if (eci.position) {const gdPos satellite.eciToGeodetic(eci.position, gmst);const lat satellite.radiansToDegrees(gdPos.latitude);const lng satellite.radiansToDegrees(gdPos.longitude);const alt gdPos.height / EARTH_RADIUS_KM;return { ...d, lat, lng, alt };}return d;});}, [satData, time]);const satObject useMemo(() {if (!globeRadius) return undefined;const satGeometry new THREE.OctahedronGeometry((SAT_SIZE * globeRadius) / EARTH_RADIUS_KM / 2,0);const satMaterial new THREE.MeshLambertMaterial({color: palegreen,transparent: true,opacity: 0.7,});return new THREE.Mesh(satGeometry, satMaterial);}, [globeRadius]);useEffect(() {setGlobeRadius(globeEl.current.getGlobeRadius());globeEl.current.pointOfView({ altitude: 3.5 });}, []);return (div idglobeViz classNamemap_bgGlobewidth{w}height{h}backgroundColorrgba(0,0,0,0)ref{globeEl}globeImageUrl//unpkg.com/three-globe/example/img/earth-blue-marble.jpgobjectsData{objectsData}objectLabelnameobjectLatlatobjectLnglngobjectAltitudealtobjectFacesSurface{false}objectThreeObject{satObject}//div);
}class App extends Component {...render() {return (...World /...)}
}export default App;