Created
May 2, 2025 04:08
-
-
Save jpsilvashy/308b9dd3d8641645282b4d86e90a2db5 to your computer and use it in GitHub Desktop.
Examples using RAAD's FAA Gems
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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