Mercurial Hosting > traffic-intelligence
changeset 763:277e9cdcedce dev
added demo script for monresovelo
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Sun, 29 Nov 2015 00:22:58 -0500 |
parents | d6f0e0cab07d |
children | bcb05a20af19 |
files | scripts/visualize-monresovelo.py |
diffstat | 1 files changed, 129 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/visualize-monresovelo.py Sun Nov 29 00:22:58 2015 -0500 @@ -0,0 +1,129 @@ +# -*- coding: utf-8 -*- +import simplejson, sys, datetime +import moving, utils +from pyproj import Proj + +import matplotlib.pyplot as plt +import matplotlib.mlab as pylab +import numpy as np +import pandas as pd + +#notes = [f['properties']['notes'] for f in data['features'] if len(f['properties']['notes']) > 0] + +english2French = {'Commute': 'Domicile-travail', + 'Errand': 'Courses', + 'Exercise': 'Sport', + 'Leisure': 'Loisirs', + 'Other': 'Autre', + 'Autres': 'Autre', + 'Autres motifs': 'Autre', + 'School': u'École', + 'Shopping': 'Magasinage', + 'Work-Related': 'Travail', + 'Work-related': 'Travail', + 'Other': 'Autre', + 'other': 'Autre'} + +odMotifs = ['Magasinage', 'Retour au domicile', "Chercher quelqu'un", + 'Travail ', '\xc9tude / \xc9cole', 'Autre', 'Loisir', + "Visites d'ami(e)s et/ou de la parent\xe9", "Reconduire quelqu'un", + "Rendez-vous d'affaires", 'Sant\xe9', + 'Ind\xe9termin\xe9 / refus / NSP'] + +def convertJsonToMTM(data = None, filename = None): + 'Converts the in put json data to MTM and optionally saves to file' + proj = Proj(init="epsg:2950") + if data is None: + data = simplejson.load(open(filename)) + for i in xrange(len(data['features'])): + latlon = data['features'][i]['geometry']['coordinates'] + mtm = [proj(p[0], p[1]) for p in latlon] + data['features'][i]['geometry']['coordinates'] = mtm + if filename is not None: + simplejson.dump(data, open(utils.removeExtension(filename)+'-mtm.json', 'w')) + return data + +def convertToObjects(data, timeStep = 1, project = True, minLength = 10): + 'Converts the trips to the moving.MovingObject class from Traffic Intelligence' + if project: + proj = Proj(init="epsg:2950") + objects = [] + nTrips = len(data['features']) + for i in xrange(nTrips): + latlon = data['features'][i]['geometry']['coordinates'] + if project: + projectedX = [proj(p[0], p[1]) for p in latlon[::timeStep]] + else: + projectedX = latlon[::timeStep] + o = moving.MovingObject(num = i, positions = moving.Trajectory(np.array(projectedX).T.tolist())) + o.properties = data['features'][i]['properties'] + o.motif = english2French.get(o.properties['purpose'], o.properties['purpose']) + try: + o.start = datetime.datetime.strptime(o.properties['start'], '%Y-%m-%d %H:%M:%S') + o.stop = datetime.datetime.strptime(o.properties['stop'], '%Y-%m-%d %H:%M:%S') + if o.positions.length() > minLength: + objects.append(o) + except TypeError: + print('{} {}'.format(o.properties['start'], o.properties['stop'])) + print('issue with {}'.format(o.properties)) + #o.start = datetime.datetime(1979, 7, 21) + #o.stop = o.start + #print(e) + return objects + +filename = './trip5000.json' +data = simplejson.load(open(filename)) +# od = pd.read_csv('/home/nicolas/tmp/defivelomtl/velo-od-2013/od13niv2 - Résident MTL avec vélo.csv', delimiter = ';') + +#convertJsonToMTM(data) +#objects = convertToObjects(data, project = False, minLength = 10) +objects = convertToObjects(data, minLength = 10) +colors = utils.PlottingPropertyValues('rk') + +def printMRV(objects, motifs, color, linewidth, alpha, blackBG = False): + fig = plt.figure() + for o in objects: + if o.motif in motifs: + o.plot(color, linewidth = linewidth, alpha = alpha) + plt.axis('equal') + plt.axis('off') + plt.tight_layout() + if blackBG: + fig.patch.set_facecolor('black') + plt.savefig(u'mrv-'+u'-'.join(motifs).replace(' ', '-')+'-'+color+'-blackbg.png', dpi = 300, facecolor=fig.get_facecolor(), edgecolor='none') + else: + plt.savefig(u'mrv-'+u'-'.join(motifs).replace(' ', '-')+'-'+color+u'.png', dpi = 300) + +for i, m in enumerate(allmotifs): + printMRV(objects, [m], colors[i], 0.5, 0.1) + +printMRV(objects, ['Aller au travail', 'Domicile-travail'], 'k', 0.5, 0.1) +printMRV(objects, ['Travail', u'D\xe9placement professionnel'], 'k', 0.5, 0.1) +printMRV(objects, ['Aller au travail', 'Domicile-travail', 'Travail', u'D\xe9placement professionnel'], 'k', 0.5, 0.1) + +# generate an enriched json with added data +generateJSON = False +if generateJSON: + for o in objects: + o.positions.computeCumulativeDistances() + +#properties = {'length': [], +# 'wiggliness': []} + + removeBothEnds = 2 + # export mean speed, nseconds, wiggliness, speeds, accel + for o in objects: + #print o.positions.length(), (o.stop-o.start).seconds, (o.stop-o.start).seconds/float(o.positions.length()), o.positions.wiggliness() + #print o.positions.length(), o.properties['n_coord'], len(o.positions.differentiateSG(5,2,2)), len(o.positions.differentiateSG(5,2,1)) + speeds = o.positions.differentiateSG(5,2,1, removeBothEnds = removeBothEnds).norm().tolist() + accel = o.positions.differentiateSG(5,2,2, removeBothEnds = removeBothEnds).norm().tolist() + data['features'][o.getNum()]['properties']['speeds'] = [speeds[0]]*removeBothEnds+speeds+[speeds[-1]]*removeBothEnds + data['features'][o.getNum()]['properties']['accelerations'] = [accel[0]]*removeBothEnds+accel+[accel[-1]]*removeBothEnds + data['features'][o.getNum()]['properties']['n_points'] = o.positions.length() + data['features'][o.getNum()]['properties']['n_seconds'] = (o.stop-o.start).seconds + data['features'][o.getNum()]['properties']['mean_speed'] = o.positions.cumulativeDistances[-1]/data['features'][o.getNum()]['properties']['n_seconds'] + data['features'][o.getNum()]['properties']['wiggliness'] = o.positions.wiggliness() + + nums = [o.getNum() for o in objects] + data['features'] = [d for i, d in enumerate(data['features']) if i in nums] + simplejson.dump(data, open(utils.removeExtension(filename)+'-enriched.json', 'w'))