Skip to content

Instantly share code, notes, and snippets.

@jpsilvashy
Created May 2, 2025 04:08
Show Gist options
  • Save jpsilvashy/308b9dd3d8641645282b4d86e90a2db5 to your computer and use it in GitHub Desktop.
Save jpsilvashy/308b9dd3d8641645282b4d86e90a2db5 to your computer and use it in GitHub Desktop.
Examples using RAAD's FAA Gems
client = Raad::Adip::Client.new(
client_id: ENV['FAA_CLIENT_ID'],
client_secret: ENV['FAA_CLIENT_SECRET']
)
# Define mission location
mission_lat = 37.7749
mission_lng = -122.4194
# 1. Check airspace classification
airspace = client.airspace.classify(
latitude: mission_lat,
longitude: mission_lng
)
if ["B", "C", "D"].include?(airspace.body[:data][:airspace_class])
puts "ALERT: Mission is in Class #{airspace.body[:data][:airspace_class]} airspace!"
puts "LAANC authorization required through DroneZone or a LAANC provider."
puts "Controlling facility: #{airspace.body[:data][:controlling_facility]}"
else
puts "Mission is in Class #{airspace.body[:data][:airspace_class] || 'G'} airspace."
end
# 2. Check for nearby airports
airports = client.airports.search(
latitude: mission_lat,
longitude: mission_lng,
radius: 25
)
puts "\nNearby Airports:"
airports.body[:data].each do |airport|
distance = airport[:distance]
puts "- #{airport[:name]} (#{airport[:id]}) - #{distance.round(1)} NM away"
if distance < 5
puts " ALERT: Within 5NM of airport! Special authorization required."
end
end
# 3. Check for airspace restrictions
restrictions = client.airspace.restrictions(
latitude: mission_lat,
longitude: mission_lng,
radius: 25
)
puts "\nAirspace Restrictions:"
if restrictions.body[:data].empty?
puts "No active restrictions found."
else
restrictions.body[:data].each do |restriction|
puts "- #{restriction[:name]} (#{restriction[:restriction_type]})"
puts " Description: #{restriction[:description]}"
puts " Effective: #{restriction[:effective_start]} to #{restriction[:effective_end]}"
end
end
# 4. Calculate flight risk score based on airspace complexity
airports_count = airports.body[:data].size
has_close_airport = airports.body[:data].any? { |a| a[:distance] < 5 }
has_restrictions = !restrictions.body[:data].empty?
controlled_airspace = ["B", "C", "D"].include?(airspace.body[:data][:airspace_class])
risk_score = 0
risk_score += 30 if controlled_airspace
risk_score += 20 if has_close_airport
risk_score += 15 if has_restrictions
risk_score += [0, 5, 10, 15, 20].at([0, 1, 2, 3, 4, 5].count { |n| airports_count >= n * 5 })
puts "\nFlight Risk Assessment:"
puts "Risk Score: #{risk_score}/100"
case risk_score
when 0..20
puts "LOW RISK - Standard precautions apply."
when 21..50
puts "MEDIUM RISK - Enhanced vigilance recommended."
when 51..70
puts "HIGH RISK - Additional mitigations required."
else
puts "EXTREME RISK - Consider alternative location or time."
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment