Advertisement
Guest User

Untitled

a guest
Jul 27th, 2016
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.81 KB | None | 0 0
  1. import codecs
  2. import csv
  3. import datetime
  4. import math
  5. import shutil
  6. import os
  7.  
  8. # GTFS utils to preprocess datas
  9.  
  10. # call to create transfers : python -c 'import gtfs; print gtfs.create_transfer("path/to/gtfs/")'
  11. # this can take a long time to run
  12. def transfer_creator(dossier, go_create=False):
  13. if os.path.isfile(dossier+'transfer.txt'):
  14. if not go_create: reports=report_log("transfers.txt already exists! We let it as is.")
  15. else:
  16. reports=report_log("transfers.txt already exists, but we will rewrite it.")
  17. shutil.move(dossier+'transfers.txt',dossier+'transfers.txt.bak')
  18. else:
  19. reports=report_log("transfers.txt is missing, we will create one")
  20. go_create=True
  21. if go_create:
  22. reports+=create_transfer(dossier)
  23. return reports
  24.  
  25.  
  26. # call to create stop_areas : python -c 'import gtfs; print gtfs.default_merging("path/to/gtfs/")'
  27. def default_merging(dossier):
  28. reports,nouv_fichier=createSA(dossier+'stops.txt',250)
  29. shutil.move(nouv_fichier,dossier+'stops.txt')
  30. reports+=report_log("### merging stop point within 250m to create stop areas OK ###")
  31. return reports
  32.  
  33.  
  34.  
  35.  
  36. def report_log(chaine):
  37. chaine=str(chaine.encode('utf-8'))
  38. date=str(renvoi_date())
  39. heure=str(renvoi_heure())
  40. log_report=date+' '+heure+' : '+chaine+'\n'
  41. logprint(log_report)
  42. return log_report
  43.  
  44.  
  45. def logprint(chaine, fichier='./data_script_log.txt'):
  46. chaine=str(chaine)
  47. file= open(fichier,'a')
  48. date=renvoi_date()
  49. heure=renvoi_heure()
  50. print(date+' '+heure+' : '+chaine)
  51. file.write(date+' '+heure+' : '+chaine+'\n')
  52.  
  53.  
  54. def renvoi_date(decalage=0):
  55. date=datetime.datetime.now().strftime("%Y%m%d")
  56. return date
  57.  
  58.  
  59. def renvoi_heure(decalage=0):
  60. date=datetime.datetime.now().strftime("%X")
  61. return date
  62.  
  63.  
  64. def cellneedprotection(cell, separateurcsv):
  65. rep=False
  66. list_of_protection=[separateurcsv,"'"]
  67. cell=str(cell)
  68. for letter in cell:
  69. for value in list_of_protection:
  70. if letter == value:
  71. rep=True
  72. return rep
  73.  
  74.  
  75. def trouverposition(chaine, liste):
  76. count=0
  77. rep=999
  78. for valeur in liste:
  79. valeur_bom=valeur.replace('"','')
  80. valeur_bom=valeur_bom[1:]
  81. if valeur == chaine or valeur_bom == chaine:
  82. rep=count
  83. count+=1
  84. return rep
  85.  
  86.  
  87. def distance_wgs84(lat1, lon1, lat2, lon2):
  88. R=6371
  89. if lat1==lat2 and lon1==lon2:
  90. dist1=0
  91. else:
  92. 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)))
  93. return (dist1*1000)
  94.  
  95.  
  96. def csv_list_to_raw_str(list, separateurcsv=','):
  97. result = ""
  98. lb_first = True
  99. for cell in list :
  100. if cell:
  101. cell=cell.replace('"','""')
  102. if not lb_first:
  103. result += separateurcsv
  104. lb_first = False
  105. if cellneedprotection(cell, separateurcsv):
  106. result += '"'+str(cell)+'"'
  107. else:
  108. result += str(cell)
  109. return result + "\n"
  110.  
  111.  
  112. def createSA(fichier_stops, verif_geo=0, separateurcsv=','):
  113. reports=''
  114. code_to_change = []
  115. file = codecs.open(fichier_stops, 'r', 'utf-8')
  116. output = codecs.open(fichier_stops+"_new.txt", 'w', 'utf-8')
  117. reader = csv.reader(file, delimiter=separateurcsv, quoting=csv.QUOTE_MINIMAL)
  118. stop_area=[]
  119. count=0
  120. nb_sa=0
  121. create_parent_station=False
  122. create_location_type=False
  123. for row in reader:
  124. if count==0:
  125. last_colum=len(row)-1
  126. stop_id_pos=trouverposition('stop_id',row)
  127. stop_name_pos=trouverposition('stop_name',row)
  128. parent_station_pos=trouverposition('parent_station',row)
  129. if parent_station_pos==999:
  130. last_colum=last_colum+1
  131. parent_station_pos=last_colum
  132. row.append('parent_station')
  133. create_parent_station=True
  134. location_type_pos=trouverposition('location_type',row)
  135. if location_type_pos==999:
  136. last_colum=last_colum+1
  137. location_type_pos=last_colum
  138. row.append('location_type')
  139. create_location_type=True
  140. lat_pos=trouverposition('stop_lat',row)
  141. lon_pos=trouverposition('stop_lon',row)
  142. temp=csv_list_to_raw_str(row)
  143. output.write(temp)
  144. else:
  145. if len(row) > 1:
  146. if create_parent_station: row.append('')
  147. if create_location_type: row.append('')
  148. name=row[stop_name_pos]
  149. if row[lat_pos]:
  150. lat1=float(row[lat_pos])
  151. else:
  152. lat1=0
  153. if row[lon_pos]:
  154. lon1=float(row[lon_pos])
  155. else:
  156. lon1=0
  157.  
  158. ispresent=False
  159.  
  160. ### is it a stoppoint?
  161. if row[location_type_pos]=='':
  162. row[location_type_pos]='0'
  163. if row[location_type_pos]=='0':
  164. if not row[parent_station_pos]:
  165. code='CTP'+row[stop_id_pos]
  166. for sa_name in stop_area:
  167. if sa_name[0]==name:
  168. lat2=float(sa_name[2])
  169. lon2=float(sa_name[3])
  170. #print(str(lat1)+' - '+str(lon1)+' - '+str(lat2)+' - '+str(lon2))
  171. if verif_geo and distance_wgs84(lat1, lon1, lat2, lon2)<verif_geo:
  172. #if sa_name[2:3] proche de lon/lat:
  173. reports+=report_log('merge '+sa_name[0]+' -- '+name)
  174. ispresent=True
  175. code=sa_name[1]
  176. row[parent_station_pos]=code
  177. temp=csv_list_to_raw_str(row)
  178. output.write(temp)
  179. if not ispresent:
  180. stop_area.append((name,code,lat1,lon1))
  181. nb_sa+=1
  182. rowsa=row
  183. rowsa[stop_id_pos]=code
  184. rowsa[location_type_pos]='1'
  185. rowsa[parent_station_pos]=''
  186. temp=csv_list_to_raw_str(rowsa)
  187. output.write(temp)
  188. else:
  189. temp=csv_list_to_raw_str(row)
  190. output.write(temp)
  191. else:
  192. ## is it a stoparea!
  193. code=row[stop_id_pos]
  194. for sa_name in stop_area:
  195. if sa_name[0]==name:
  196. lat2=float(sa_name[2])
  197. lon2=float(sa_name[3])
  198. #print(str(lat1)+' - '+str(lon1)+' - '+str(lat2)+' - '+str(lon2))
  199. if verif_geo and distance_wgs84(lat1, lon1, lat2, lon2)<verif_geo:
  200. #if sa_name[2:3] proche de lon/lat:
  201. reports+=report_log('merge '+sa_name[0]+' -- '+name)
  202. code_to_change.append((row[stop_id_pos], sa_name[1]))
  203. ispresent=True
  204. code=sa_name[1]
  205. if not ispresent:
  206. stop_area.append((name,code,lat1,lon1))
  207. temp=csv_list_to_raw_str(row)
  208. output.write(temp)
  209. count+=1
  210. output.close()
  211. ## modifiy with code to change:
  212. if len(code_to_change):
  213. count=0
  214. file = codecs.open(fichier_stops+"_new.txt", 'r', 'utf-8')
  215. output = codecs.open(fichier_stops+"_new2.txt", 'w', 'utf-8')
  216. reader = csv.reader(file, delimiter=separateurcsv, quoting=csv.QUOTE_MINIMAL)
  217. for row in reader:
  218. if count==0:
  219. parent_station_pos=trouverposition('parent_station',row)
  220. temp=csv_list_to_raw_str(row)
  221. output.write(temp)
  222. else:
  223. for code_change in code_to_change:
  224. if row[parent_station_pos] == code_change[0]:
  225. row[parent_station_pos]=code_change[1]
  226. temp=csv_list_to_raw_str(row)
  227. output.write(temp)
  228. count+=1
  229. output.close()
  230. shutil.move(fichier_stops+"_new2.txt",fichier_stops+"_new.txt")
  231. reports+=report_log('Stop_Area create : '+str(nb_sa))
  232. reports+=report_log('count Stop_point : '+str(count))
  233. return reports, fichier_stops+"_new.txt"
  234.  
  235.  
  236. def create_transfer(dossier, separateurcsv=','):
  237. dist_max=300
  238. vitesse=1.12
  239. wait_time=60
  240. nb_transfer=0
  241. nb_SA=0
  242. reports=''
  243. file = codecs.open(dossier+'stops.txt', 'r', 'utf-8')
  244. output = codecs.open(dossier+'transfers.txt', 'w', 'utf-8')
  245. reader = csv.reader(file, delimiter=separateurcsv, quoting=csv.QUOTE_MINIMAL)
  246. count=0
  247. SA_list=[]
  248. ### list of the SA not null
  249. for row in reader:
  250. if count==0:
  251. stop_id_pos=trouverposition('stop_id',row)
  252. name_pos=trouverposition('stop_name',row)
  253. location_type_pos=trouverposition('location_type',row)
  254. lat_pos=trouverposition('stop_lat',row)
  255. lon_pos=trouverposition('stop_lon',row)
  256. else:
  257. if len(row) > 1:
  258. if location_type_pos == 999 or row[location_type_pos]=='0':
  259. if row[lat_pos]:
  260. lat1=float(row[lat_pos])
  261. if row[lon_pos]:
  262. lon1=float(row[lon_pos])
  263. code=row[stop_id_pos]
  264. name=row[name_pos]
  265. SA_list.append((code,lat1,lon1,name))
  266. count+=1
  267. ### search for each stops, who is at xxx m (dist_max) around
  268. temp=csv_list_to_raw_str(['from_stop_id','to_stop_id','transfer_type','min_transfer_time'])
  269. output.write(temp)
  270. for Stop_area1 in SA_list:
  271. temp=csv_list_to_raw_str([Stop_area1[0],Stop_area1[0],'2',str(wait_time)])
  272. output.write(temp)
  273. reports+=report_log('transfer write from ['+str(Stop_area1[3])+ '] to ['+str(Stop_area1[3])+'] ('+str(wait_time)+'s)')
  274. nb_SA+=1
  275. for Stop_area2 in SA_list:
  276. if Stop_area1!=Stop_area2:
  277. distance=distance_wgs84(Stop_area1[1], Stop_area1[2], Stop_area2[1], Stop_area2[2])
  278. if distance<dist_max:
  279. nb_transfer+=1
  280. time_transfer=int(1.4142*distance*vitesse)
  281. temp=csv_list_to_raw_str([Stop_area1[0],Stop_area2[0],'2',str(time_transfer)])
  282. output.write(temp)
  283. reports+=report_log('transfer write from ['+str(Stop_area1[3])+ '] to ['+str(Stop_area2[3])+'] ('+str(time_transfer)+'s)')
  284. reports+=report_log('transfer create : '+str(nb_transfer)+ '(+'+str(nb_SA)+')')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement