Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import codecs
- import csv
- import datetime
- import math
- import shutil
- import os
- # GTFS utils to preprocess datas
- # call to create transfers : python -c 'import gtfs; print gtfs.create_transfer("path/to/gtfs/")'
- # this can take a long time to run
- def transfer_creator(dossier, go_create=False):
- if os.path.isfile(dossier+'transfer.txt'):
- if not go_create: reports=report_log("transfers.txt already exists! We let it as is.")
- else:
- reports=report_log("transfers.txt already exists, but we will rewrite it.")
- shutil.move(dossier+'transfers.txt',dossier+'transfers.txt.bak')
- else:
- reports=report_log("transfers.txt is missing, we will create one")
- go_create=True
- if go_create:
- reports+=create_transfer(dossier)
- return reports
- # call to create stop_areas : python -c 'import gtfs; print gtfs.default_merging("path/to/gtfs/")'
- def default_merging(dossier):
- reports,nouv_fichier=createSA(dossier+'stops.txt',250)
- shutil.move(nouv_fichier,dossier+'stops.txt')
- reports+=report_log("### merging stop point within 250m to create stop areas OK ###")
- return reports
- def report_log(chaine):
- chaine=str(chaine.encode('utf-8'))
- date=str(renvoi_date())
- heure=str(renvoi_heure())
- log_report=date+' '+heure+' : '+chaine+'\n'
- logprint(log_report)
- return log_report
- def logprint(chaine, fichier='./data_script_log.txt'):
- chaine=str(chaine)
- file= open(fichier,'a')
- date=renvoi_date()
- heure=renvoi_heure()
- print(date+' '+heure+' : '+chaine)
- file.write(date+' '+heure+' : '+chaine+'\n')
- def renvoi_date(decalage=0):
- date=datetime.datetime.now().strftime("%Y%m%d")
- return date
- def renvoi_heure(decalage=0):
- date=datetime.datetime.now().strftime("%X")
- return date
- def cellneedprotection(cell, separateurcsv):
- rep=False
- list_of_protection=[separateurcsv,"'"]
- cell=str(cell)
- for letter in cell:
- for value in list_of_protection:
- if letter == value:
- rep=True
- return rep
- def trouverposition(chaine, liste):
- count=0
- rep=999
- for valeur in liste:
- valeur_bom=valeur.replace('"','')
- valeur_bom=valeur_bom[1:]
- if valeur == chaine or valeur_bom == chaine:
- rep=count
- count+=1
- return rep
- def distance_wgs84(lat1, lon1, lat2, lon2):
- R=6371
- if lat1==lat2 and lon1==lon2:
- dist1=0
- else:
- dist1=R*math.acos(math.cos(math.radians(lat1))*math.cos(math.radians(lat2))*math.cos(math.radians(lon2)-math.radians(lon1))+math.sin(math.radians(lat1))*math.sin(math.radians(lat2)))
- return (dist1*1000)
- def csv_list_to_raw_str(list, separateurcsv=','):
- result = ""
- lb_first = True
- for cell in list :
- if cell:
- cell=cell.replace('"','""')
- if not lb_first:
- result += separateurcsv
- lb_first = False
- if cellneedprotection(cell, separateurcsv):
- result += '"'+str(cell)+'"'
- else:
- result += str(cell)
- return result + "\n"
- def createSA(fichier_stops, verif_geo=0, separateurcsv=','):
- reports=''
- code_to_change = []
- file = codecs.open(fichier_stops, 'r', 'utf-8')
- output = codecs.open(fichier_stops+"_new.txt", 'w', 'utf-8')
- reader = csv.reader(file, delimiter=separateurcsv, quoting=csv.QUOTE_MINIMAL)
- stop_area=[]
- count=0
- nb_sa=0
- create_parent_station=False
- create_location_type=False
- for row in reader:
- if count==0:
- last_colum=len(row)-1
- stop_id_pos=trouverposition('stop_id',row)
- stop_name_pos=trouverposition('stop_name',row)
- parent_station_pos=trouverposition('parent_station',row)
- if parent_station_pos==999:
- last_colum=last_colum+1
- parent_station_pos=last_colum
- row.append('parent_station')
- create_parent_station=True
- location_type_pos=trouverposition('location_type',row)
- if location_type_pos==999:
- last_colum=last_colum+1
- location_type_pos=last_colum
- row.append('location_type')
- create_location_type=True
- lat_pos=trouverposition('stop_lat',row)
- lon_pos=trouverposition('stop_lon',row)
- temp=csv_list_to_raw_str(row)
- output.write(temp)
- else:
- if len(row) > 1:
- if create_parent_station: row.append('')
- if create_location_type: row.append('')
- name=row[stop_name_pos]
- if row[lat_pos]:
- lat1=float(row[lat_pos])
- else:
- lat1=0
- if row[lon_pos]:
- lon1=float(row[lon_pos])
- else:
- lon1=0
- ispresent=False
- ### is it a stoppoint?
- if row[location_type_pos]=='':
- row[location_type_pos]='0'
- if row[location_type_pos]=='0':
- if not row[parent_station_pos]:
- code='CTP'+row[stop_id_pos]
- for sa_name in stop_area:
- if sa_name[0]==name:
- lat2=float(sa_name[2])
- lon2=float(sa_name[3])
- #print(str(lat1)+' - '+str(lon1)+' - '+str(lat2)+' - '+str(lon2))
- if verif_geo and distance_wgs84(lat1, lon1, lat2, lon2)<verif_geo:
- #if sa_name[2:3] proche de lon/lat:
- reports+=report_log('merge '+sa_name[0]+' -- '+name)
- ispresent=True
- code=sa_name[1]
- row[parent_station_pos]=code
- temp=csv_list_to_raw_str(row)
- output.write(temp)
- if not ispresent:
- stop_area.append((name,code,lat1,lon1))
- nb_sa+=1
- rowsa=row
- rowsa[stop_id_pos]=code
- rowsa[location_type_pos]='1'
- rowsa[parent_station_pos]=''
- temp=csv_list_to_raw_str(rowsa)
- output.write(temp)
- else:
- temp=csv_list_to_raw_str(row)
- output.write(temp)
- else:
- ## is it a stoparea!
- code=row[stop_id_pos]
- for sa_name in stop_area:
- if sa_name[0]==name:
- lat2=float(sa_name[2])
- lon2=float(sa_name[3])
- #print(str(lat1)+' - '+str(lon1)+' - '+str(lat2)+' - '+str(lon2))
- if verif_geo and distance_wgs84(lat1, lon1, lat2, lon2)<verif_geo:
- #if sa_name[2:3] proche de lon/lat:
- reports+=report_log('merge '+sa_name[0]+' -- '+name)
- code_to_change.append((row[stop_id_pos], sa_name[1]))
- ispresent=True
- code=sa_name[1]
- if not ispresent:
- stop_area.append((name,code,lat1,lon1))
- temp=csv_list_to_raw_str(row)
- output.write(temp)
- count+=1
- output.close()
- ## modifiy with code to change:
- if len(code_to_change):
- count=0
- file = codecs.open(fichier_stops+"_new.txt", 'r', 'utf-8')
- output = codecs.open(fichier_stops+"_new2.txt", 'w', 'utf-8')
- reader = csv.reader(file, delimiter=separateurcsv, quoting=csv.QUOTE_MINIMAL)
- for row in reader:
- if count==0:
- parent_station_pos=trouverposition('parent_station',row)
- temp=csv_list_to_raw_str(row)
- output.write(temp)
- else:
- for code_change in code_to_change:
- if row[parent_station_pos] == code_change[0]:
- row[parent_station_pos]=code_change[1]
- temp=csv_list_to_raw_str(row)
- output.write(temp)
- count+=1
- output.close()
- shutil.move(fichier_stops+"_new2.txt",fichier_stops+"_new.txt")
- reports+=report_log('Stop_Area create : '+str(nb_sa))
- reports+=report_log('count Stop_point : '+str(count))
- return reports, fichier_stops+"_new.txt"
- def create_transfer(dossier, separateurcsv=','):
- dist_max=300
- vitesse=1.12
- wait_time=60
- nb_transfer=0
- nb_SA=0
- reports=''
- file = codecs.open(dossier+'stops.txt', 'r', 'utf-8')
- output = codecs.open(dossier+'transfers.txt', 'w', 'utf-8')
- reader = csv.reader(file, delimiter=separateurcsv, quoting=csv.QUOTE_MINIMAL)
- count=0
- SA_list=[]
- ### list of the SA not null
- for row in reader:
- if count==0:
- stop_id_pos=trouverposition('stop_id',row)
- name_pos=trouverposition('stop_name',row)
- location_type_pos=trouverposition('location_type',row)
- lat_pos=trouverposition('stop_lat',row)
- lon_pos=trouverposition('stop_lon',row)
- else:
- if len(row) > 1:
- if location_type_pos == 999 or row[location_type_pos]=='0':
- if row[lat_pos]:
- lat1=float(row[lat_pos])
- if row[lon_pos]:
- lon1=float(row[lon_pos])
- code=row[stop_id_pos]
- name=row[name_pos]
- SA_list.append((code,lat1,lon1,name))
- count+=1
- ### search for each stops, who is at xxx m (dist_max) around
- temp=csv_list_to_raw_str(['from_stop_id','to_stop_id','transfer_type','min_transfer_time'])
- output.write(temp)
- for Stop_area1 in SA_list:
- temp=csv_list_to_raw_str([Stop_area1[0],Stop_area1[0],'2',str(wait_time)])
- output.write(temp)
- reports+=report_log('transfer write from ['+str(Stop_area1[3])+ '] to ['+str(Stop_area1[3])+'] ('+str(wait_time)+'s)')
- nb_SA+=1
- for Stop_area2 in SA_list:
- if Stop_area1!=Stop_area2:
- distance=distance_wgs84(Stop_area1[1], Stop_area1[2], Stop_area2[1], Stop_area2[2])
- if distance<dist_max:
- nb_transfer+=1
- time_transfer=int(1.4142*distance*vitesse)
- temp=csv_list_to_raw_str([Stop_area1[0],Stop_area2[0],'2',str(time_transfer)])
- output.write(temp)
- reports+=report_log('transfer write from ['+str(Stop_area1[3])+ '] to ['+str(Stop_area2[3])+'] ('+str(time_transfer)+'s)')
- reports+=report_log('transfer create : '+str(nb_transfer)+ '(+'+str(nb_SA)+')')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement