#! /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 )