A satellite visualizer application built with Next.js, TypeScript, and Cesium.js. View over 26,000 satellites in 3D space with orbital information.
- 🛰️ Satellite tracking visualization - View 26,000+ satellites using Two-Line Element (TLE) data
- 🌍 Interactive 3D globe - Powered by Cesium.js with realistic Earth terrain and buildings
- 📡 Multiple satellite constellations - Starlink, GPS, GLONASS, Galileo, Iridium, and more
- 🎯 Performance optimization - Configurable rendering modes for different device capabilities
- 📊 Detailed orbital data - Altitude, velocity, inclination, eccentricity, and orbital elements
- 🎨 Color-coded satellites - Visual classification by constellation and purpose
- 🔍 Interactive selection - Click satellites for detailed information panels
- ⚡ Server-side rendering - Optimized performance with Next.js 14
- Node.js 18+
- npm or yarn
- Cesium Ion Access Token (free at cesium.com)
-
Clone the repository
git clone [email protected]:NickMagidson/project-lynx2.git cd project-lynx2
-
Install dependencies
npm install
-
Set up environment variables
touch .env
Add your Cesium Ion access token:
NEXT_PUBLIC_CESIUM_TOKEN=your_cesium_token_here
-
Start the development server
npm run dev
| Constellation | Color | Description |
|---|---|---|
| Starlink | Cyan | SpaceX Internet Constellation |
| GPS/NAVSTAR | Lime | US Global Positioning System |
| GLONASS | Yellow | Russian Navigation System |
| Galileo | Purple | European Navigation System |
| BeiDou | Pink | Chinese Navigation System |
| Iridium | Light Blue | Communications Constellation |
| OneWeb | Light Green | Internet Constellation |
| Scientific | White | Research & Earth Observation |
| Military | Gray | Defense & Intelligence |
| Commercial | Gold | Commercial Communications |
- LEO (Low Earth Orbit) - Below 2,000 km altitude
- MEO (Medium Earth Orbit) - 2,000-35,786 km altitude
- GEO (Geostationary Orbit) - ~35,786 km altitude
- HEO (High Earth Orbit) - Above 35,800 km altitude
TLE (Two-Line Element) data consists of three lines:
- Satellite name
- Line 1: Contains satellite catalog number, epoch, and orbital decay information
- Line 2: Contains orbital elements like inclination, right ascension, eccentricity, etc.
Example:
ISS (ZARYA)
1 25544U 98067A 24188.50000000 .00016717 00000-0 10270-3 0 9992
2 25544 51.6392 339.0042 0001015 94.8340 265.2864 15.49309620 36106
- Next.js 14 - React framework with App Router
- TypeScript - Type-safe development
- Cesium.js - 3D geospatial visualization
- satellite.js - TLE data processing and orbital calculations
- Material-UI - Component library for UI elements
src/app/
├── Components/
│ ├── CesiumWrapper.tsx # Cesium loader and wrapper
│ ├── CesiumComponent.tsx # Main 3D visualization
│ ├── SatelliteInfoPanel.tsx # Detailed satellite information
│ └── AboutModal.tsx # Application information
├── config/
│ └── satelliteConfig.ts # Performance and visual settings
├── services/
│ └── satelliteService.ts # Satellite data fetching
├── utils/
│ ├── satelliteUtils.ts # Orbital calculations
│ ├── satelliteDescription.ts # Info panel generation
│ └── tleParser.ts # TLE data parsing
├── types/
│ └── position.ts # TypeScript definitions
└── main/
└── page.tsx # Main application page
- TLE Data Loading - Two-Line Element sets loaded from file or API
- Orbital Calculations - Real-time position calculation using satellite.js
- Coordinate Conversion - ECI to geodetic coordinate transformation
- 3D Rendering - Cesium.js renders satellites on interactive globe
- Performance Optimization - LOD scaling and distance-based rendering
Edit src/app/config/satelliteConfig.ts to adjust:
export const SATELLITE_CONFIG = {
// Maximum satellites to render
MAX_SATELLITES: 10000,
// Performance optimizations
PERFORMANCE: {
USE_LOD_SCALING: true, // Distance-based quality
HIDE_LABELS_BY_DEFAULT: true, // Show labels on selection only
USE_DISTANCE_SCALING: true, // Scale points by distance
},
// Visual settings
VISUAL: {
POINT_SIZE: 1, // Satellite point size
COLORS: { /* constellation colors */ }
}
};Change performance mode in src/app/main/page.tsx:
// Options: 'low', 'medium', 'high', 'ultra', 'extreme', 'unlimited'
const satellitePositions = await getSatellitePositions("high");- Cesium.js - 3D geospatial visualization platform
- satellite.js - SGP4/SDP4 orbital calculations
- Celestrak - TLE data source and orbital mechanics expertise
- Next.js Team - React framework development
- Hyun - For the insight on getting Cesium to work with Next.js
- TLE Data Format - Understanding orbital elements
- Cesium Documentation - 3D visualization guide