Created
October 6, 2022 22:08
-
-
Save ammarkarachi/69c9c7759a855dbf4970e0b3c2cc61cb to your computer and use it in GitHub Desktop.
Python code to generate random drone paths for testing purposes of drone viewer application
This file contains 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
from math import radians, sin, asin, cos, sqrt, floor, pi | |
import random | |
import datetime | |
import uuid | |
import csv | |
# bounding box | |
p1 = [25.837377,-106.645646] # upper left corner | |
p2 = [36.500704,-93.508292] # lower right corner | |
# number of flights | |
number_of_flights = 10 | |
# number of years | |
end_year = 2021 | |
# file path and name | |
file_name = './test-data.csv' | |
def distance(lat1, lat2, lon1, lon2): | |
lon1 = radians(lon1) | |
lon2 = radians(lon2) | |
lat1 = radians(lat1) | |
lat2 = radians(lat2) | |
# Haversine formula | |
dlon = lon2 - lon1 | |
dlat = lat2 - lat1 | |
a = sin(dlat / 2)**2 + cos(lat1) * cos(lat2) * sin(dlon / 2)**2 | |
c = 2 * asin(sqrt(a)) | |
r = 3956 # earth circumference in miles | |
return(c * r) | |
def random_date(start, end): | |
""" | |
This function will return a random datetime between two datetime | |
objects. | |
""" | |
delta = end - start | |
int_delta = (delta.days * 24 * 60 * 60) + delta.seconds | |
random_second = random.randrange(int_delta) | |
return start + datetime.timedelta(seconds=random_second) | |
def new_lat_long(dx, dy, lon, lat): | |
new_lat = lat + (dy / 3956) * (180 / pi) | |
new_lon = lon + (dx / 3956) * (180 / pi) * cos(lat * pi / 180) | |
return [new_lat, new_lon] | |
# lat lon | |
l1_dist = distance(p2[0], p1[0], p2[1], p2[1]) | |
l1 = floor(l1_dist) | |
l2_dist = distance(p2[0], p2[0], p2[1], p1[1]) | |
l2 = floor(l2_dist) | |
print(l1) | |
print(l2) | |
# average distance covered in 30 seconds assuming speed of 50 mph | |
dist = (50/60)/2 | |
random.seed() | |
drone_names = ['Nova', 'V-BAT', 'Intrepid', 'Sky Scanner', 'Wind Razer', 'Wind Scribe'] | |
generation = 26 | |
header = ['Name', 'Generation', 'FlightIdenitifier', 'DroneIdentifier', 'Latitude', 'Longitude', 'Timestamp', 'Checksum'] | |
rows = [] | |
for count in range(number_of_flights): | |
result = [] | |
start_point = [ | |
random.randrange(1, l2, 1), | |
random.randrange(1, l1, 1) | |
] | |
result.append(start_point) | |
duration = random.randrange(0, 59, 1) | |
for j in range(duration): | |
angle = random.randrange(-90, 90) | |
addx = sin(radians(angle)) * dist | |
addy = sin(radians(90 - angle)) * dist | |
start_point = [ start_point[0] + addx , start_point[1] + addy] | |
result.append(start_point) | |
lat_lon_result = [ new_lat_long(point[0], point[1], p1[1], p1[0]) for point in result ] | |
end_date = datetime.datetime(end_year, 12, 31, 23, 59, 59) | |
start_date = datetime.datetime(year=end_date.year, month=1, day=1, hour=1, microsecond=0, minute=0) | |
start_ts = random.uniform(start_date.timestamp(), end_date.timestamp()) | |
name = drone_names[random.randint(0, len(drone_names) - 1)] | |
gen = random.randint(1, generation) | |
flight_id = str(uuid.uuid4()) | |
rows.extend([ [name, gen, flight_id, f'{name}-{gen}', lat_lon[0], lat_lon[1], start_ts + idx*15, ] for idx, lat_lon in enumerate(lat_lon_result) ]) | |
with open(file_name, 'w', encoding='UTF8') as f: | |
csv_writer = csv.writer(f) | |
csv_writer.writerow(header) | |
csv_writer.writerows(rows) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment