TransBigData为交通时空大数据而生

_images/logo-wordmark-dark.png

主要功能

TransBigData是一个为交通时空大数据处理和分析而开发的Python包。TransBigData为处理常见的交通时空大数据(如出租车GPS数据、共享单车数据和公交车GPS数据)提供了快速而简洁的方法。它包括栅格化、数据质量分析、数据预处理、数据集计数、轨迹分析、GIS处理、地图底图加载、坐标和距离计算以及数据可视化等通用方法。

技术特点

  • 为交通时空大数据分析的不同阶段提供不同的处理方法。

  • TransBigData的代码简洁、高效、灵活、易用,可以用简洁的代码实现复杂的数据任务。

简介

快速启动

在安装TransBigData之前,请确保你已经安装了geopandas软件包:https://geopandas.org/index.html
如果已安装 geopandas,请直接从命令提示符运行以下代码进行安装
pip install -U transbigdata

以下示例展示了如何使用 TransBigData 从出租车 GPS 数据中快速提取行程 OD

import transbigdata as tbd
import pandas as pd
data = pd.read_csv('TaxiData-Sample.csv',header = None)
data.columns = ['VehicleNum','time','slon','slat','OpenStatus','Speed']
data
_images/WX20211021-192131%402x.png

使用`tbd.taxigps_to_od`方法并传入相应的列名以提取行程 OD:

#Extract OD from GPS data
oddata = tbd.taxigps_to_od(data,col = ['VehicleNum','time','slon','slat','OpenStatus'])
oddata
_images/WX20211021-190104%402x.png

将 OD 聚合到网格中:

#define bounds
bounds = [113.6,22.4,114.8,22.9]
#obtain the gridding parameters
params = tbd.grid_params(bounds = bounds,accuracy = 1500)
#gridding OD data and aggregate
od_gdf = tbd.odagg_grid(oddata,params)
od_gdf.plot(column = 'count')
_images/WX20211021-190524%402x.png

安装

安装

安装

TransBigData 支持 Python >= 3.6。

TransBigData依赖于geopandas,在安装TransBigData之前,您需要根据 `此链接<https://geopandas.org/en/stable/getting_started.html#installation>`_ 安装geopandas,如果您已经安装了geopandas,请直接从命令提示符运行以下代码进行安装:

pip install -U transbigdata

你也可以通过conda-forge安装TransBigData,这将自动解决依赖问题,它可以安装:

conda install -c conda-forge transbigdata

要导入 TransBigData,请在 Python 中运行以下代码:

import transbigdata as tbd

依赖

TransBigData依赖以下包

  • pandas

  • shapely

  • rtree

  • geopandas

  • scipy

  • matplotlib

  • `networkx`(可选)

  • `igraph`(可选)

  • `osmnx`(可选)

  • `seaborn`(可选)

  • `keplergl`(可选)

核心方法

数据栅格化

area_to_grid(location[, accuracy, method, ...])

在边界或形状中生成矩形栅格

area_to_params(location[, accuracy, method])

生成栅格化参数

GPS_to_grid(lon, lat, params)

将 GPS 数据与栅格匹配。

grid_to_centre(gridid, params)

栅格的中心位置。

grid_to_polygon(gridid, params)

根据栅格ID生成几何列。

grid_to_area(data, shape, params[, col])

输入格网 ID 两列、地理面和格网参数。

grid_to_params(grid)

从栅格重新生成栅格化参数。

grid_params_optimize(data, initialparams[, ...])

优化栅格参数

geohash_encode(lon, lat[, precision])

输入经纬度和精度,编码geohash码

geohash_decode(geohash)

解码geohash码

geohash_togrid(geohash)

输入geohash码生成geohash栅格单元格

栅格化框架

_images/1648715064154.png
transbigdata.area_to_grid(location, accuracy=500, method='rect', params='auto')

在边界或形状中生成矩形栅格

参数:
  • location (bounds(List) or shape(GeoDataFrame)) – 生成栅格的位置。如果边界为 [lon1, lat1, lon2, lat2](WGS84),其中 lon1 , lat1 是左下角坐标,lon2 , lat2 是右上角坐标 如果是形状,则应为 GeoDataFrame

  • accuracy (number) – 栅格尺寸(米)

  • method (str) – 直角、三角或六角

  • params (list or dict) – 栅格化参数。有关栅格化参数的详细信息,请参阅 https://transbigdata.readthedocs.io/en/latest/grids.html。给出格网参数时,将不使用精度。

返回:

  • gridGeoDataFrame) – Grid GeoDataFrame、LONCOL 和 LATCOL 是栅格的索引,HBLON 和 HBLAT 是栅格的中心

  • 参数列表或字典) – 栅格参数。有关栅格化参数的详细信息,请参阅 https://transbigdata.readthedocs.io/en/latest/grids.html

transbigdata.area_to_params(location, accuracy=500, method='rect')

生成栅格化参数

参数:
  • location (bounds(List) or shape(GeoDataFrame)) – 生成栅格的位置。如果边界为 [lon1, lat1, lon2, lat2](WGS84),其中 lon1 , lat1 是左下角坐标,lon2 , lat2 是右上角坐标 如果是形状,则应为 GeoDataFrame

  • accuracy (number) – 栅格尺寸(米)

  • method (str) – 直角、三角或六角

返回:

参数 – 栅格参数。有关栅格化参数的详细信息,请参阅 https://transbigdata.readthedocs.io/en/latest/grids.html

返回类型:

list or dict

transbigdata.GPS_to_grid(lon, lat, params)

将 GPS 数据与栅格匹配。输入是经度、纬度和格网参数列。输出是栅格 ID。

参数:
返回:

  • 矩形栅格

  • [LONCOL,LATCOL]list) – 两列 LONCOL 和 LATCOL 一起可以指定栅格。

  • 三角形和六边形栅格

  • [loncol_1,loncol_2,loncol_3]list) – 栅格纬度的索引。两列 LONCOL 和 LATCOL 一起可以指定一个栅格。

transbigdata.grid_to_centre(gridid, params)

栅格的中心位置。输入是格网ID和参数,输出是格网中心位置。

参数:
  • gridid (list) – 如果“矩形栅格”[LONCOL,LATCOL]:系列 两列 LONCOL 和 LATCOL 一起可以指定栅格。 如果“三角形和六边形栅格” [loncol_1,loncol_2,loncol_3] :系列 栅格纬度的索引。两列 LONCOL 和 LATCOL 一起可以指定一个栅格。

  • params (list or dict) – 栅格化参数。有关栅格化参数的详细信息,请参阅 https://transbigdata.readthedocs.io/en/latest/grids.html

返回:

  • HBLON (Series) – 栅格中心的经度

  • HBLAT (Series) – 栅格中心的纬度

transbigdata.grid_to_polygon(gridid, params)

基于格网 ID 生成几何列。输入是栅格 ID,输出是几何图形。支持矩形、三角形和六边形栅格

参数:
  • gridid (list) – 如果“矩形栅格”[LONCOL,LATCOL]:系列 两列 LONCOL 和 LATCOL 一起可以指定栅格。 如果“三角形和六边形栅格” [loncol_1,loncol_2,loncol_3] :系列 栅格纬度的索引。两列 LONCOL 和 LATCOL 一起可以指定一个栅格。

  • params (list or dict) – 栅格化参数。有关栅格化参数的详细信息,请参阅 https://transbigdata.readthedocs.io/en/latest/grids.html

返回:

geometry – 栅格地理多边形的列

返回类型:

Series

transbigdata.grid_to_area(data, shape, params, col=['LONCOL', 'LATCOL'])

输入格网 ID 两列、地理面和格网参数。输出是栅格。

参数:
  • data (DataFrame) – 数据,有两列栅格ID

  • shape (GeoDataFrame) – 地理多边形

  • params (list or dict) – 栅格化参数。有关栅格化参数的详细信息,请参阅 https://transbigdata.readthedocs.io/en/latest/grids.html

  • col (List) – 列名称 [LONCOL,LATCOL] 用于矩形栅格,或 [loncol_1,loncol_2,loncol_3] 表示三和六栅格

返回:

data1 – 数据栅格化和映射到相应的地理多边形

返回类型:

DataFrame

transbigdata.grid_to_params(grid)

从栅格重新生成栅格化参数。

参数:

grid (GeoDataFrame) – transbigdata生成的栅格

返回:

参数 – 栅格参数。有关栅格化参数的详细信息,请参阅 https://transbigdata.readthedocs.io/en/latest/grids.html

返回类型:

list or dict

transbigdata.grid_params_optimize(data, initialparams, col=['uid', 'lon', 'lat'], optmethod='centerdist', printlog=False, sample=0, pop=15, max_iter=50, w=0.1, c1=0.5, c2=0.5)

优化栅格参数

参数:
  • data (DataFrame) – 轨迹数据

  • initialparams (List) – 初始栅格参数

  • col (List) – 列名[uid,lon,lat]

  • optmethod (str) – 优化方法:centerdist, gini, gridscount

  • printlog (bool) – 是否打印明细结果

  • sample (int) – 采样数据作为输入,为0则不采样

  • pop – 来自 scikit-opt 的 PSO 中的参数

  • max_iter – 来自 scikit-opt 的 PSO 中的参数

  • w – 来自 scikit-opt 的 PSO 中的参数

  • c1 – 来自 scikit-opt 的 PSO 中的参数

  • c2 – 来自 scikit-opt 的 PSO 中的参数

返回:

params_optimized – 优化的参数

返回类型:

List

geohash编码

Geohash 是一种公共地理编码系统,可将纬度和经度地理位置编码为字母和数字字符串,这些字符串也可以解码回纬度和经度。每个字符串代表一个栅格编号,字符串的长度越长,精度越高。根据wiki<https://en.wikipedia.org/wiki/Geohash>,与精度对应的Geohash字符串长度表如下。

geohash 长度(精度)

纬度位

lng位

纬度错误

lng 错误

公里错误

1

2

3

±23

±23

±2500

2

5

5

±2.8

±5.6

±630

3

7

8

±0.70

±0.70

±78

4

10

10

±0.087

±0.18

±20

5

12

13

±0.022

±0.022

±2.4

6

15

15

±0.0027

±0.0055

±0.61

7

17

18

±0.00068

±0.00068

±0.076

8

20

20

±0.000085

±0.00017

±0.019

TransBigData还提供了基于Geohash的功能,三个功能如下:

transbigdata.geohash_encode(lon, lat, precision=12)

输入经纬度和精度,编码geohash码

参数:
  • lon (Series) – 经度系列

  • lat (Series) – 纬度系列

  • precision (number) – geohash精度

返回:

geohash – 编码的geohash系列

返回类型:

Series

transbigdata.geohash_decode(geohash)

解码geohash码

参数:

geohash (Series) – encoded geohash 系列

返回:

  • lon (Series) – 解码后的经度系列

  • lat (Series) – 解码后的纬度系列

transbigdata.geohash_togrid(geohash)

输入geohash码生成geohash栅格单元格

参数:

geohash (Series) – encoded geohash 系列

返回:

poly – geohash 的栅格单元多边形

返回类型:

Series

与TransBigData软件包中提供的矩形网格处理方法相比,geohash速度较慢,并且不提供自由定义的网格大小。以下示例演示如何使用这三个函数来利用 geohash 编码、解码和可视化

import transbigdata as tbd
import pandas as pd
import geopandas as gpd
#read data
data = pd.read_csv('TaxiData-Sample.csv',header = None)
data.columns = ['VehicleNum','time','slon','slat','OpenStatus','Speed']
#encode geohash
data['geohash'] = tbd.geohash_encode(data['slon'],data['slat'],precision=6)
data['geohash']
0         ws0btw
1         ws0btz
2         ws0btz
3         ws0btz
4         ws0by4
           ...
544994    ws131q
544995    ws1313
544996    ws131f
544997    ws1361
544998    ws10tq
Name: geohash, Length: 544999, dtype: object
#Aggregate
dataagg = data.groupby(['geohash'])['VehicleNum'].count().reset_index()
dataagg['lon_geohash'],dataagg['lat_geohash'] = tbd.geohash_decode(dataagg['geohash'])
dataagg['geometry'] = tbd.geohash_togrid(dataagg['geohash'])
dataagg = gpd.GeoDataFrame(dataagg)
dataagg
geohash VehicleNum lon_geohash lat_geohash geometry
0 w3uf3x 1 108. 10.28 POLYGON ((107.99561 10.27771, 107.99561 10.283...
1 webzz6 12 113.9 22.47 POLYGON ((113.87329 22.46704, 113.87329 22.472...
2 webzz7 21 113.9 22.48 POLYGON ((113.87329 22.47253, 113.87329 22.478...
3 webzzd 1 113.9 22.47 POLYGON ((113.88428 22.46704, 113.88428 22.472...
4 webzzf 2 113.9 22.47 POLYGON ((113.89526 22.46704, 113.89526 22.472...
... ... ... ... ... ...
2022 ws1d9u 1 114.7 22.96 POLYGON ((114.68628 22.96143, 114.68628 22.966...
2023 ws1ddh 6 114.7 22.96 POLYGON ((114.69727 22.96143, 114.69727 22.966...
2024 ws1ddj 2 114.7 22.97 POLYGON ((114.69727 22.96692, 114.69727 22.972...
2025 ws1ddm 4 114.7 22.97 POLYGON ((114.70825 22.96692, 114.70825 22.972...
2026 ws1ddq 7 114.7 22.98 POLYGON ((114.70825 22.97241, 114.70825 22.977...

2027 rows × 5 columns

bounds = [113.6,22.4,114.8,22.9]
import matplotlib.pyplot as plt
import plot_map
fig =plt.figure(1,(8,8),dpi=280)
ax =plt.subplot(111)
plt.sca(ax)
tbd.plot_map(plt,bounds,zoom = 12,style = 4)
cax = plt.axes([0.05, 0.33, 0.02, 0.3])
plt.title('count')
plt.sca(ax)
dataagg.plot(ax = ax,column = 'VehicleNum',cax = cax,legend = True)
tbd.plotscale(ax,bounds = bounds,textsize = 10,compasssize = 1,accuracy = 2000,rect = [0.06,0.03],zorder = 10)
plt.axis('off')
plt.xlim(bounds[0],bounds[2])
plt.ylim(bounds[1],bounds[3])
plt.show()
_images/output_9_0.png

轨迹处理

traj_clean_drift(data[, col, method, ...])

删除轨迹数据中的漂移。

traj_clean_redundant(data[, col])

删除与前后数据信息相同的数据,以减少数据量。

traj_slice(traj_data, slice_data[, ...])

根据切片数据对轨迹数据进行切片。

traj_smooth(data[, col, proj, ...])

使用卡尔曼滤波器的平滑轨迹。

traj_segment(data[, groupby_col, retain_col])

按顺序分割轨迹,返回每段的起点和终点信息。

traj_densify(data[, col, timegap])

轨迹致密化,保证每个时间间隔秒都有一个轨迹点

traj_sparsify(data[, col, timegap, method])

轨迹稀疏化。

traj_stay_move(data, params[, col, activitytime])

输入轨迹数据和栅格化参数,识别停留和移动

traj_to_linestring(traj_points[, col, timecol])

输入轨迹,生成GeoDataFrame

traj_mapmatch(traj, G[, col])

最近地图匹配:查找道路网络上每个轨迹点的最近点。

traj_length(move_points[, col, method])

计算轨迹长度。

_images/trajs.png
transbigdata.traj_clean_drift(data, col=['VehicleNum', 'Time', 'Lng', 'Lat'], method='twoside', speedlimit=80, dislimit=1000, anglelimit=30)

删除轨迹数据中的漂移。漂移定义为速度大于速度限制或当前点与下一个点之间的距离大于距离限制或当前点与前一点和下一个点之间的角度小于角度限制的数据。限速默认为80km/h,距离限制默认为1000m。清理漂移数据的方法分为两种方法:“单侧”和“双侧”。“单面”法是考虑当前点和下一个点的速度,“双边”法是考虑当前点、前一点和下一个点的速度。

参数:
  • data (DataFrame) – 数据

  • col (List) – 列名,顺序为[‘VehicleNum’, ‘Time’, ‘Lng’, ‘Lat’]

  • method (string) – 清洗漂移数据的方法,包括‘oneside’和‘twoside’

  • speedlimit (number) – 限速

  • dislimit (number) – 距离限制

  • anglelimit (number) – 角度限制

返回:

data1 – 清理后的数据

返回类型:

DataFrame

transbigdata.traj_clean_redundant(data, col=['VehicleNum', 'Time', 'Lng', 'Lat'])

删除与前后数据信息相同的数据,以减少数据量。例如,如果一个人的几个连续数据具有相同的信息,除了时间,则只能保留第一个和最后两个数据

参数:
  • data (DataFrame) – 数据

  • col (List) – 列名称,按 [‘车辆 ID, 时间’] 的顺序排列。它会按时间排序,然后确定时间以外的其他列的信息

返回:

data1 – 清理后的数据

返回类型:

DataFrame

transbigdata.traj_slice(traj_data, slice_data, traj_col=['vid', 'time'], slice_col=['vid', 'stime', 'etime', 'tripid'])

根据切片数据对轨迹数据进行切片。该方法根据指定的时间段(slice_data)从一组给定的轨迹数据(traj_data)中提取数据。

参数:
  • traj_data (DataFrame) – 轨迹数据,包含每辆车的轨迹

  • slice_data (DataFrame) – 切片数据,包含每个切片的开始时间、结束时间和车辆ID

  • traj_col (List) – 轨迹数据的列名,顺序为[VehicleNum,Time]

  • slice_col (List) – 切片数据的列名,按 [VehicleNum_slice、Stime、Etime、SliceId] 的顺序排列

返回:

data_sliced – 切片轨迹数据

返回类型:

DataFrame

示例

>>> tbd.traj_slice(GPSData, move, traj_col=['vid', 'time'], slice_col = ['vid','stime','etime','tripid'])
transbigdata.traj_smooth(data, col=['id', 'time', 'lon', 'lat'], proj=False, process_noise_std=0.5, measurement_noise_std=1)

使用卡尔曼滤波器的平滑轨迹。

参数:
  • data (DataFrame) – 轨迹数据

  • col (list) – 轨迹数据的列名

  • proj (bool) – 是否进行等距投影

  • process_noise_std (float) – 过程噪声的标准偏差

  • measurement_noise_std (float) – 测量噪声的标准偏差

返回:

data – 平滑轨迹数据

返回类型:

DataFrame

transbigdata.traj_segment(data, groupby_col=['id', 'moveid'], retain_col=['time', 'lon', 'lat'])

按顺序分割轨迹,返回每段的起点和终点信息。该功能可以分割GPS轨迹数据,计算每个线段的起点和终点信息,并将结果存储在DataFrame对象中。此函数的输入包括一个 pandas 数据帧对象,其中包含 GPS 轨迹数据、用于分组的字段名称和要保留的字段名称。输出是一个 pandas DataFrame 对象,其中包含每个线段的开始和结束信息,其中每行表示一个轨迹段。

参数:
  • data (DataFrame) – 轨迹数据需要预先排序。

  • groupby_col (List) – 指定要用于分段的分组依据字段的字符串列表。

  • retain_col (List) – 指定要保留的字段的字符串列表。

返回:

data – 包含每个线段的开始和结束信息,其中每行表示一个轨迹段。

返回类型:

DataFrame

transbigdata.traj_densify(data, col=['Vehicleid', 'Time', 'Lng', 'Lat'], timegap=15)

轨迹致密化,保证每个时间间隔秒都有一个轨迹点

参数:
  • data (DataFrame) – 数据

  • col (List) – 列名,顺序为[Vehicleid, Time, lng, lat]

  • timegap (number) – 采样间隔(秒)

返回:

data1 – 处理后的数据

返回类型:

DataFrame

transbigdata.traj_sparsify(data, col=['Vehicleid', 'Time', 'Lng', 'Lat'], timegap=15, method='subsample')

轨迹稀疏。当轨迹数据的采样频率过高时,数据量太大,这对于一些需要较少数据频率的研究进行分析是不方便的。此功能可以扩展采样间隔并减少数据量。

参数:
  • data (DataFrame) – 数据

  • col (List) – 列名,顺序为[Vehicleid, Time, lng, lat]

  • timegap (number) – 轨迹点之间的时间间隔

  • method (str) – ‘插值’或’子样本’

返回:

data1 – 稀疏轨迹数据

返回类型:

DataFrame

transbigdata.traj_stay_move(data, params, col=['ID', 'dataTime', 'longitude', 'latitude'], activitytime=1800)

输入轨迹数据和栅格化参数,识别停留和移动

参数:
  • data (DataFrame) – 轨迹数据

  • params (List) – 栅格化参数

  • col (List) – 列名,顺序为[‘ID’,’dataTime’,’longitude’,’latitude’]

  • activitytime (Number) – 多少时间算活动

返回:

  • stay (DataFrame) – 停留信息

  • move (DataFrame) – 移动信息

transbigdata.traj_to_linestring(traj_points, col=['Lng', 'Lat', 'ID'], timecol=None)

输入轨迹,生成GeoDataFrame

参数:
  • traj_points (DataFrame) – 轨迹数据

  • col (List) – 列名,顺序为[lng,lat,trajectoryid]

  • timecol (str(Optional)) – 可选,时间列的列名。如果给定,可以将返回的带有[经度,纬度,高度,时间]的geojson放入开普勒中以可视化轨迹

返回:

traj – 生成的轨迹

返回类型:

GeoDataFrame

transbigdata.traj_mapmatch(traj, G, col=['lon', 'lat'])

最近地图匹配:查找道路网络上每个轨迹点的最近点。在进行最近邻匹配时,我们需要找到路网中每个轨迹点最近的路段,并将轨迹点与该路段进行匹配。在实践中,我们可以先提取路段的节点形成一组点(即从几何列中的每个 LineString 中提取每个坐标点),然后计算轨迹点与这组点之间的最近距离,最后将轨迹点与最近距离节点所在的路段匹配。这个过程有效地将点与线的匹配问题转化为点与点的匹配问题。

参数:
  • traj (DataFrame) – 待匹配的轨迹点数据集。

  • G (networkx multidigraph) – 用于匹配的路网,由osmnx创建。

  • col (list) – 轨迹点数据集中经度和纬度列的名称。

返回:

traj_matched – 匹配后的轨迹点数据集。

返回类型:

DataFrame

transbigdata.traj_length(move_points, col=['lon', 'lat', 'moveid'], method='Haversine')

计算轨迹长度。输入轨迹点数据并计算每个轨迹的长度(以米为单位)。

参数:
  • move_points (DataFrame) – 轨迹点数据,包括轨迹ID、经度、纬度等。通过轨迹 id 区分不同的轨迹,轨迹点按时间顺序排列。

  • col (list) – Column names of the trajectory point data, in the order of [longitude, latitude, trajectory id]

  • method (str) – 计算轨迹长度的方法,可选“Haversine”或“Project”,默认为“Haversine”,使用球面三角公式计算距离,“Project”将数据转换为投影坐标系以计算平面距离。

返回:

move_trajs – 轨迹长度数据,包括轨迹 id 和轨迹长度两列,单位为米。

返回类型:

DataFrame

基础处理方法

数据质量分析

data_summary(data[, col, ...])

输出数据集的一般信息。

sample_duration(data[, col])

计算数据采样间隔。

transbigdata.data_summary(data, col=['Vehicleid', 'Time'], show_sample_duration=False, roundnum=4)

输出数据集的一般信息。

参数:
  • data (DataFrame) – 轨迹点数据

  • col (List) – 列名,顺序为[‘Vehicleid’, ‘Time’]

  • show_sample_duration (bool) – 是否输出个别采样间隔

  • roundnum (number) – 小数位数

transbigdata.sample_duration(data, col=['Vehicleid', 'Time'])

计算数据采样间隔。

参数:
  • data (DataFrame) – 数据

  • col (List) – 列名,顺序为[‘Vehicleid’, ‘Time’]

返回:

sample_duration – 列名持续时间的序列,内容是数据的采样间隔,以秒为单位

返回类型:

DataFrame

数据预处理

clean_outofbounds(data, bounds[, col])

输入为研究区域左下角和右上角的纬度和经度坐标,并排除研究区域外的数据

clean_outofshape(data, shape[, col, accuracy])

输入研究区域的地理数据框并排除研究区域以外的数据

id_reindex(data, col[, new, timegap, ...])

重新编号数据的ID列

id_reindex_disgap(data[, col, disgap, suffix])

对数据的ID列重新编号,如果相邻两条记录超过距离,则编号为新ID

transbigdata.clean_outofbounds(data, bounds, col=['Lng', 'Lat'])

输入为研究区域左下角和右上角的纬度和经度坐标,并排除研究区域外的数据

参数:
  • data (DataFrame) – 数据

  • bounds (List) – 研究区域左下角和右上角的纬度和经度,顺序为 [lon1, lat1, lon2, lat2]

  • col (List) – 经纬度列名

返回:

data1 – 研究范围内的数据

返回类型:

DataFrame

transbigdata.clean_outofshape(data, shape, col=['Lng', 'Lat'], accuracy=500)

输入研究区域的地理数据框并排除研究区域以外的数据

参数:
  • data (DataFrame) – 数据

  • shape (GeoDataFrame) – 研究区的GeoDataFrame

  • col (List) – 经纬度列名

  • accuracy (number) – 栅格的大小。原理是先做数据栅格化,然后再做数据清理。尺寸越小,精度越高

返回:

data1 – 研究范围内的数据

返回类型:

DataFrame

transbigdata.id_reindex(data, col, new=False, timegap=None, timecol=None, suffix='_new', sample=None)

重新编号数据的ID列

参数:
  • data (DataFrame) – 数据

  • col (str) – 要重新索引的ID列的名称

  • new (bool) – False:相同 ID 的新编号将是相同的索引;True:根据表的顺序,源 ID 再次出现,索引不同

  • timegap (number) – 如果某个个体在一段时间内没有出现(时间间隔是时间阈值),则将其编号为新个体。此参数应与 timecol 一起设置才能生效。

  • timecol (str) – time的列名,需要设置timegap才能生效

  • suffix (str) – 新列的后缀。设置为 False 时,将替换前一列

  • sample (int (optional)) – 对数据进行去采样

返回:

data1 – 重新编号的数据

返回类型:

DataFrame

transbigdata.id_reindex_disgap(data, col=['uid', 'lon', 'lat'], disgap=1000, suffix='_new')

对数据的ID列重新编号,如果相邻两条记录超过距离,则编号为新ID

参数:
  • data (DataFrame) – 数据

  • col (str) – 要重新索引的ID列的名称

  • disgap (number) – 如果相邻的两条记录超过这个距离,这个数字就是新的ID

  • suffix (str) – 新列的后缀。设置为 False 时,将替换前一列

返回:

data1 – 重新编号的数据

返回类型:

DataFrame

数据采集

getbusdata(city, keywords[, accurate, timeout])

从地图服务获取公交站和公交线路的地理信息(仅限中国)

getadmin(keyword, ak[, jscode, ...])

输入关键字和高德地图ak。

get_isochrone_amap(lon, lat, reachtime, ak)

从高德地图获取等时线reachcricle

get_isochrone_mapbox(lon, lat, reachtime[, ...])

从mapbox等时线获取等时线

transbigdata.getbusdata(city, keywords, accurate=True, timeout=20)

从地图服务获取公交站和公交线路的地理信息(仅限中国)

参数:
  • city (str) – 城市名称

  • keywords (list) – 关键字,行名

  • accurate (bool) – 精准匹配

  • timeout (number) – 取数据超时

返回:

  • data (GeoDataFrame) – 生成的总线(WGS84)

  • stop (GeoDataFrame) – 生成的公交车站(WGS84)

transbigdata.getadmin(keyword, ak, jscode='', subdistricts=False, timeout=20)

输入关键字和 Amap ak。输出为行政边界的GIS文件(仅限中国)

参数:
  • keywords (str) – 关键字。它可能是城市名称(如深圳),也可能是行政代码(如 440500)

  • ak (str) – 地图访问令牌

  • jscode (jscode) – 高德安全码

  • subdistricts (bool) – 是否输出行政区界线信息

  • timeout (number) – 取数据超时

返回:

  • admin (GeoDataFrame) – 行政区划(WGS84)

  • 数据帧) – 子区的信息。这可用于进一步获取较低级别区域的边界

transbigdata.get_isochrone_amap(lon, lat, reachtime, ak, jscode='', mode=2, timeout=20)

从高德地图获取等时线reachcricle

参数:
  • lon (float) – 起点经度(WGS84)

  • lat (float) – 起点纬度(WGS84)

  • reachtime (number) – 等时线到达时间

  • ak (str) – 高德地图访问令牌

  • jscode (jscode) – 高德安全码

  • mode (int or str) – 出行方式,应为0(公交)、1(地铁)、2(公交地铁)

  • timeout (number) – 取数据超时

返回:

isochrone – 等时线GeoDataFrame(WGS84)

返回类型:

GeoDataFrame

transbigdata.get_isochrone_mapbox(lon, lat, reachtime, access_token='auto', mode='driving', timeout=20)

从mapbox等时线获取等时线

参数:
  • lon (float) – 起点经度(WGS84)

  • lat (float) – 起点纬度(WGS84)

  • reachtime (number) – 等时线到达时间

  • access_token (str) – Mapbox access token,如果是`auto`它将使用预设的access token

  • mode (bool) – 出行方式,应该是`driving`, walking or cycling

  • timeout (number) – 取数据超时

返回:

isochrone – 等时线GeoDataFrame(WGS84)

返回类型:

GeoDataFrame

GIS处理

ckdnearest(dfA_origin, dfB_origin[, Aname, ...])

在dfB_origin中搜索最近的点以查找dfA_origin,并计算距离

ckdnearest_point(gdA, gdB)

此方法会将 gdfB 中最近的点与 gdfA 匹配,并添加一个名为 dist 的新列

ckdnearest_line(gdfA, gdfB)

此方法将从 gdfB 进行搜索,以找到离 gdfA 中点最近的线。

splitline_with_length(Centerline[, maxlength])

输入是线的GeoDataFrame。

merge_polygon(data, col)

输入的是多边形几何的GeoDataFrame,col名。

polyon_exterior(data[, minarea])

输入是多边形几何的GeoDataFrame。

近邻配料

transbigdata.ckdnearest(dfA_origin, dfB_origin, Aname=['lon', 'lat'], Bname=['lon', 'lat'])

在dfB_origin中搜索最近的点以查找dfA_origin,并计算距离

参数:
  • dfA_origin (DataFrame) – 数据帧A

  • dfB_origin (DataFrame) – 数据帧B

  • Aname (List) – DataFrame A中lng和lat的列

  • Bname (List) – DataFrame A中lng和lat的列

返回:

gdf – 输出数据帧

返回类型:

DataFrame

transbigdata.ckdnearest_point(gdA, gdB)

此方法会将 gdfB 中最近的点与 gdfA 匹配,并添加一个名为 dist 的新列

参数:
  • gdA (GeoDataFrame) – GeoDataFrame A,点几何

  • gdB (GeoDataFrame) – GeoDataFrame B,点几何

返回:

gdf – 输出数据帧

返回类型:

DataFrame

transbigdata.ckdnearest_line(gdfA, gdfB)

此方法将从 gdfB 进行搜索,以找到离 gdfA 中点最近的线。

参数:
  • gdA (GeoDataFrame) – GeoDataFrame A,点几何

  • gdB (GeoDataFrame) – GeoDataFrame B,线串几何

返回:

gdf – 在 gdfB 中的近线串中搜索 gdfA 中的点

返回类型:

DataFrame

下面的案例展示如何使用TransBigData数据包进入点与点、点与线的近邻匹配。该方法使用的是KDTree算法,可查看wiki:https://en.wikipedia.org /wiki/K-d_tree,

点对点匹配(DataFrame与DataFrame)


In [1]: import transbigdata as tbd

In [2]: import pandas as pd

In [3]: import geopandas as gpd

In [4]: from shapely.geometry import LineString

In [5]: dfA = gpd.GeoDataFrame([[1,2],[2,4],[2,6],
   ...:                         [2,10],[24,6],[21,6],
   ...:                         [22,6]],columns = ['lon1','lat1'])
   ...: 

In [6]: dfA
Out[6]: 
   lon1  lat1
0     1     2
1     2     4
2     2     6
3     2    10
4    24     6
5    21     6
6    22     6

In [7]: dfB = gpd.GeoDataFrame([[1,3],[2,5],[2,2]],columns = ['lon','lat'])

In [8]: dfB
Out[8]: 
   lon  lat
0    1    3
1    2    5
2    2    2
使用 :func:’transbigdata.ckdnearest’ 将点与点匹配,如果输入是两个没有几何列的数据帧,则应指定 ‘lon’ 和 ‘lat’ 列。
In [9]: tbd.ckdnearest(dfA,dfB,Aname=['lon1','lat1'],Bname=['lon','lat'])
Out[9]: 
   lon1  lat1  index  lon  lat          dist
0     1     2      0    1    3  1.111949e+05
1     2     4      1    2    5  1.111949e+05
2     2     6      1    2    5  1.111949e+05
3     2    10      1    2    5  5.559746e+05
4    24     6      1    2    5  2.437393e+06
5    21     6      1    2    5  2.105798e+06
6    22     6      1    2    5  2.216318e+06

点与点匹配(GeoDataFrame与GeoDataFrame)

将A表B表变为包含点信息的GeoDataFrame

In [10]: dfA['geometry'] = gpd.points_from_xy(dfA['lon1'],dfA['lat1'])

In [11]: dfA
Out[11]: 
   lon1  lat1                  geometry
0     1     2   POINT (1.00000 2.00000)
1     2     4   POINT (2.00000 4.00000)
2     2     6   POINT (2.00000 6.00000)
3     2    10  POINT (2.00000 10.00000)
4    24     6  POINT (24.00000 6.00000)
5    21     6  POINT (21.00000 6.00000)
6    22     6  POINT (22.00000 6.00000)

In [12]: dfB['geometry'] = gpd.points_from_xy(dfB['lon'],dfB['lat'])

In [13]: dfB
Out[13]: 
   lon  lat                 geometry
0    1    3  POINT (1.00000 3.00000)
1    2    5  POINT (2.00000 5.00000)
2    2    2  POINT (2.00000 2.00000)
使用:func:transbigdata.ckdnearest_point 进入点与点匹配
In [14]: tbd.ckdnearest_point(dfA,dfB)
Out[14]: 
   lon1  lat1                geometry_x  ...  lon  lat               geometry_y
0     1     2   POINT (1.00000 2.00000)  ...    1    3  POINT (1.00000 3.00000)
1     2     4   POINT (2.00000 4.00000)  ...    2    5  POINT (2.00000 5.00000)
2     2     6   POINT (2.00000 6.00000)  ...    2    5  POINT (2.00000 5.00000)
3     2    10  POINT (2.00000 10.00000)  ...    2    5  POINT (2.00000 5.00000)
4    24     6  POINT (24.00000 6.00000)  ...    2    5  POINT (2.00000 5.00000)
5    21     6  POINT (21.00000 6.00000)  ...    2    5  POINT (2.00000 5.00000)
6    22     6  POINT (22.00000 6.00000)  ...    2    5  POINT (2.00000 5.00000)

[7 rows x 8 columns]

点与线匹配(GeoDataFrame与GeoDataFrame)

将A表变为地理点,B表为线

In [15]: dfA['geometry'] = gpd.points_from_xy(dfA['lon1'],dfA['lat1'])

In [16]: dfB['geometry'] = [LineString([[1,1],[1.5,2.5],[3.2,4]]),
   ....:                    LineString([[1,0],[1.5,0],[4,0]]),
   ....:                     LineString([[1,-1],[1.5,-2],[4,-4]])]
   ....: 

In [17]: dfB
Out[17]: 
   lon  lat                                           geometry  index
0    1    3  LINESTRING (1.00000 1.00000, 1.50000 2.50000, ...      0
1    2    5  LINESTRING (1.00000 0.00000, 1.50000 0.00000, ...      1
2    2    2  LINESTRING (1.00000 -1.00000, 1.50000 -2.00000...      2

In [18]: tbd.ckdnearest_line(dfA,dfB)
Out[18]: 
   lon1  lat1  ... lat                                         geometry_y
0     1     2  ...   3  LINESTRING (1.00000 1.00000, 1.50000 2.50000, ...
1     2     4  ...   3  LINESTRING (1.00000 1.00000, 1.50000 2.50000, ...
2     2     6  ...   3  LINESTRING (1.00000 1.00000, 1.50000 2.50000, ...
3     2    10  ...   3  LINESTRING (1.00000 1.00000, 1.50000 2.50000, ...
4    21     6  ...   3  LINESTRING (1.00000 1.00000, 1.50000 2.50000, ...
5    22     6  ...   3  LINESTRING (1.00000 1.00000, 1.50000 2.50000, ...
6    24     6  ...   5  LINESTRING (1.00000 0.00000, 1.50000 0.00000, ...

[7 rows x 8 columns]

打断线

在现实应用中,我们可能需要把很长的线打断为很多子线段,每一条线段不要超过一定的最大长度,此时则可以使用TransBigData包中的splitline_with_length方法。

transbigdata.splitline_with_length(Centerline, maxlength=100)

输入是线串 GeoDataFrame。分割线的长度不长于最大长度

参数:
  • Centerline (GeoDataFrame) – 线串几何

  • maxlength (number) – 分割线的最大长度

返回:

splitedline – 分割线

返回类型:

GeoDataFrame

下面显示如何将线打断为100米一段的线段

#读取线要素
import geopandas as gpd
Centerline = gpd.read_file(r'test_lines.json')
Centerline.plot()
_images/output_2_1.png
#转换线为投影坐标系
Centerline.crs = {'init':'epsg:4326'}
Centerline = Centerline.to_crs(epsg = '4517')
#计算线的长度
Centerline['length'] = Centerline.length
Centerline
Id geometry length
0 0 LINESTRING (29554925.232 4882800.694, 29554987... 285.503444
1 0 LINESTRING (29554682.635 4882450.554, 29554773... 185.482276
2 0 LINESTRING (29554987.079 4882521.969, 29555040... 291.399180
3 0 LINESTRING (29554987.079 4882521.969, 29555073... 248.881529
4 0 LINESTRING (29554987.079 4882521.969, 29554969... 207.571197
5 0 LINESTRING (29554773.177 4882288.671, 29554828... 406.251357
6 0 LINESTRING (29554773.177 4882288.671, 29554926... 158.114403
7 0 LINESTRING (29555060.286 4882205.456, 29555082... 107.426629
8 0 LINESTRING (29555040.278 4882235.468, 29555060... 36.069941
9 0 LINESTRING (29555060.286 4882205.456, 29555095... 176.695446
#将线打断为最长100米的线段
import transbigdata as tbd
splitedline = tbd.splitline_with_length(Centerline,maxlength = 100)
#打断后线型不变
splitedline.plot()
_images/output_5_1.png
#但内容已经变成一段一段了
splitedline
geometry id length
0 LINESTRING (29554925.232 4882800.694, 29554927... 0 100.000000
1 LINESTRING (29554946.894 4882703.068, 29554949... 0 100.000000
2 LINESTRING (29554968.557 4882605.443, 29554970... 0 85.503444
0 LINESTRING (29554682.635 4882450.554, 29554688... 1 100.000000
1 LINESTRING (29554731.449 4882363.277, 29554736... 1 85.482276
0 LINESTRING (29554987.079 4882521.969, 29554989... 2 100.000000
1 LINESTRING (29555005.335 4882423.650, 29555007... 2 100.000000
2 LINESTRING (29555023.592 4882325.331, 29555025... 2 91.399180
0 LINESTRING (29554987.079 4882521.969, 29554993... 3 100.000000
1 LINESTRING (29555042.051 4882438.435, 29555048... 3 99.855617
2 LINESTRING (29555111.265 4882370.450, 29555116... 3 48.881529
0 LINESTRING (29554987.079 4882521.969, 29554985... 4 100.000000
1 LINESTRING (29554973.413 4882422.908, 29554971... 4 99.756943
2 LINESTRING (29554930.341 4882335.023, 29554929... 4 7.571197
0 LINESTRING (29554773.177 4882288.671, 29554777... 5 100.000000
1 LINESTRING (29554816.361 4882198.476, 29554821... 5 99.782969
2 LINESTRING (29554882.199 4882125.314, 29554891... 5 99.745378
3 LINESTRING (29554976.612 4882096.588, 29554987... 5 100.000000
4 LINESTRING (29555076.548 4882100.189, 29555077... 5 6.251357
0 LINESTRING (29554773.177 4882288.671, 29554783... 6 100.000000
1 LINESTRING (29554869.914 4882314.006, 29554876... 6 58.114403
0 LINESTRING (29555060.286 4882205.456, 29555062... 7 100.000000
1 LINESTRING (29555081.239 4882107.675, 29555081... 7 7.426629
0 LINESTRING (29555040.278 4882235.468, 29555042... 8 36.069941
0 LINESTRING (29555060.286 4882205.456, 29555064... 9 100.000000
1 LINESTRING (29555094.981 4882299.244, 29555100... 9 76.419694

多边形处理

transbigdata.merge_polygon(data, col)

输入是面几何的地理数据帧和列名称。此函数将根据上述列中的类别合并多边形

参数:
  • data (GeoDataFrame) – 多边形几何

  • col (str) – 表示类别的列名

返回:

data1 – 合并后的多边形

返回类型:

GeoDataFrame

transbigdata.polyon_exterior(data, minarea=0)

输入是面几何的地理数据帧。该方法将通过扩展 ploygon 的外部边界来构造新的多边形

参数:
  • data (GeoDataFrame) – 多边形几何

  • minarea (number) – 最小面积。

返回:

data1 – 处理后的多边形

返回类型:

GeoDataFrame

载入底图

plot_map(plt, bounds[, zoom, style, printlog])

绘制底图

plotscale(ax, bounds[, textcolor, textsize, ...])

为地图添加指南针和比例尺

set_mapboxtoken(mapboxtoken)

set_imgsavepath(imgsavepath)

设置地图保存路径

read_imgsavepath()

读取地图保存路径

read_mapboxtoken()

读取mapboxtoken

启动前设置

TransBigData 包提供了在 matplotlib 上绘制地图底图的功能。底图由地图框提供,坐标系为 WGS84。如果要使用此功能,首先需要在 This link 注册mapbox帐户。在mapbox注册为开发人员,并获取mapbox的access token。 This link 介绍了mapbox的access token的功能。

如果已经获取了 mapbox的access token,可以使用以下代码为 TransBigData 设置 mapbox的access token(只需要设置一次,以后重新打开 python 时不需要重新设置)

import transbigdata as tbd
#Set your mapboxtoken with the following code
tbd.set_mapboxtoken('pk.eyxxxxxxxxxx.xxxxxxxxx')
# The token you applied for must be set in it.
# Copying this line of code directly is invalid

此外,还需要设置地图底图的存储位置。下次显示相同位置时,将在本地读取和加载地图

# Set your map basemap storage path
# On linux or mac, the path is written like this.
# Note that there is a backslash at the end
tbd.set_imgsavepath(r'/Users/xxxx/xxxx/')

# On windows, the path is written like this.
# Finally, pay attention to two slashes to prevent escape
tbd.set_imgsavepath(r'E:\pythonscript\xxx\\')

设置完成后,下次绘制底图时,会在设置的路径下创建一个tileimg文件夹,并将所有底图放入其中。尝试以下代码,看看是否可以成功绘制底图

# Define display range
bounds = [113.6,22.4,114.8,22.9]
# Plot Frame
import matplotlib.pyplot as plt
fig =plt.figure(1,(8,8),dpi=250)
ax =plt.subplot(111)
plt.sca(ax)
# Add map basemap
tbd.plot_map(plt,bounds,zoom = 11,style = 4)
# Add scale bar and north arrow
tbd.plotscale(ax,bounds = bounds,textsize = 10,compasssize = 1,accuracy = 2000,rect = [0.06,0.03],zorder = 10)
plt.axis('off')
plt.xlim(bounds[0],bounds[2])
plt.ylim(bounds[1],bounds[3])
plt.show()
_images/output_6_0.png
transbigdata.plot_map(plt, bounds, zoom='auto', style=0, printlog=False)

绘制底图

参数:
  • plt (matplotlib.pyplot) – 在哪里绘制

  • bounds (List) – 底图的绘制边界 [lon1,lat1,lon2,lat2](WGS84 坐标系),其中 lon1 和 lat1 是左下角的坐标,lon2 和 lat2 是右上角的坐标

  • zoom (number) – 底图的放大倍率越大,加载时间越长。通常,单个城市的范围在 12 到 16 之间

  • printlog (bool) – 显示日志

  • style (number) – 地图底图的样式可以是1-10,如下

底图样式1:街道

_images/1.png

底图样式2:户外

_images/2.png

底图样式3:卫星

_images/3.png

底图样式4:浅色

_images/4.png

底图样式5:深色

_images/5.png

底图样式6:light-ch(中文)

_images/6.png

底图样式7:冰淇淋

_images/7.png

底图样式8:夜景

_images/8.png

底图样式9:地形

_images/9.png

底图样式 10:基础蓝

_images/10.png

底图样式 11:light(无标记)

_images/11.png

底图样式 12:深色(无标记)

_images/12.png

自定义样式

支持自定义mapbox样式

tbd.plot_map(plt,bounds,zoom = 11,style = 'mapbox://styles/ni1o1/cl38pljx0006r14qp7ioy7gcc')

指南针和刻度

transbigdata.plotscale(ax, bounds, textcolor='k', textsize=8, compasssize=1, accuracy='auto', rect=[0.1, 0.1], unit='KM', style=1, **kwargs)

为地图添加指南针和比例尺

参数:
  • bounds (List) – 底图的绘制边界 [lon1,lat1,lon2,lat2](WGS84 坐标系),其中 lon1 和 lat1 是左下角的坐标,lon2 和 lat2 是右上角的坐标

  • textsize (number) – 文本的大小

  • compasssize (number) – 指南针的大小

  • accuracy (number) – 比例尺长度(m)

  • unit (str) – ‘KM’,’km’,’M’,’m’, 刻度单位

  • style (number) – 1 或 2,比例的样式

  • rect (List) – 图中比例尺的大致位置,如[0.9,0.9],在右上角

tbd.plotscale(ax,bounds = bounds,textsize = 10,compasssize = 1,accuracy = 2000,rect = [0.06,0.03])

坐标和距离

gcj02tobd09(lng, lat)

将GCJ02坐标转换为BD09坐标

gcj02towgs84(lng, lat)

将GCJ02坐标转换为WGS84坐标

wgs84togcj02(lng, lat)

将坐标从WGS84转换为GCJ02

wgs84tobd09(lon, lat)

将坐标从WGS84转换为BD09

bd09togcj02(bd_lon, bd_lat)

将坐标从BD09转换为GCJ02

bd09towgs84(lon, lat)

将坐标从BD09转换为WGS84

bd09mctobd09(x, y)

将坐标从BD09MC转换为BD09

transform_shape(gdf, method)

转换所有数据的坐标。

getdistance(lon1, lat1, lon2, lat2)

从数据帧中按 [lon1, lat1, lon2, lat2] 的顺序输入起始/目标位置(十进制)。

坐标转换方式

TransBigData软件包提供GCJ02,BD09,BD09mc,WGS94等坐标的快速转换

transbigdata.gcj02tobd09(lng, lat)

将GCJ02坐标转换为BD09坐标

参数:
  • lng (Series or number) – 经度

  • lat (Series or number) – 纬度

返回:

  • lng (系列或数字) – 经度(转换后)

  • lat (Series or number) – 纬度(转换)

transbigdata.bd09togcj02(bd_lon, bd_lat)

将坐标从BD09转换为GCJ02

参数:
  • lng (Series or number) – 经度

  • lat (Series or number) – 纬度

返回:

  • lng (系列或数字) – 经度(转换后)

  • lat (Series or number) – 纬度(转换)

transbigdata.wgs84togcj02(lng, lat)

将坐标从WGS84转换为GCJ02

参数:
  • lng (Series or number) – 经度

  • lat (Series or number) – 纬度

返回:

  • lng (系列或数字) – 经度(转换后)

  • lat (Series or number) – 纬度(转换)

transbigdata.gcj02towgs84(lng, lat)

将GCJ02坐标转换为WGS84坐标

参数:
  • lng (Series or number) – 经度

  • lat (Series or number) – 纬度

返回:

  • lng (系列或数字) – 经度(转换后)

  • lat (Series or number) – 纬度(转换)

transbigdata.wgs84tobd09(lon, lat)

将坐标从WGS84转换为BD09

参数:
  • lng (Series or number) – 经度

  • lat (Series or number) – 纬度

返回:

  • lng (系列或数字) – 经度(转换后)

  • lat (Series or number) – 纬度(转换)

transbigdata.bd09towgs84(lon, lat)

将坐标从BD09转换为WGS84

参数:
  • lng (Series or number) – 经度

  • lat (Series or number) – 纬度

返回:

  • lng (系列或数字) – 经度(转换后)

  • lat (Series or number) – 纬度(转换)

transbigdata.bd09mctobd09(x, y)

将坐标从BD09MC转换为BD09

参数:
  • x (Series or number) – x坐标

  • y (Series or number) – y 坐标

返回:

  • lng (系列或数字) – 经度(转换后)

  • lat (Series or number) – 纬度(转换)

坐标倒数转换,基于numpy列计算:

>>> data['Lng'],data['Lat'] = tbd.wgs84tobd09(data['Lng'],data['Lat'])
>>> data['Lng'],data['Lat'] = tbd.wgs84togcj02(data['Lng'],data['Lat'])
>>> data['Lng'],data['Lat'] = tbd.gcj02tobd09(data['Lng'],data['Lat'])
>>> data['Lng'],data['Lat'] = tbd.gcj02towgs84(data['Lng'],data['Lat'])
>>> data['Lng'],data['Lat'] = tbd.bd09togcj02(data['Lng'],data['Lat'])
>>> data['Lng'],data['Lat'] = tbd.bd09towgs84(data['Lng'],data['Lat'])
>>> data['Lng'],data['Lat'] = tbd.bd09mctobd09(data['Lng'],data['Lat'])

转换地理元素的坐标

transbigdata.transform_shape(gdf, method)

转换所有数据的坐标。输入是地理元素的数据帧。

参数:
  • gdf (GeoDataFrame) – 地理要素

  • method (function) – 坐标转换函数

返回:

gdf – 转换后的结果

返回类型:

GeoDataFrame

测距

transbigdata.getdistance(lon1, lat1, lon2, lat2)

从数据帧中按 [lon1, lat1, lon2, lat2] 的顺序输入起始/目标位置(十进制)。输出是距离 (m)。

参数:
  • lon1 (Series or number) – 起始经度

  • lat1 (Series or number) – 起始纬度

  • lon2 (Series or number) – 结束经度

  • lat2 (Series or number) – 结束纬度

返回:

distance – 距离

返回类型:

Series or number

数据可视化

visualization_data(data[, col, accuracy, ...])

输入是数据点,此函数将聚合然后可视化

visualization_trip(trajdata[, col, zoom, height])

输入的是轨迹数据和列名。

visualization_od(oddata[, col, zoom, ...])

输入是OD数据和列。

在jupyter中显示可视化的设置

TransBigData包也依托于 kepler.gl 提供的可视化插件提供了一键数据整理与可视化的方法
使用此功能请先安装python的keplergl包
pip install keplergl

如果要在jupyter notebook中显示可视化,则需要勾选jupyter-js-widgets(可能需要另外安装)和keplergl-jupyter两个插件

_images/jupytersettings.png

数据点分布可视化

transbigdata.visualization_data(data, col=['lon', 'lat'], accuracy=500, height=500, maptype='point', zoom='auto')

输入是数据点,此函数将聚合然后可视化

参数:
  • data (DataFrame) – 数据点

  • col (List) – 列名。用户可以按[经度,纬度]的顺序选择非权重的起点-目的地(OD)数据。为此,聚合是自动的。或者,用户也可以输入加权OD数据,按[经度、纬度、计数]的顺序排列。

  • zoom (number) – 地图缩放级别(可选)。

  • height (number) – 地图框的高度

  • accuracy (number) – 栅格大小

  • maptype (str) – 地图类型,‘点’或‘热图’

返回:

vmap – keplergl 提供的可视化

返回类型:

keplergl.keplergl.KeplerGl

轨道可视化

transbigdata.visualization_trip(trajdata, col=['Lng', 'Lat', 'ID', 'Time'], zoom='auto', height=500)

输入是轨迹数据和列名称。输出是基于开普勒的可视化结果

参数:
  • trajdata (DataFrame) – 轨迹点数据

  • col (List) – 列名称,按 [经度、纬度、车辆 ID、时间] 的顺序排列

  • zoom (number) – 地图缩放级别

  • height (number) – 地图框的高度

返回:

vmap – keplergl 提供的可视化

返回类型:

keplergl.keplergl.KeplerGl

OD可视化

transbigdata.visualization_od(oddata, col=['slon', 'slat', 'elon', 'elat'], zoom='auto', height=500, accuracy=500, mincount=0)

输入是 OD 数据和列。输出是基于开普勒的可视化结果

参数:
  • oddata (DataFrame) – 外径数据

  • col (List) – 列名。用户可以按[原点经度、原点纬度、目的地经度、目的地纬度]的顺序选择非权重的起点-目的地(OD)数据。为此,聚合是自动的。或者,用户也可以输入加权OD数据,按[原点经度、原点纬度、目的地经度、目的地纬度、计数]的顺序排列。

  • zoom (number) – 地图缩放级别(可选)。

  • height (number) – 地图框的高度

  • accuracy (number) – 栅格大小

  • mincount (number) – 最小OD数,OD数少的不显示

返回:

vmap – keplergl 提供的可视化

返回类型:

keplergl.keplergl.KeplerGl

活动分析

plot_activity(data[, col, figsize, dpi, ...])

绘制个体的活动图

entropy(sequence)

计算熵。

entropy_rate(sequence)

计算熵率。

ellipse_params(data[, col, confidence, epsg])

点数据的置信椭圆参数估计

ellipse_plot(ellip_params, ax, **kwargs)

输入置信度椭圆的参数并绘制置信度椭圆

活动图

transbigdata.plot_activity(data, col=['stime', 'etime', 'group'], figsize=(10, 5), dpi=250, shuffle=True, xticks_rotation=0, xticks_gap=1, yticks_gap=1, fontsize=12)

绘制个体的活动图

参数:
  • data (DataFrame) – 一个人的活动信息

  • col (List) – 列名[starttime,endtime,group],`group`控制颜色分组

  • figsize (List) – 体形尺寸

  • dpi (Number) – 图形的dpi

  • shuffle (bool) – 是否将活动顺序随机打乱

  • xticks_rotation (Number) – xticks的旋转角度

  • xticks_gap (Number) – xticks 的间隙

  • yticks_gap (Number) – yticks 的间隙

  • fontsize (Number) – xticks 和 yticks 的字体大小

transbigdata.entropy(sequence)

计算熵。

参数:

sequence (List,DataFrame,Series) – 序列数据

返回:

返回类型:

Number

transbigdata.entropy_rate(sequence)

计算熵率。参考文献:Goulet-Langlois, G., Koutsopoulos, H. N., Zhao, Z., & Zhao, J. (2017). Measuring regularity of individual travel patterns. IEEE Transactions on Intelligent Transportation Systems, 19(5), 1583-1592.

参数:

sequence (List,DataFrame,Series) – 序列数据

返回:

熵率

返回类型:

Number

置信椭圆

transbigdata.ellipse_params(data, col=['lon', 'lat'], confidence=95, epsg=None)

点数据的置信椭圆参数估计

参数:
  • data (DataFrame) – 点数据

  • confidence (number) – 置信度:99,95 或 90

  • epsg (number) – 如果给定,原始坐标将从 WGS84 转换为给定的 EPSG 坐标系,以进行置信椭圆参数估计

  • col (List) – 列名,[lon,lat]

返回:

参数 – 质心椭圆参数[位置,宽度,高度,θ,面积,扁率] 分别[中心点坐标,短轴,长轴,角度,面积,扁率]

返回类型:

List

transbigdata.ellipse_plot(ellip_params, ax, **kwargs)

输入置信度椭圆的参数并绘制置信度椭圆

参数:
  • ellip_params (List) – 质心椭圆参数[位置、宽度、高度、θ、面积、扁率] 分别[中心点坐标、短轴、长轴、角度、面积、扁率]

  • ax (matplotlib.axes._subplots.AxesSubplot) – 在哪里绘制

用法

import pandas as pd
import transbigdata as tbd
import numpy as np
#生成测试用数据
data = np.random.uniform(1,10,(100,2))
data[:,1:] = 0.5*data[:,0:1]+np.random.uniform(-2,2,(100,1))
data = pd.DataFrame(data,columns = ['x','y'])

#绘制数据分布
import matplotlib.pyplot as plt
plt.figure(1,(5,5))
#绘制数据点
plt.scatter(data['x'],data['y'],s = 0.5)
#绘制坐标轴
plt.plot([-10,10],[0,0],c = 'k')
plt.plot([0,0],[-10,10],c = 'k')
plt.xlim(-15,15)
plt.ylim(-15,15)
plt.show()
_images/output_1_0.png

输入数据与xy坐标所在列名,置信度,估计椭圆参数 分别代表[中心点坐标,短轴,长轴,角度,面积,扁率

ellip_params = tbd.ellipse_params(data,confidence=95,col = ['x','y'])
ellip_params
[array([5.78928146, 2.88466235]),
 4.6981983145616875,
 14.04315715927693,
 -58.15524535916836,
 51.8186366184246,
 0.6654457212665993]

再用tbd.ellipse_plot绘制置信椭圆

#绘制数据分布
import matplotlib.pyplot as plt
plt.figure(1,(5,5))
ax = plt.subplot(111)
#绘制数据点
plt.scatter(data['x'],data['y'],s = 0.5)
#获取置信椭圆参数并绘制椭圆
#99%置信椭圆
ellip_params = tbd.ellipse_params(data,confidence=99,col = ['x','y'])
tbd.ellipse_plot(ellip_params,ax,fill = False,edgecolor = 'r',linewidth = 1)
#95%置信椭圆
ellip_params = tbd.ellipse_params(data,confidence=95,col = ['x','y'])
tbd.ellipse_plot(ellip_params,ax,fill = False,edgecolor = 'b',linewidth = 1)
#90%置信椭圆
ellip_params = tbd.ellipse_params(data,confidence=90,col = ['x','y'])
tbd.ellipse_plot(ellip_params,ax,fill = False,edgecolor = 'k',linewidth = 1)
#绘制坐标轴
plt.plot([-10,10],[0,0],c = 'k')
plt.plot([0,0],[-10,10],c = 'k')
plt.xlim(-15,15)
plt.ylim(-15,15)
plt.show()
_images/output_3_0.png

数据聚合

dataagg(data, shape[, col, accuracy])

聚合数据到交通区域

odagg_grid(oddata, params[, col, arrow])

聚合OD矩阵并生成网格几何。

odagg_shape(oddata, shape[, col, params, ...])

生成OD聚合结果和对应的几何图形。

transbigdata.dataagg(data, shape, col=['Lng', 'Lat', 'count'], accuracy=500)

聚合数据到交通区域

参数:
  • data (DataFrame) – 起源DataFrame

  • shape (GeoDataFrame) – 交通区形状

  • col (List) – 您可以选择输入两列,即 [‘Lng’、’Lat’],也可以选择输入三列,即 [‘Lng’、’Lat’、’count’]“,其中 count 表示点数

  • accuracy (number) – 这个想法是首先实现数据网格化,然后实现聚合。在这里,将确定网格大小。尺寸越小,精度就越高。

返回:

  • aggresultGeoDataFrame) – 流量区域。计数列是输出结果

  • data1 (DataFrame) – 区域匹配数据

transbigdata.odagg_grid(oddata, params, col=['slon', 'slat', 'elon', 'elat'], arrow=False, **kwargs)

聚合 OD 矩阵并生成格网几何。输入是 OD 矩阵(每行代表一个行程)。OD 将分配给格网,然后以地理数据帧的形式进行聚合。

参数:
  • oddata (DataFrame) – 外径数据

  • col (List) – 起点/终点位置的列,[‘slon’, ‘slat’, ‘elon’, ‘elat’]。每列的默认权重为 1。您还可以添加权重参数,例如 [‘slon’, ‘slat’, ‘elon’, ‘elat’, ‘count’]。

  • params (List) – 网格参数(lonStart,latStart,deltaLon,deltaLat),lonStart和latStart是左下角的坐标,deltaLon,deltaLat是单个网格的长度和宽度

  • arrow (bool) – 生成的OD地理线是否包含箭头

返回:

oddata1 – 聚合后OD的GeoDataFrame

返回类型:

GeoDataFrame

transbigdata.odagg_shape(oddata, shape, col=['slon', 'slat', 'elon', 'elat'], params=None, round_accuracy=6, arrow=False, **kwargs)

生成 OD 聚合结果和相应的几何图形。输入是 OD 数据(每行代表一个行程)。OD 将分配给格网,然后以地理数据帧的形式进行聚合。

参数:
  • oddata (DataFrame) – 外径数据

  • shape (GeoDataFrame) – 目标交通区域的GeoDataFrame

  • col (List) – 起点/终点位置的列,[‘slon’, ‘slat’, ‘elon’ , ‘elat’]。每列的默认权重为 1。您还可以添加权重参数,例如 [‘slon’、’slat’、’elon’、’elat’、’count’]。

  • params (List (optional)) – 网格参数(lonStart,latStart,deltaLon,deltaLat),lonStart和latStart是左下角的坐标,deltaLon,deltaLat是单个网格的长度和宽度如果可用,数据网格化后,将根据网格中心匹配流量区域。如果不可用,则将根据经度和纬度处理匹配。当数据项数量较大时,由于数据网格化,匹配效率将大大提高。

  • round_accuracy (number) – 实现聚合时纬度和经度的小数位数

  • arrow (bool) – 生成的OD地理线是否包含箭头

返回:

oddata1 – 聚合后OD的GeoDataFrame

返回类型:

GeoDataFrame

其他

dumpjson(data, path)

输入json数据,保存为文件。

transbigdata.dumpjson(data, path)

输入 json 数据并将其另存为文件。此方法适用于解决 numpy 无法与 json 包兼容的问题。

参数:
  • data (json) – 需要保存的json数据

  • path (str) – 存储路径

特定数据处理方法

手机数据处理

mobile_stay_duration(staydata[, col, ...])

输入停留点数据以识别夜间和白天的持续时间。

mobile_identify_home(staydata[, col, ...])

通过手机停留数据识别居住地位置。

mobile_identify_work(staydata[, col, ...])

通过手机停留数据识别工作地点。

transbigdata.mobile_stay_duration(staydata, col=['stime', 'etime'], start_hour=8, end_hour=20)

输入停留点数据以识别夜间和白天的持续时间。

参数:
  • staydata (DataFrame) – 停留数据

  • col (List) – 列名,顺序为[‘starttime’,’endtime’]

  • start_hour (Number) – 一天中的开始时间

  • end_hour (Number) – 一天时间的结束时间

返回:

  • duration_night (Series) – 夜间持续时间

  • duration_day (Series) – 白天的持续时间

transbigdata.mobile_identify_home(staydata, col=['uid', 'stime', 'etime', 'LONCOL', 'LATCOL'], start_hour=8, end_hour=20)

从手机停留数据中识别居住地位置。规则是确定夜间持续时间最长的位置。

参数:
  • staydata (DataFrame) – 停留数据

  • col (List) – 列名,按 [‘uid’, ‘stime’, ‘etime’, ‘locationtag1’, ‘locationtag2’, …] 的顺序排列。可以有多个“位置标签”列来指定位置。

  • start_hour (Number) – 一天时间的开始时间和结束时间

  • end_hour (Number) – 一天时间的开始时间和结束时间

返回:

home – 手机用户的家位置

返回类型:

DataFrame

transbigdata.mobile_identify_work(staydata, col=['uid', 'stime', 'etime', 'LONCOL', 'LATCOL'], minhour=3, start_hour=8, end_hour=20, workdaystart=0, workdayend=4)

从手机停留数据中识别工作地点。规则是确定工作日白天持续时间最长的位置(平均持续时间应超过“minhour”)。

参数:
  • staydata (DataFrame) – 停留数据

  • col (List) – 列名,按 [‘uid’、stime’、’etime’、’locationtag1’、’locationtag2’, …] 的顺序排列。可以有多个“locationtag”列来指定位置。

  • minhour (Number) – 工作日的最短持续时间(小时)。

  • workdaystart (Number) – 一周中工作日的开始和结束。

  • workdayend (Number) – 一周中工作日的开始和结束。

  • start_hour (Number) – 一天时间的开始时间和结束时间

  • end_hour (Number) – 一天时间的开始时间和结束时间

返回:

work – 手机用户的工作地

返回类型:

DataFrame

出租汽车GPS数据处理

clean_taxi_status(data[, col, timelimit])

从出租车数据中删除乘客携带状态的瞬时变化记录。

taxigps_to_od(data[, col])

输入出租车GPS数据,提取OD信息

taxigps_traj_point(data, oddata[, col])

输入出租车数据和OD数据,提取配送和闲置行程的轨迹点

transbigdata.clean_taxi_status(data, col=['VehicleNum', 'Time', 'OpenStatus'], timelimit=None)

从出租车数据中删除乘客携带状态的瞬时变化记录。这些异常记录会影响旅行订单判断。判断方法:如果同一车辆上一条记录和下一条记录的乘客状态与该记录不同,则应删除该记录。

参数:
  • data (DataFrame) – 数据

  • col (List) – 列名,顺序为[‘VehicleNum’, ‘Time’, ‘OpenStatus’]

  • timelimit (number) – 可选,以秒为单位。如果上一条记录和下一条记录之间的时间小于时间阈值,则将删除该记录

返回:

data1 – 清理后的数据

返回类型:

DataFrame

transbigdata.taxigps_to_od(data, col=['VehicleNum', 'Stime', 'Lng', 'Lat', 'OpenStatus'])

输入出租车GPS数据,提取OD信息

参数:
  • data (DataFrame) – 出租车GPS数据

  • col (List) – 列名在数据中,需要按顺序排列[车辆ID、时间、经度、纬度、乘客状态]

返回:

oddata – OD信息

返回类型:

DataFrame

transbigdata.taxigps_traj_point(data, oddata, col=['Vehicleid', 'Time', 'Lng', 'Lat', 'OpenStatus'])

输入出租车数据和OD数据,提取配送和闲置行程的轨迹点

参数:
  • data (DataFrame) – 出租车GPS数据,col变量指定的字段名

  • oddata (DataFrame) – 出租车OD数据

  • col (List) – 栏目名称,需按顺序排列[车辆ID、时间、经度、纬度、旅客状态]

返回:

  • data_deliver (DataFrame) – 送货行程的轨迹点

  • data_idle (DataFrame) – 空闲行程的轨迹点

共享单车数据处理

bikedata_to_od(data[, col, startend])

输入共享单车订单数据(仅在锁打开和关闭时生成数据),指定列名称,并从中提取乘车和停车信息

transbigdata.bikedata_to_od(data, col=['BIKE_ID', 'DATA_TIME', 'LONGITUDE', 'LATITUDE', 'LOCK_STATUS'], startend=None)

输入共享单车订单数据(仅在锁打开和关闭时生成数据),指定列名称,并从中提取乘车和停车信息

参数:
  • data (DataFrame) – 共享单车订单数据

  • col (List) – 列名,顺序不能更改。[“BIKE_ID”、“DATA_TIME”、“经度”、“纬度”、“LOCK_STATUS]

  • startend (List) – 观察周期的开始时间和结束时间,例如 [‘2018-08-27 00:00:00’、’2018-08-28 00:00:00’]。如果通过,则考虑骑行和停车情况(从观察期开始到自行车首次出现)和(从自行车最后一次出现到观察期结束)。

返回:

  • move_data (DataFrame) – 骑行数据

  • stop_data (DataFrame) – 停车数据

公交GPS数据处理

busgps_arriveinfo(data, line, stop[, col, ...])

输入公交GPS数据、公交线路和车站GeoDataFrame,该方法可以识别公交车的到达和出发信息

busgps_onewaytime(arrive_info, start, end[, col])

输入出发信息表drive_info和车站信息表停靠点计算单程行车时间

transbigdata.busgps_arriveinfo(data, line, stop, col=['VehicleId', 'GPSDateTime', 'lon', 'lat', 'stopname'], stopbuffer=200, mintime=300, disgap=200, project_epsg='auto', timegap=1800, projectoutput=False)

输入公交GPS数据、公交线路和车站GeoDataFrame,该方法可以识别公交车的到达和出发信息

参数:
  • data (DataFrame) – 总线全球定位系统数据。它应该是来自一条公交路线的数据,并且需要包含车辆ID,GPS时间,纬度和经度(wgs84)

  • line (GeoDataFrame) – 公交线路的GeoDataFrame

  • stop (GeoDataFrame) – 公交车站的GeoDataFrame

  • col (List) – 列名称,按 [车辆 ID、时间、经度、纬度、车站名称] 的顺序排列

  • stopbuffer (number) – 米。当车辆在此一定距离内接近车站时,视为到达车站。

  • mintime (number) – 秒。在短时间内,巴士再次到达公交车站,将不被视为再次到达

  • disgap (number) – 米。车辆前点和后点之间的距离,用于确定车辆是否在移动

  • project_epsg (number) – 匹配算法将数据转换为投影坐标系来计算距离,这里给出投影坐标系的epsg代码

  • timegap (number) – 秒。车辆没有出现多长时间,它将被视为新车

  • projectoutput (bool) – 是否输出投影数据

返回:

arrive_info – 公交到发信息

返回类型:

DataFrame

transbigdata.busgps_onewaytime(arrive_info, start, end, col=['VehicleId', 'stopname', 'arrivetime', 'leavetime'])

输入出发信息表drive_info和车站信息表停靠点计算单程行车时间

参数:
  • arrive_info (DataFrame) – 发车信息表drive_info

  • start (Str) – 起始站名

  • end (Str) – 终点站名

  • col (List) – 列名[车号,站名,到达时间,离开时间]

返回:

onewaytime – 公交车单程时间

返回类型:

DataFrame

公交地铁网络拓扑建模

方法总览

metro_network(line, stop[, transfertime, ...])

输入地铁站数据并输出网络拓扑模型。

get_shortest_path(G, stop, ostation, dstation)

获取下一个地铁最短路径的出行路径

get_k_shortest_paths(G, stop, ostation, ...)

获取距离地铁nextwork的第k条最短路径

get_path_traveltime(G, path)

获取路径的行程时间

split_subwayline(line, stop)

将地铁线路与地铁站进行切片以获取地铁部分信息(此步骤在地铁客流可视化中很有用)

transbigdata.metro_network(line, stop, transfertime=5, nxgraph=True)

输入地铁站数据并输出网络拓扑模型。生成的图形依赖于 NetworkX。行程时间包括:车站之间的运营时间+各车站的停靠时间+换乘时间

参数:
  • line (GeoDataFrame) – 线。应该有“线路”列来存储线路名称“速度”列来存储地铁速度,“停止时间”列来存储每个车站的停靠时间。

  • stop (GeoDataFrame) – 巴士/地铁站

  • transfertime (number) – 每次换乘所需时间

  • nxgraph (bool) – 默认值为 True,如果为 True,则输出 NetworkX 构造的网络 G,如果为 False,则输出 edges1(线段)、edge2(站换乘)和网络节点

返回:

当 nxgraph 参数为 True 时:**G**(networkx.classes.graph.Graph)— networkx 中构建的图 。 当 nxgraph 参数为 False 时:**edge1**(DataFrame) — 线段的网络边。**edge2**(DataFrame) — 用于传输的网络边缘。**node**(List) — 网络节点。

transbigdata.get_shortest_path(G, stop, ostation, dstation)

获取下一个地铁最短路径的出行路径

参数:
  • G (networkx.classes.graph.Graph) – 地铁网络

  • stop (DataFrame) – 地铁站数据框

  • ostation (str) – O站名

  • dstation (str) – D站名

返回:

path – 旅行路径:站名列表

返回类型:

list

transbigdata.get_k_shortest_paths(G, stop, ostation, dstation, k)

获取距离地铁nextwork的第k条最短路径

参数:
  • G (networkx.classes.graph.Graph) – 地铁网络

  • stop (DataFrame) – 地铁站数据框

  • ostation (str) – O站名

  • dstation (str) – D站名

  • k (int) – 第k条最短路径

返回:

paths – 旅行路径:旅行路径列表

返回类型:

list

transbigdata.get_path_traveltime(G, path)

获取路径的行程时间

参数:
  • G (networkx.classes.graph.Graph) – 地铁网络

  • path (list) – 站名列表

返回:

traveltime – 路径的旅行时间

返回类型:

float

transbigdata.split_subwayline(line, stop)

将地铁线路与地铁站进行切片以获取地铁部分信息(此步骤在地铁客流可视化中很有用)

参数:
  • line (GeoDataFrame) – 公交/地铁线路

  • stop (GeoDataFrame) – 巴士/地铁站

返回:

metro_line_splited – 生成的剖面线形状

返回类型:

GeoDataFrame