geolife笔记:整理处理单条轨迹

2023-12-08 18:04

本文主要是介绍geolife笔记:整理处理单条轨迹,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以 数据集笔记 geolife (操作篇)_geolife数据集-CSDN博客 轨迹为例

1 读取数据

import pandas as pd
data = pd.read_csv('Geolife Trajectories 1.3/Data//000/Trajectory/20081023025304.plt',header=None, skiprows=6,names=['Latitude', 'Longitude', 'Not_Important1', 'Altitude', 'Not_Important2', 'Date', 'Time'])
data=data[['Latitude', 'Longitude', 'Altitude', 'Date', 'Time']]
data

2 Date和Time 合并

data['Datetime'] = pd.to_datetime(data['Date'] + ' ' + data['Time'])
# to_datetime将这一列转换成时间
data=data[['Latitude', 'Longitude', 'Altitude', 'Datetime']]
data

3 只保留在北京城区的数据点

3.1 定义经纬度最值

import folium
BEIJING = [39.9, 116.41]                                                    
# central beijing coords, for map centres
B1 = 39.8,116.2                                          
# bbox limits for beijing extent
B2 =  40.0 ,116.5
m=folium.Map(location=BEIJING,start_zoom=14)
folium.Marker(B1).add_to(m)
folium.Marker(B2).add_to(m)
m

 3.2 进行地理位置筛选

data=data[(data['Latitude']>B1[0]) & (data['Latitude']<B2[0]) & (data['Longitude']>B1[1]) & (data['Longitude']<B2[1])] 
data

3.3 将time gap修改至5秒,保留每个5秒记录的第一条

data['Datetime_5s']=data['Datetime'].dt.floor('5s')
data

data=data.drop_duplicates(subset=['Datetime_5s'],keep='first')
data

4 去除停止点

data['is_moving'] = (data['Latitude'] != data['Latitude'].shift()) | (data['Longitude'] != data['Longitude'].shift())
#判断用户有没有移动:当前位置和上一位置是否相同data

data=data[data['is_moving']==True]
data=data[['Latitude','Longitude','Datetime_5s']]
data

 

5 将10分钟内没有记录的轨迹切分成两条轨迹

5.1 计算 time gap

data['time_diff']=data['Datetime_5s'].diff()
data

5.2 切分轨迹

data['split_id']=0
#split_id 将表示这是当前id 切分的第几段
data

mask=data['time_diff']>pd.Timedelta(minutes=10)
# 时间间隔大于10分钟的位置,记录一下
data.loc[mask,'split_id']=1
#这些位置的split_id记为1
data

data['split_id']=data['split_id'].cumsum()
#出现过1的位置,到下一次出现1之前,split_id是一样的——比前一段多1
data

5.3 得到id

num=0
data['id']=str(num)
data

data['id']=data['id']+'_'+data['split_id'].astype(str)
data

6 计算每一条轨迹的长度,筛选短的,截断长的

6.1 计算相邻位置的经纬度差距 

lat_lon_diff = data.groupby('id',group_keys=False).apply(lambda group: group[['Latitude', 'Longitude']].diff())lat_lon_diff

6.2 计算haversine距离的函数

def haversine_distance(lat1, lon1, lat2, lon2):R = 6371  # Earth radius in kilometersdlat = np.radians(lat2 - lat1)dlon = np.radians(lon2 - lon1)a = np.sin(dlat/2) * np.sin(dlat/2) + np.cos(np.radians(lat1)) * np.cos(np.radians(lat2)) * np.sin(dlon/2) * np.sin(dlon/2)c = 2 * np.arctan2(np.sqrt(a), np.sqrt(1-a))return R * c

6.3 计算同一轨迹相邻位置的距离

import numpy as npdistance = lat_lon_diff.apply(lambda row: haversine_distance(row['Latitude'], row['Longitude'], 0, 0), axis=1)
data['distance']=distance
data

 6.4 计算同一id的累积距离

data['accum_dis']=data.groupby('id')['distance'].cumsum()data

6.5 得到每一个id的轨迹距离

iid=data.groupby('id')['accum_dis'].max()iid=iid.reset_index(name='dis')
iid

6.6 筛选长度大于1km的

iid=iid[iid['dis']>=1]
data=data[data['id'].isin(iid['id'])]
data

6.7 将长度长于10km的轨迹拆分成两条,并去掉拆分后长度小于1km的

data['split_traj_id']=data['accum_dis']//10
data['split_traj_id']=data['split_traj_id'].fillna(0)
data['split_traj_id']=data['split_traj_id'].astype(int).astype(str)
data

data['id']=data['id']+'_'+data['split_traj_id']
data

去除切分后长度小于1km的:

iid=data.groupby('id')['accum_dis'].max()
iid=iid.reset_index(name='distance')
iid

 

iid=iid[iid['distance']>1]
data=data[data['id'].isin(iid['id'])]
data

7 剔除记录数量小于10条的轨迹

iid=data.groupby('id').size()
iid=iid.reset_index(name='count')
iid=iid[iid['count']>=10]
iid

data=data[data['id'].isin(iid['id'])]

8 去除“staypoint”

这里的staypoint 意为 最值经纬度对应的距离小于1km

latlon=pd.DataFrame()
latlon['max_lat']=data.groupby('id')['Latitude'].max()
latlon['min_lat']=data.groupby('id')['Latitude'].min()
latlon['max_lon']=data.groupby('id')['Longitude'].max()
latlon['min_lon']=data.groupby('id')['Longitude'].min()
latlon['max_dis']=latlon.apply(lambda row: haversine_distance(row['max_lat'],row['max_lon'],row['min_lat'],row['min_lon']),axis=1)latlon=latlon[latlon['max_dis']>=1]
latlon

data=data[data['id'].isin(latlon.index)]
data

这篇关于geolife笔记:整理处理单条轨迹的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/470828

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit