作为数学苦手,每次参加数模(虽然加上这次也就两次)都是抱着划水抱大腿的打算参加的……C题要求的是搜集某城市航班和该城市机场出租相关信息,航班信息倒简单,爬一下携程、飞常准之类的网站就行了。机场出租信息真是要了老命……按思路有两种,一种是查机场出租车秩序站的相关接口,在某乎上有看到有匿名网友爬到了郑州新郑机场出租车秩序站的一个网页,但找来找去没找着;第二种则是统计筛选某城市所有出租车的GPS路径,本来觉得这数据处理也太麻烦了,也找不到数据。在几乎打算直接编造数据的时候,在某乎上找到了一份2007年上海出租车的GPS数据,处理了一下也还好。做了个简单的可视化,虽然对论文估计没啥用,但还是挺有意思的,这里记录一下简单的js和相关接口的运用,萌新如我也可以轻松学会。
数据格式
一段示例数据:
2108,2007-02-20 00:01:06,121.438500,31.249000, 0, 45,0
2108,2007-02-20 00:02:07,121.438500,31.249000, 0, 45,0
2108,2007-02-20 00:03:08,121.438500,31.249000, 0, 45,0
2108,2007-02-20 00:04:09,121.438500,31.249000, 0, 45,0
编号 | 时间 | 经度 | 纬度 | 速度 | 偏移角度 | 载客状态 |
---|---|---|---|---|---|---|
2108 | 2007-02-20 00:01:06 | 121.438500 | 31.249000 | 0 | 45 | 0 |
实现过程
整个数据有4000多份,每一份都是一辆出租车一天约每隔一分钟产生的位置信息。因为其中不乏没有出动的、只在市区载客的出租车,我们需要筛选出经过上海浦东机场的数据,从百度地图上找出上海浦东机场的位置为[121.81509,31.157478],为了方便简单的定义经过该坐标半径3000m即视作经过浦东机场。
# -*- coding:utf-8 -*-
import os
from math import radians, cos, sin, asin, sqrt
import shutil
#计算两点间距离-m
def geodistance(lng1,lat1,lng2,lat2):
lng1, lat1, lng2, lat2 = map(radians, [lng1, lat1, lng2, lat2])
dlon=lng2-lng1
dlat=lat2-lat1
a=sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
dis=2*asin(sqrt(a))*6371*1000
return dis
def all_path(dirname):
result = []#所有的文件
for maindir, subdir, file_name_list in os.walk(dirname):
for filename in file_name_list:
apath = os.path.join(maindir, filename)#合并成一个完整路径
result.append(apath)
return result
if __name__ == '__main__':
dis = [121.81509,31.157478]
path = r'E:\杂图作品\20190912数学建模\数据(打开前请看备注)'
to_path = r'E:\杂图作品\20190912数学建模\经过浦东机场的数据'
txts = all_path(path)
count = 0;
for i in txts:
f = open(i)
for s in f.readlines():
a = s.split(',')
if(geodistance(float(a[2]),float(a[3]),dis[0],dis[1])<3000):
print("%s经过了浦东机场"%i)
shutil.copy(i, to_path)
count+=1
break
print("共%d辆出租车经过浦东机场"%count)
经过筛选,有263条数据经过了浦东机场,还是比较可观的。