julia 笔记/论文辅助笔记:T2vec 轨迹处理

deepgtt/harbin/julia/Trip.jl at master · boathit/deepgtt (github.com)

1 导入和声明

using HDF5, CSV, DataFrames, Dates, Sockets
# 引入几个模块,这些模块用于文件操作、数据处理、日期处理、网络操作等功能。using Distances: euclidean
# 从Distances模块中引入euclidean函数,用于计算欧几里得距离using StatsBase:rle
# 从StatsBase模块中引入rle函数,该函数用于计算连续出现的相同元素的长度。import JSON
# 从StatsBase模块中引入rle函数,该函数用于计算连续出现的相同元素的长度。include("util.jl")mutable struct Trip{T<:AbstractFloat}lon::Vector{T}lat::Vector{T}tms::Vector{T}devidroads
end
# 定义一个可变结构体Trip,它有五个字段:经度、纬度、时间、设备ID和道路。# 为Trip结构体定义两个构造函数,方便创建Trip对象。
Trip(lon, lat, tms) = Trip(lon, lat, tms, 0, nothing)
# 当只有经度、纬度和时间时,设备ID默认为0,道路为nothing。Trip(lon, lat, tms, devid) = Trip(lon, lat, tms, devid, nothing)
# 当有经度、纬度、时间和设备ID时,道路为nothing。function Base.show(io::IO, t::Trip)print(io, "Trip: $(length(t.lon)) points")
end
# 重载Base.show函数,用于打印Trip对象时的输出格式。
# 输出形式为:“Trip: x points”,其中x为经度向量的长度。Base.length(t::Trip) = length(t.lon)
# 重载Base.length函数,用于返回Trip对象的经度向量的长度。Base.reverse(trip::Trip) = Trip(reverse(trip.lon), reverse(trip.lat), trip.tms)
# 重载Base.reverse函数,用于反转Trip对象的经度和纬度向量。

2 readtripsh5函数

function readtripsh5(tripfile::String)"""从一个hdf5文件中读取旅行数据(Trip)"""trips = Trip[]# 初始化一个空的Trip类型数组,用于存储从文件中读取的所有Trip对象。h5open(tripfile, "r") do f# 使用h5open函数打开hdf5文件,"r"参数表示以只读模式打开。# do f语法是一种与资源(如文件)相关的操作,它确保资源在使用后被正确关闭。ntrips = read(f["/meta/ntrips"])# 从文件的"/meta/ntrips"路径读取旅行的数量。for i = 1:ntrips# 对每一个旅行进行处理lon = read(f["/trip/$i/lon"])lat = read(f["/trip/$i/lat"])tms = read(f["/trip/$i/tms"])# 从文件中读取第i个旅行的经度、纬度和时间数据。trip = Trip(lon, lat, tms)# 使用读取的数据创建一个新的Trip对象。push!(trips, trip)# 将新创建的Trip对象添加到trips数组中#i >= 10000 && breakendendtrips# 返回从文件中读取的所有Trip对象的数组。
end

 3 readtripcsv函数

function readtripscsv(tripfile::String, header=nothing)"""从一个CSV文件中读取旅行数据(Trip)"""df = CSV.File(tripfile, header=header) |> DataFrame# 使用CSV.File函数读取CSV文件,并将其转化为DataFrame格式。# 如果header没有指定,则默认CSV文件必须包含列[:devid, :tripid, :tms, :lon, :lat]。hasdevid = :devid in names(df)# 检查DataFrame中是否包含名为:devid的列。trips = Trip[]# 初始化一个空的Trip类型数组,用于存储从文件中读取的所有Trip对象。for sdf in groupby(df, :tripid)# 对每一个唯一的tripid进行循环处理。sdf = DataFrame(sdf)# 将sdf转化为DataFrame格式。sort!(sdf, :tms)# 根据tms列对sdf进行排序。lon = convert(Array{Float64}, sdf.lon)lat = convert(Array{Float64}, sdf.lat)tms = convert(Array{Float64}, sdf.tms)# 从sdf中提取lon, lat, tms列,并将其转化为Float64类型的数组。devid = hasdevid ? first(sdf.devid) : nothing# 如果DataFrame中包含:devid列,则获取第一个devid值,否则将devid设置为nothing。trip = Trip(lon, lat, tms, devid)# 使用提取的数据创建一个新的Trip对象。push!(trips, trip)# 将新创建的Trip对象添加到trips数组中。endtrips# 返回从文件中读取的所有Trip对象的数组。
end

4 pathdistance 函数

function pathdistance(trip::Trip)"""计算给定Trip对象在路网中的距离(以公里为单位)"""s = 0.0for i = 2:length(trip)# 对Trip对象中的每一个点进行循环处理,从第2个点开始。px, py = gps2webmercator(trip.lon[i-1], trip.lat[i-1])# 使用gps2webmercator函数将第i-1个点的经纬度转化为Web墨卡托坐标。cx, cy = gps2webmercator(trip.lon[i], trip.lat[i])# 使用gps2webmercator函数将第i个点的经纬度转化为Web墨卡托坐标。s += euclidean([px, py], [cx, cy])# 使用euclidean函数计算两点之间的欧几里得距离,并累加到s中。ends / 1000.0# 将总距离s转化为公里单位并返回。
end

5 isvalidtrip 函数

function isvalidtrip(trip::Trip)"""检查给定的Trip对象是否是一个有效的旅程,其中最大速度不能超过35"""for i = 2:length(trip.tms)# 对Trip对象中的每一个点进行循环处理,从第2个点开始。px, py = gps2webmercator(trip.lon[i-1], trip.lat[i-1])cx, cy = gps2webmercator(trip.lon[i], trip.lat[i])# 使用gps2webmercator函数将第点的经纬度转化为Web墨卡托坐标。euclidean([px, py], [cx, cy]) / (trip.tms[i] - trip.tms[i-1]) > 35 && return false# 计算两点之间的欧几里得距离,并除以两点之间的时间差,得到速度。# 如果速度大于35,则返回false。endtrue# 如果所有点的速度都不超过35,则返回true。
end

6 timeslotsubtrips函数

function timeslotsubtrips(trips::Vector{Trip}, stms::T, etms::T) where T"""从给定的Trip对象数组中提取并返回落入指定时间段[stms, etms]的子旅程"""subtrips = Trip[]# 初始化一个空的Trip类型数组,用于存储在指定时间段内的子旅程。for trip in tripsa, b = searchrange(trip.tms, stms, etms)# 使用searchrange函数查找trip.tms中落入[stms, etms]的时间段的开始和结束索引。if a < b# 如果开始索引小于结束索引,说明找到了一个在指定时间段内的子旅程。subtrip = Trip(trip.lon[a:b], trip.lat[a:b], trip.tms[a:b], trip.devid)# 根据找到的索引范围,从原始旅程中提取子旅程。push!(subtrips, subtrip)# 将提取的子旅程添加到subtrips数组中。endendsubtrips# 返回在指定时间段内的所有子旅程。
end

7 timeslottrips函数

function timeslottrips(trips::Vector{Trip}, stms::T, etms::T, Δmins=5) where T"""从给定的Trip对象数组中筛选并返回起始时间落入指定时间段[stms, etms]的旅程"""filter(trips) do tripstms < trip.tms[1] < etms && etms + Δmins*60 > trip.tms[end]# 筛选条件:旅程的起始时间必须落入[stms, etms]时间段,并且旅程的结束时间必须在etms + Δmins*60之前。end
end

8 trip2finetrip函数

function trip2finetrip(trip::Trip, Δ=200)"""将一个粗糙的旅程插值为一个细粒度的旅程Input:trip (Trip)Δ (Real): The minimum Euclidean distance between two consecutive points after interpolation.Output:A trip"""finepoints, tms, _ = linear_interpolate(gps2webmercator.(trip.lon, trip.lat), trip.tms, Δ)# 使用linear_interpolate函数对旅程的点进行插值,得到细粒度的点、时间和其他返回值。# 该函数需要Web墨卡托坐标作为输入,因此我们首先使用gps2webmercator函数将经纬度转换为Web墨卡托坐标。# linear_interpolate函数确保插值后的两个连续点之间的欧几里得距离至少为Δ。x, y = map(first, finepoints), map(last, finepoints)# 从插值后的Web墨卡托坐标中提取x和y坐标。gpspoints = webmercator2gps.(x, y)# 使用webmercator2gps函数将Web墨卡托坐标转换回经纬度坐标。lon, lat = map(first, gpspoints), map(last, gpspoints)# 从返回的经纬度坐标中提取经度和纬度。Trip(lon, lat, tms, trip.devid)# 使用提取的经纬度和时间创建一个新的Trip对象,并返回。
end

9 removeredundantpoints函数

function removeredundantpoints(trip::Trip, δ=10)"""从给定的Trip对象中删除冗余的采样点。"""ind = Int[1]# 初始化一个数组,存储非冗余点的索引。默认第一个点始终是非冗余的。for i = 2:length(trip)if trip.tms[i]-trip.tms[ind[end]] >= δpush!(ind, i)# 检查当前点的时间戳与上一个非冗余点的时间戳之间的差值是否大于或等于δ。# 如果是,则当前点被认为是非冗余的,并将其索引添加到ind数组中。endendTrip(trip.lon[ind], trip.lat[ind], trip.tms[ind], trip.devid)# 使用ind数组中的索引从原始旅程中提取非冗余的点,并创建一个新的Trip对象。
end

10 trip2geojson函数

function trip2geojson(trip::Trip)#将给定的Trip对象转换为GeoJSON格式的数据points = [Dict("type"=>"Feature","geometry"=>Dict("type"=>"Point","coordinates"=>[trip.lon[i], trip.lat[i]]))for i = 1:length(trip)]# 为Trip对象中的每一个点创建一个GeoJSON格式的"Feature"。# 每个"Feature"包含一个"Point"类型的"geometry",其坐标为该点的经纬度。Dict("type"=>"FeatureCollection","features"=>points)# 创建一个GeoJSON格式的"FeatureCollection",其中包含所有的"Feature"。
end

11 trip2json函数

function trip2json(trip::Trip)"""将给定的Trip对象转换为地图匹配器所需的JSON格式"""js = Dict{String, String}[]# 初始化一个空的字典数组,用于存储转换后的JSON格式的数据for i = 1:length(trip)lon, lat = trip.lon[i], trip.lat[i]# 提取当前点的经纬度。tms = Dates.format(Dates.unix2datetime(trip.tms[i]), "yyyy-mm-dd HH:MM:SS")# 将当前点的时间戳转换为日期时间格式,并格式化为"yyyy-mm-dd HH:MM:SS"形式。push!(js, Dict("point"=>"POINT($lon $lat)","time"=> "$(tms)+0800","id"=>"\\x0001"))# 创建一个字典,其中包含当前点的经纬度、格式化后的时间和id。# 将这个字典添加到js数组中。endjs
end

12 matchtrip函数

function matchtrip(trip::Trip)"""将Trip对象提交给匹配服务器来匹配旅程"""js = trip |> removeredundantpoints |> trip2json# 先将Trip对象的冗余点移除,然后将其转换为JSON格式request = Dict("format"=>"slimjson", "request"=>js) |> JSON.json# 创建一个请求字典,其中包含格式为"slimjson"和转换后的JSON数据。clientside = connect("localhost", 1234)# 连接到本地的1234端口的匹配服务器。trymessage = request * "\n"write(clientside, message)# 将请求发送到匹配服务器。response = readline(clientside)# 读取匹配服务器的响应。response == "SUCCESS" ? readline(clientside) |> JSON.parse : []# 如果服务器响应为"SUCCESS",则读取下一行并解析为JSON,否则返回空数组。finallyclose(clientside)# 关闭与服务器的连接。end
end

13 trip2roads函数

function trip2roads(trip::Trip)"""将一个Trip对象映射到一系列的道路段"""result = matchtrip(trip)## 使用matchtrip函数将Trip对象提交给匹配服务器,获取匹配结果。roads, _ = map(d->get(d, "road", -1), result) |> rle# 从匹配结果中提取道路段信息,并使用rle函数进行编码,以获取道路段的连续序列。# rle函数返回两个数组:一个包含连续的值,另一个包含每个值的重复次数。# 在这里,我们只关心连续的道路段,所以只取第一个数组roads# 返回连续的道路段。
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/110313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何修改模型颜色

1、模型材质颜色介绍 在3D模型中&#xff0c;材质&#xff08;Material&#xff09;是指表面质感的特性&#xff0c;包括颜色、光泽、透明度等属性。其中&#xff0c;颜色是最基本的属性之一&#xff0c;它决定了物体表面的外观和感觉。 在现代计算机图形学中&#xff0c;通常…

常用redis-lua脚本

REDIS控制台 1. 进入控制台 E:\soft\Redis-x64-5.0.14.1\redis-cli.exe -h 127.0.0.1 -p 6379 -a password常用redis-lua脚本 在REDIS控制台输入 1. 查询以xxx为前缀的key的数量 local prefix ARGV[1] local keys redis.call(KEYS, prefix .. *) return #keys对应EVAL脚…

网络安全是什么?一文认识网络安全

一、网络安全 1.概念 网络安全从其本质上讲就是网络上的信息安全&#xff0c;指网络系统的硬件、软件及数据受到保护。不遭受破坏、更改、泄露&#xff0c;系统可靠正常地运行&#xff0c;网络服务不中断。 &#xff08;1&#xff09;基本特征 网络安全根据其本质的界定&#…

JS 数组 splice 用法

JS数组的 splice() 方法是用于向/从数组中添加/删除元素。它的语法如下&#xff1a; array.splice(start, deleteCount, item1, item2, ...)其中&#xff0c; start&#xff1a;从该索引开始修改数组&#xff08;从0开始计数&#xff09;。如果索引为负数&#xff0c;则从倒数…

C++ 配置VSCode开发环境

C配置VSCode开发环境 简介 Visual Studio Code (VSCode) 是一款开源的轻量级代码编辑器。它支持许多编程语言&#xff0c;包括C。本文档将详细介绍如何在Windows环境下配置VSCode的C开发环境。 安装步骤 1. 安装Visual Studio Code 首先&#xff0c;你需要下载并安装Visua…

Git构建分布式版本控制系统

一、版本控制 1、概念&#xff1a; 版本控制&#xff08;Version Control&#xff09;&#xff0c;也被称为版本管理、源代码管理或代码控制&#xff0c;是一种系统和工具&#xff0c;用于跟踪和管理文件、数据或源代码的不同版本和历史记录&#xff0c;在软件开发、文档管理…

jdbc设置StatementTimeout后还需要设置socket timeout参数吗

背景 我们设置JDBC参数时&#xff0c;不管有没有在Statement中配置超时时间StatementTimeout&#xff0c;我们都需要配置jdbc的socket timeout参数&#xff0c;那么为什么这个socket timeout参数如此必要&#xff0c;不设置又会怎么样&#xff1f; 问题真相 首先设置了State…

【Linux笔记】Linux基础权限

【Linux笔记】Linux基础权限 一、Linux权限的概念1.1、Linux中一切皆文件1.2、文件访问者的分类1.3、、Linux中的“用户白名单” 二、文件访问权限的修改2.1、权限的增加和减少的基础方法2.2、以八进制数修改权限 三、用户身份的修改3.1、修改文件的拥有者3.2、修改文件的所属组…

【VSCode】Windows环境下,VSCode 搭建 cmake 编译环境(通过配置文件配置)

除了之前的使用 VSCode 插件来编译工程外&#xff0c;我们也可以使用配置文件来编译cmake工程&#xff0c;主要依赖 launch.json 和 tasks.json 文件。 目录 一、下载编译器 1、下载 Windows GCC 2、选择编译器路径 二、配置 debug 环境 1、配置 lauch.json 文件 2、配置…

10.17课上(七段显示器,递归异或与电路)

异或的递归与数电实现 用二选一选择器实现异或函数 在异或当中&#xff0c;如果有一项为0&#xff0c;就可以把那一项消掉&#xff1b;如果有一项为1&#xff0c;就是把剩下的所有项运算完的结果取反 &#xff08;由此在算法当中可以采用递归解决&#xff09; 当w1为0时&…

百度文心一言 4.0 :如何申请百度文心一言 4.0

本心、输入输出、结果 文章目录 百度文心一言 4.0 &#xff1a;如何申请百度文心一言 4.0前言文心一言 4.0 ERNIE-Bot 4.0 &#xff1a;ERNIE-Bot 4.0 大模型深度测试体验报告如何申请千帆大模型试用百度文心一言 4.0 主要功能介绍配套发布的十余款AI原生应用插件、API 生态 百…

Python办公自动化完全指南(免费PDF)

Python办公自动化可以显著提速办公流程。通过自动执行那些重复繁琐又耗时的任务&#xff0c;大家可以把更多时间用在策略性和有创造性的工作上。 为了帮助大家更好地掌握如何将Python应用于办公自动化&#xff0c;我们整理了100个基本概念&#xff0c;让学习变得更轻松。 学习内…

C++项目实战——基于多设计模式下的同步异步日志系统-⑩-异步缓冲区类与异步工作器类设计

文章目录 专栏导读异步缓冲区设计思想异步缓冲区类设计异步工作器类设计异步日志器设计异步缓冲区类整理异步工作器类整理 专栏导读 &#x1f338;作者简介&#xff1a;花想云 &#xff0c;在读本科生一枚&#xff0c;C/C领域新星创作者&#xff0c;新星计划导师&#xff0c;阿…

[java进阶]——IO流,递归实现多级文件拷贝

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、认识IO流 二、了解编码与解码 二、IO流体系 三、字节输入输出流 四、字符输入输出流 五、多级文件拷贝 一、认识IO流 IO流也叫输入流(intput)、输出流(onput)&#xff0c;该流就像java程序同硬盘之间的…

2024年申报国自然项目基金撰写及技巧

随着社会经济发展和科技进步&#xff0c;基金项目对创新性的要求越来越高。申请人需要提出独特且有前瞻性的研究问题&#xff0c;具备突破性的科学思路和方法。因此&#xff0c;基金项目申请往往需要进行跨学科的技术融合。申请人需要与不同领域结合&#xff0c;形成多学科交叉…

第0章:怎么入手tensorflow

近年来人工智能的火爆吸引了很多人&#xff0c;网上相关的热门课程报名的人很多&#xff0c;但是坚持下去的人却少。那些晦涩的原理没有一定知识的积累很难能理解。 如果你对人工智能感兴趣&#xff0c;且想利用人工智能去实现某项功能&#xff0c;而不是对人工智能本身感兴趣&…

Linux性能优化--性能工具:磁盘I/O

6.0 概述 本章介绍的性能工具能帮助你评估磁盘I/O子系统的使用情况。这些工具可以展示哪些磁盘或分区已被使用&#xff0c;每个磁盘处理了多少I/O,发给这些磁盘的I/O请求要等多久才被处理。 阅读本章后&#xff0c;你将能够&#xff1a; 确定系统内磁盘I/O的总量和类型(读/写…

【网络安全 --- xss-labs通关】xss-labs靶场通关,让你巩固对xss漏洞的理解及绕过技巧和方法(提供资源)

一&#xff0c;资源下载准备 1-1 VMware 16.0 安装请参考以下博客&#xff0c;若已经安装请忽略&#xff1a; 【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;…

序列化和反序列化指令在PLC通信上的应用

在了解本篇博客之前&#xff0c;大家可以熟悉下序列化指令的相关介绍&#xff0c;详细内容如下&#xff1a; 博途PLC 1200/1500 PLC 序列化和反序列化指令编程应用_博图序列化和反序列化-CSDN博客序列化最重要的作用&#xff1a;在传递和保存对象时.保证对象的完整性和可传递性…