import os
import threading
from datetime import datetime
import pandas as pd
from src.relate_data import get_bus_geo_polyline
from utils.read_write import writeOneCSV
'''
此文件用於找出用戶的上車下車站點經緯度
'''
def get_terminal():
guituwei = 'D:\data\403.csv'
terminal = pd.read_csv(guituwei)
return terminal
def terminal_line_license():
terminal_line_license = 'merge_all.csv'
line_license_data = pd.read_csv(terminal_line_license)
return line_license_data
# 按照乘客刷卡對應的POS卡號,找到相對應的車輛車牌,
def find_plate(terminal_id):
plate_ser = relate_terminal[relate_terminal['終端編號']==terminal_id]
if not plate_ser.empty:
plate = str(plate_ser.iat[0,4])
return plate
return ''
# 根據用戶的刷卡時間找到離公交車軌跡定位時間最近的時間,從而對應用戶上車的座標
# 根據用戶上車的座標找到離用戶最近的公交車站點座標,近似推算用戶上車的站點
# ['line', 'license', 'time', 'longitude','latitude','speed','other']
def compare_time_find_station(card_terminal, plate_geo):
up_station_list = []
card_car_date_time = datetime.strptime(card_terminal[2], "%Y-%m-%d %H:%M:%S")
time_list = plate_geo['time']
time_list = time_list.sort_values()
time_list_copy = time_list.tolist()
geo_time = str_search(time_list_copy,card_car_date_time)
if geo_time:
one_plate_geo = plate_geo[plate_geo['time'] == geo_time]
up_station_list.append(card_terminal[0])
up_station_list.append(card_terminal[3])
up_station_list.append(card_terminal[2])
up_station_list.append(one_plate_geo.iat[0,1])
up_station_list.append(one_plate_geo.iat[0,3])
up_station_list.append(one_plate_geo.iat[0,4])
return up_station_list
def str_search(li,card_car_date_time):
start = 0
end = len(li) - 1
# 只要start和end 還沒錯開 就一直找
while start <= end:
# 通過計算獲取當前查找範圍的中間位置
mid = (start + end) // 2
geo_date_time = li[mid]
geo_time = datetime.strptime(geo_date_time, "%Y-%m-%dT%H:%M:%S.%fZ")
if end - start < 2:
return geo_date_time
# 如果mid比item大,說明item可能會出現在mid左邊,對左邊再查找
elif geo_time > card_car_date_time:
end = mid - 1
# mid 比item小,說明item有可能在mid右邊,對右邊再查找
else:
start = mid + 1
# 根據車牌可以找到公交車線路定位軌跡
# 前提是車是否在指定路線的軌跡上跑,如果符合則可實現乘客的刷卡數據和公交車線路定位軌跡數據的關聯
def find_plate_geo(plate):
plate_file_path = src + plate + '.csv'
if os.path.exists(plate_file_path):
bus_geo = get_bus_geo_polyline(plate_file_path)
return bus_geo
return pd.DataFrame(columns=['k'])
def loop():
for x in range(0, 17638533):
card_terminal = terminal_record.loc[x]
card_terminal_plate = find_plate(card_terminal[3])
# 根據車牌找到公交車線路定位軌跡
plate_geo = find_plate_geo(card_terminal_plate)
# 根據用戶的刷卡時間找到最近的公交車定位時間,從而對應用戶的上車座標
if not plate_geo.empty:
up_station = compare_time_find_station(card_terminal, plate_geo)
if up_station:
writeOneCSV(up_station, 'bus_o.csv')
if __name__ == "__main__":
# 設備線路終端編號對照表 終端編號 公司名稱 線路或站點 車牌
relate_terminal = terminal_line_license()
src = 'D3\\'
# 規土委乘客刷卡數據 CARDID TRADETYPE TRADEDATE TERMINALID(終端編號)
terminal_record = get_terminal()
loop()
如有如何問題或需要幫助,請私聊我!