【2019数模国赛C题】js+BaiduMap API实现上海浦东机场出租车行车路径可视化

本文介绍了如何利用js和百度地图API,基于2007年的上海出租车GPS数据,筛选并可视化经过浦东机场的出租车路径。通过前端展示,实现了路径颜色根据载客状态变化,以及可拖动的进度条控制显示时间的功能。
摘要由CSDN通过智能技术生成

作为数学苦手,每次参加数模(虽然加上这次也就两次)都是抱着划水抱大腿的打算参加的……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条数据经过了浦东机场,还是比较可观的。

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现地图API公交线路查询和查询公交车还有几站的功能,可以使用百度地图SDK或高德地图SDK。以下是使用百度地图SDK实现的示例代码: 1. 添加依赖和权限 在build.gradle文件中添加以下依赖: ```gradle implementation 'com.baidu.android:libmap-sdk:5.3.0' implementation 'com.baidu.android:libsearch:5.3.0' ``` 在AndroidManifest.xml文件中添加以下权限: ```xml <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> ``` 2. 初始化地图和定位 在Activity的onCreate方法中初始化地图和定位: ```java MapView mMapView = findViewById(R.id.map_view); BaiduMap mBaiduMap = mMapView.getMap(); // 开启定位图层 mBaiduMap.setMyLocationEnabled(true); LocationClient mLocationClient = new LocationClient(this); mLocationClient.registerLocationListener(new BDAbstractLocationListener() { @Override public void onReceiveLocation(BDLocation bdLocation) { // 定位成功后的回调 } }); mLocationClient.start(); ``` 3. 查询公交路线 使用百度地图的TransitRoutePlanOption类可以查询公交路线。以下是查询从起点到终点的公交路线的示例代码: ```java TransitRoutePlanOption option = new TransitRoutePlanOption() .from(PlanNode.withLocation(startLocation)) .to(PlanNode.withLocation(endLocation)); RoutePlanSearch search = RoutePlanSearch.newInstance(); search.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() { @Override public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) { // 查询结果回调 } }); search.transitSearch(option); ``` 4. 查询公交车还有几站 使用百度地图的BusLineSearch类可以查询公交线路的详细信息,包括公交车还有几站到达目的地。以下是查询公交线路详细信息的示例代码: ```java BusLineSearch busLineSearch = BusLineSearch.newInstance(); busLineSearch.setOnGetBusLineSearchResultListener(new OnGetBusLineSearchResultListener() { @Override public void onGetBusLineResult(BusLineResult busLineResult) { // 查询结果回调 } }); busLineSearch.searchBusLine(new BusLineSearchOption().city(city).uid(busLineUid)); ``` 其中,city为城市名,busLineUid为公交线路的唯一标识符。查询结果中包含了公交车经过的所有站点信息,可以根据当前位置和目的地位置计算出还有几站到达目的地。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值