Changeset - 888ae1bb85d4
[Not reviewed]
default
0 2 1
Luca Allulli (luca) - 3 years ago 2017-11-17 14:45:50
luca@skeed.it
* Bugfix and data accuracy improvement (wip)
3 files changed with 115 insertions and 10 deletions:
0 comments (0 inline, 0 general)
paline/atac_website.py
Show inline comments
 
new file 100644
 
# coding: utf-8
 
# Written by Luca Allulli
 

	
 
import requests
 
from BeautifulSoup import BeautifulStoneSoup
 
from pprint import pprint
 
from collections import defaultdict
 

	
 
def get_viaggiaconatac(id_palina):
 
	r = requests.get("http://viaggiacon.atac.roma.it/asp/orariFermata.asp?impianto={}".format(id_palina))
 
	return r.text
 

	
 

	
 
def parse_viaggiaconatac(xml):
 
	soup = BeautifulStoneSoup(xml, fromEncoding='iso-8859-1')
 
	fermate = soup.findAll('fermata')
 
	out = defaultdict(list)
 
	for f in fermate:
 
		linea = f.linea.text
 
		msg = f.mesg.text.lower()
 
		if "arrivo" in msg:
 
			d = 0
 
		elif "capolinea" in msg:
 
			d = None
 
		else:
 
			d = int(msg[:msg.find(' ')])
 
		out[linea].append(d)
 
	return out
 

	
 

	
 

	
 

	
 
if __name__ == '__main__':
 
	o = parse_viaggiaconatac(get_viaggiaconatac("81915"))
 
	pprint(o)
paline/tpl.py
Show inline comments
...
 
@@ -47,6 +47,7 @@ from parcheggi import models as parchegg
 
import os, os.path
 
import settings
 
import tratto
 
import atac_website
 
from django import db
 
from django.db.models import Avg, Max, Min, Count, F
 
import os, os.path
...
 
@@ -198,11 +199,12 @@ class PosizioneVeicolo(object):
 
			tp = tratto_successivo
 

 
	@classmethod
 
	def from_fermata(cls, percorso, indice_fermata, dist_fermata, rev=False):
 
	def from_fermata(cls, percorso, indice_fermata, dist_fermata=None, rev=False):
 
		"""
 
		Inizializza una posizione veicolo a partire da numero e distanza della fermata
 

 
		indice_fermata: indice fermata non soppressa, a partire da 0
 
		dist_fermata: distanza dalla fermata; se None, posiziona nel punto medio
 
		Se rev, conta all'indietro dal capolinea di destinazione
 

 
		:return: Oggetto PosizioneVeicolo
...
 
@@ -211,6 +213,8 @@ class PosizioneVeicolo(object):
 
			n_tratto = percorso.map_fermate_tratti[indice_fermata]
 
			tp = percorso.tratti_percorso[n_tratto]
 
			dist = tp.rete_tratto_percorsi.dist
 
			if dist_fermata is None:
 
				dist_fermata = dist / 2
 
			while dist < dist_fermata:
 
				dist_fermata -= dist
 
				tp = tp.t.tratto_percorso_successivo
...
 
@@ -221,10 +225,13 @@ class PosizioneVeicolo(object):
 
			n_tratto = percorso.map_fermate_tratti[indice_fermata + 1]
 
			tp = percorso.tratti_percorso[n_tratto - 1]
 
			dist = tp.rete_tratto_percorsi.dist
 
			if dist_fermata is None:
 
				dist_fermata = dist / 2
 
			while dist < dist_fermata:
 
				dist_fermata -= dist
 
				tp = tp.t.tratto_percorso_precedente
 
			return PosizioneVeicolo(tp, tp.dist - dist_fermata)
 
				dist = tp.rete_tratto_percorsi.dist
 
			return PosizioneVeicolo(tp, dist - dist_fermata)
 

 
	def get_dettagli(self, coord=False):
 
		"""
...
 
@@ -272,7 +279,7 @@ class PosizioneVeicolo(object):
 
		"""
 
		Restituisce la differenza di posizione fra due posizioni del medesimo percorso, in metri
 
		"""
 
		assert self.tratto_percorso.percorso is other.tratto_percorso.percorso
 
		assert self.tratto_percorso.rete_percorso is other.tratto_percorso.rete_percorso
 
		dist_inizio_1 = self.tratto_percorso.s.distanza_da_partenza + self.distanza
 
		dist_inizio_2 = other.tratto_percorso.s.distanza_da_partenza + other.distanza
 
		return dist_inizio_1 - dist_inizio_2
...
 
@@ -519,7 +526,6 @@ class RetePercorso(object):
 
					tempo=tempo
 
				).save()
 

 

 
	def stampa_tempi(self):
 
		print " *** Tempi percorso %s (linea %s) ***" % (self.id_percorso, self.id_linea)
 
		i = 0
...
 
@@ -633,6 +639,16 @@ class RetePercorso(object):
 
			# 	for a in da_cancellare:
 
			# 		arrivi.remove(a)
 

 
	def elimina_tutti_veicoli(self):
 
		"""
 
		Elimina tutti i veicoli dal percorso
 

 
		:return:
 
		"""
 
		vs = self.veicoli.values()
 
		for v in vs:
 
			v.elimina_da_percorso()
 

 
	def stato(self):
 
		"""
 
		Restituisce informazioni sullo stato del percorso: fermate, tratti di percorso ecc.
...
 
@@ -1097,7 +1113,7 @@ class ReteFermata(object):
 
				secondi = 0
 
		if secondi > (10 + 4 * dist_fermate) * 60:
 
			secondi = -1
 
		percorso = veicolo.tratto_percorso.rete_percorso
 
		percorso = veicolo.posizione.tratto_percorso.rete_percorso
 
		self.arrivi.append({
 
			'tempo': secondi,
 
			'id_percorso': percorso.id_percorso,
...
 
@@ -1242,7 +1258,6 @@ class ReteVeicolo(object):
 
		# self.progressiva_atac = None
 
		# self.progressiva_ric = None
 

 

 
	def serializza_dinamico(self):
 
		v = self.posizione.get_dettagli(True)
 
		return {
...
 
@@ -1273,7 +1288,6 @@ class ReteVeicolo(object):
 
			sistema=settings.MERCURY_GIANO,
 
		).save()
 

 

 
	def deserializza_dinamico(self, rete, res):
 
		percorso = rete.tratti_percorso[res['tratto_percorso']].rete_percorso
 
		dist = res['distanza_capolinea']
...
 
@@ -1384,12 +1398,12 @@ class ReteVeicolo(object):
 
				a_fermata = None
 

 
	def elimina_da_percorso(self):
 
		if self.posizione.tratto_percorso is not None:
 
		if self.posizione is not None:
 
			old_percorso = self.posizione.tratto_percorso.rete_percorso
 
			self.reset_fermate()
 
			if self.id_veicolo in old_percorso.veicoli:
 
				del old_percorso.veicoli[self.id_veicolo]
 
			self.posizione.tratto_percorso = None
 
			self.posizione = None
 

 
	def propaga_su_fermate(self):
 
		tpo = self.posizione.tratto_percorso
...
 
@@ -2343,7 +2357,8 @@ class Rete(object):
 

 
	def get_veicoli_percorso(self, id_percorso):
 
		percorso = self.percorsi[id_percorso]
 
		percorso.aggiorna_posizione_veicoli()
 
		# percorso.aggiorna_posizione_veicoli()
 
		# test_viaggiaconatac(self, percorso)
 
		veicoli = []
 
		for id_veicolo in percorso.veicoli:
 
			v = percorso.veicoli[id_veicolo]
...
 
@@ -3924,6 +3939,56 @@ def log_percorso_cities(id_percorso, id_
 
		percorsi_cities[id_percorso][1] += 1
 

 

 
def viaggiaconatac_to_rete(rete, id_palina, arrivi):
 
	p = rete.paline[id_palina]
 
	# Associo ad ogni linea che fa capolinea ALLA SUCCESSIVA
 
	# il percorso con più veicoli
 
	# (e, in subordine, quello con il carteggio più semplice
 
	# -- da fare, serve accedere in modo efficiente al carteggio)
 
	percorsi_linea = {}
 
	for id_fermata in p.fermate:
 
		f = p.fermate[id_fermata]
 
		if f.tratto_percorso_successivo is not None and f.tratto_percorso_successivo.t.is_capolinea():
 
			pe = f.rete_percorso
 
			l = pe.id_linea
 
			if l in arrivi:
 
				if l in percorsi_linea:
 
					pe_old = percorsi_linea[l]
 
					vn = len(pe.veicoli)
 
					vn_old = len(pe_old.veicoli)
 
					if vn > vn_old:  # or (vn == vn_old and ...carteggio...)
 
						percorsi_linea[l] = pe
 
				else:
 
					percorsi_linea[l] = pe
 

 
	# Per ogni linea di cui si hanno risultati,
 
	# sostituisco i veicoli del percorso "principale"
 
	for l in percorsi_linea:
 
		pe = percorsi_linea[l]
 
		pe.elimina_tutti_veicoli()
 
		i = 0
 
		for dist in arrivi[l]:
 
			i += 1
 
			id_veicolo = "{}_{}".format(l, i)
 
			if dist is not None:
 
				posizione = PosizioneVeicolo.from_fermata(pe, dist, rev=True)
 
				rete.aggiorna_posizione_bus(id_veicolo, posizione, False)
 
			else:
 
				posizione = PosizioneVeicolo(pe.tratti_percorso[0], 0)
 
				rete.aggiorna_posizione_bus(id_veicolo, posizione, True)
 

 

 

 
def test_viaggiaconatac(rete, percorso):
 
	id_palina = percorso.tratti_percorso[-1].s.rete_palina.id_palina
 
	print "Arrivi palina {}".format(id_palina)
 
	xml = atac_website.get_viaggiaconatac(id_palina)
 
	arrivi = atac_website.parse_viaggiaconatac(xml)
 
	print "Test Viaggia con Atac"
 
	pprint(arrivi)
 
	viaggiaconatac_to_rete(rete, id_palina, arrivi)
 

 

 
def grafo2shape(g, path, filename):
 
	"""
 
	Esporta il grafo g come shapefile
paline/views.py
Show inline comments
...
 
@@ -381,11 +381,14 @@ def _orari(id_percorso, data=None, day_o
 
	ctx['note_no_orari'] = percorso.note_no_orari
 
	return ctx
 

 

 
def trovalinea_orari(request, token, id_percorso, data=None):
 
	return _orari(id_percorso, data, True)
 

 

 
TrovalineaOrariWS = paline7.metodo("Trovalinea.Orari")(trovalinea_orari)
 

 

 
def _percorso(request, id_percorso, ctx=None, id_veicolo=None, giorno_partenze=None, as_service=False):
 
	if ctx is None:
 
		ctx = {}
...
 
@@ -453,6 +456,7 @@ def _percorso(request, id_percorso, ctx=
 
	except Percorso.DoesNotExist:
 
		return TemplateResponse(request, 'messaggio.html', {'msg': _("Il percorso %s non esiste") % id_percorso})
 

 

 
def percorso(request, id_percorso, ctx=None):
 
	if ctx is None:
 
		ctx = {}
...
 
@@ -476,6 +480,7 @@ def percorso(request, id_percorso, ctx=N
 
		giorno = None
 
	return _percorso(request, id_percorso, ctx, id_veicolo, giorno)
 

 

 
def percorso_per_json(request, id_percorso, id_veicolo=None):
 
	giorni = []
 
	t = date.today()
0 comments (0 inline, 0 general)