You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

98 lines
3.0 KiB

import datetime, json
import threading
import time
from itertools import zip_longest
import requests
from staticmap import StaticMap, CircleMarker
from colour import Color
green = Color("green")
colors = list(green.range_to(Color("red"),30))
def grouper(iterable, n, fillvalue=None):
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)
class Worker(threading.Thread):
def __init__(self, coord_batch, map, destination, backwards = False):
threading.Thread.__init__(self)
self.work_items = coord_batch
self.map = map
self.destination = destination
self.backwards = backwards
def run(self):
destinations = ""
for idx, tup in enumerate(self.work_items):
if tup is not None:
destinations += "&destination" + str(idx) + "=" + str(tup[1]) + "," + str(tup[0])
starts = ""
for idx, tup in enumerate(self.work_items):
if tup is not None:
starts += "&start" + str(idx) + "=" + str(tup[1]) + "," + str(tup[0])
urls = "https://matrix.route.api.here.com/routing/7.2/calculatematrix.json?app_id=EpknDhPDW5TutJYG7XAC&app_code=t9FZUznFGJviX-aPBM5PfA&departure=2018-12-21T01:00:00&mode=fastest;car;traffic:enabled&summaryAttributes=traveltime&start="
urls += str(self.destination[1]) + "," + str(self.destination[0])
urls += destinations
r = requests.get(urls)
jsons = json.loads(r.content)
for idx, tup in enumerate(self.work_items):
try:
timelen = jsons["response"]["matrixEntry"][idx]["summary"]["travelTime"]
except:
continue
col_val = int((timelen / 60))
if col_val >= 30:
marker = CircleMarker(tup, Color("blue").get_hex_l() + "70", 12)
else:
marker = CircleMarker(tup, colors[col_val].get_hex_l() + "70", 12)
self.map.add_marker(marker)
def entry():
m = StaticMap(3000, 3000, url_template='http://a.tile.osm.org/{z}/{x}/{y}.png')
destination_point = (-122.195211, 47.792218)
#destination_point = (-122.295310, 47.441328)
#destination_point = (-122.359465, 47.619038)
home_points = []
range_val = 185
for x in range(-range_val, range_val):
for y in range(-range_val, range_val):
#if (x > 148 or x < -148) or (y > 148 or y < -148):
x_point = destination_point[0] + 0.0012 * x
y_point = destination_point[1] + 0.0012 * y
home_points.append((x_point, y_point))
total = len(home_points)
worker_pool = []
for p in grouper(home_points, 100):
w = Worker(p, m, destination_point)
w.start()
worker_pool.append(w)
for w in worker_pool:
total -= 100
print("Total: {}".format(total))
w.join()
image = m.render(zoom=13)
image.save('maps.png')
entry()