pragmanauts/naut.py
2022-09-25 15:25:30 +02:00

185 lines
4.4 KiB
Python
Executable File

#! /usr/bin/python
from math import radians, cos, sin, asin, sqrt
import numpy as np
import subprocess
import sys
import time
import json
from time import strftime
import random
import os
import argparse
# haversine function to determine distance between two lat,long points
def haversine(lat1, lon1, lat2, lon2):
R = 3959.87433 # earth radius in miles
dLat = radians(lat2 - lat1)
dLon = radians(lon2 - lon1)
a = sin(dLat / 2) ** 2 + cos(lat1) * cos(lat2) * sin(dLon / 2) ** 2
c = 2 * asin(sqrt(a))
return R * c
# get a random enough number
def getfloat():
output = random.random()
return output
def str_time_prop(start, end, format, prop):
# get a time at a proportion of a range of two formatted times
stime = start
etime = end
ptime = stime + prop * (etime - stime)
return time.strftime(format, time.localtime(ptime))
# get random time in the future
def random_date(start, end, prop):
return str_time_prop(start, end, "%m/%d/%Y %I:%M%p", prop)
# function to generate a lat,long coordinate within a range
# inspiration from this post:
# https://gis.stackexchange.com/questions/25877/generating-random-locations-nearby
def create_random_point(x0, y0, distance):
# approximately 1609 meters in a mile
# 5 miles = about 8045
# 111300 = meters in a degree
# 69 = miles in a degree
r = distance / 111300
r = r / 2
u = float(getfloat())
v = float(getfloat())
w = r * np.sqrt(u)
t = 2 * np.pi * v
x = w * np.cos(t)
x1 = x / np.cos(y0)
y = w * np.sin(t)
return (x0 + x1, y0 + y)
def spooky_print(message):
for character in message:
print(character, end="", flush=True)
time.sleep(0.3)
print("\n")
def white_rabbit(future_time, latitude, longitude):
# homage to the Matrix
init1_msg = "Wake up, Neo..."
init_msg = "The Matrix has you..."
rabbit_msg1 = "follow the"
rabbit_msg2 = "white rabbit..."
os.system("clear")
spooky_print(init1_msg)
time.sleep(5)
os.system("clear")
spooky_print(init_msg)
time.sleep(5)
os.system("clear")
spooky_print(rabbit_msg1)
spooky_print(" " + rabbit_msg2)
time.sleep(5)
os.system("clear")
spooky_print(" " + future_time)
spooky_print(" " + latitude)
spooky_print(" " + longitude)
init_start = time.time()
dtime = strftime("%m-%d-%Y %H:%M:%S")
newplot = ()
##### User defined variables #####
loghandle = "./naut.log"
logfile = open(loghandle, "a")
parser = argparse.ArgumentParser()
parser.add_argument("-x", "--matrix", action="store_true", help="toggle the matrix")
parser.add_argument(
"-c",
"--coordinates",
nargs=2,
action="append",
help="enter lat and long for home base, defaults to 52.229832 21.011734",
)
parser.add_argument(
"-t", "--window", type=int, help="set the time window in minutes, defaults to 30"
)
parser.add_argument(
"-m",
"--distance",
type=int,
help="set the radius from home base in meters, defaults to 4827",
)
args = parser.parse_args()
# home_base (starting point), set to Warsaw center.
if args.coordinates:
latitude1, longitude1 = float(args.coordinates[0][0]), float(args.coordinates[0][1])
else:
latitude1, longitude1 = 52.229832, 21.011734
if args.window:
window_secs = args.window * 60
else:
window_secs = 1800
# how far to travel in meters from home base
if args.distance:
meters_out = args.distance
else:
meters_out = 4827
##### End User Defined variables #####
current_time = time.time()
window = current_time + window_secs
timex = float(getfloat())
x, y = create_random_point(latitude1, longitude1, meters_out)
future_time = random_date(current_time, window, timex)
dest_lat = str(format(x, ".5f"))
dest_long = str(format(y, ".5f"))
orig_lat = str(latitude1)
orig_long = str(longitude1)
newplot = (x, y)
origplot = (latitude1, longitude1)
dist = haversine(origplot[0], origplot[1], newplot[0], newplot[1])
dist = str(format(dist, ".2f"))
logfile.write(
dtime
+ " homebase_lat="
+ orig_lat
+ " homebase_long="
+ orig_long
+ " dest_lat="
+ dest_lat
+ " dest_long="
+ dest_long
+ " future_time="
+ future_time
+ " dist="
+ dist
)
logfile.write("\n")
if args.matrix:
white_rabbit(future_time, dest_lat, dest_long)
print(
"https://www.google.com/maps/search/?api=1&query="
+ dest_lat
+ ","
+ dest_long
+ " Time: "
+ future_time
)