Complete Data Flow
Satellite (orbit) → UHF/S-band (~10 min contact) → Ground Station (dish + SDR) → Fiber/Internet → Processing Server (AWS) → REST API → Mobile/Web App (LTE)
① Satellite collects data in orbit
② Ground station receives signal during pass
③ Processing server decodes & runs ML
④ API delivers to users via LTE
Satellite
1.3kg CubeSat
15W power · Payload sensor · 9.6 kbps-2 Mbps
Ground Station
1-3m dish antenna
SDR receiver · Linux server · $50K-$100K
Cloud Processing
AWS/Azure
Data pipeline · Geospatial processing · ML models
Data Processing Pipeline
# AWS Lambda: Process satellite data on arrival
import boto3, rasterio, numpy as np
def lambda_handler(event, context):
# 1. Receive raw image from ground station
bucket = event['bucket']; key = event['key']
# 2. Download & decompress
response = s3.get_object(Bucket=bucket, Key=key)
image_data = response['Body'].read()
# 3. Georeference (map pixels to lat/lon)
with rasterio.open(image_data) as src:
data = src.read(); bounds = src.bounds
# 4. Run ML: detect deforestation
deforestation = detect_forest_loss(data)
# 5. Generate products (GeoTIFF, PNG tiles, GeoJSON)
# 6. Update searchable database
db.put_item(TableName='SatelliteProducts', Item={
'timestamp': now(), 'product_type': 'deforestation',
'location': str(bounds), 'alert_level': alert
})
return {'statusCode': 200, 'body': 'Data processed'}
1
Ingest
Ground station sends raw data to S3
2
Decompress
Unzip, validate checksums
3
Georeference
Map pixels to Earth coordinates
4
ML Models
Detect forests, crops, anomalies
5
Generate Products
Tiles, GeoJSON, metadata
6
Index
Store in searchable database
REST API & LTE Integration
# FastAPI: Serve satellite data over HTTP/LTE
from fastapi import FastAPI, Query
app = FastAPI()
@app.get("/api/v1/satellite/imagery")
async def get_imagery(lat: float, lon: float, product: str = "deforestation"):
"""
curl "https://api.example.com/api/v1/imagery?lat=40.7&lon=-74.0"
Returns GeoJSON + imagery tiles
"""
products = db.query_spatial(bbox=(lat-0.1, lon-0.1, lat+0.1, lon+0.1))
return {"type": "FeatureCollection", "features": [...]}
# WebSocket: Real-time alerts to mobile app
@app.websocket("/ws/alerts")
async def websocket_alerts(websocket):
await websocket.accept()
async for msg in db.stream_alerts(product="deforestation"):
await websocket.send_json({
"type": "alert", "severity": msg.alert_level,
"location": msg.location, "area_km2": msg.area
})
GET /imagery
Query satellite data by location/time
WS /alerts
Real-time notifications (LTE push)
GET /timeseries
Historical trends (carbon, forest area)
GET /tiles/{z}/{x}/{y}
Map tiles for web/mobile UI