1. 引言

 

下载的轨迹数据来源真实,并非特意模拟的轨迹数据,所以质量问题十分严重,进行预处理就显得尤为重要

 

2. 裁剪

 

我们将下载的岳麓山轨迹数据加载入QGIS,并使用OSM作为底图:

 

可以看到,存在着远超出长沙市范围的数据,这个是显然的必须要去除的

 

结合实际情况,第一次裁剪范围设置为岳麓山及周边的橘子洲、桃花岭、梅溪湖等,如图:

 

 

对应的分界点坐标为:

  • 112.96715,28.14384 (右下)
  • 112.85616,28.21707 (左上)
 

由于我们此次的本意(轨迹数据关键词)是岳麓山景区,第二次划分则以岳麓山景区边界为划分依据,如图所示:

 

 

对应的分界点坐标为:

  • 112.943637,28.170235 (右下)
  • 112.917099,28.203567 (左上)
In [39]:
class MBR:
def __init__(self, min_lat, min_lng, max_lat, max_lng):
self.min_lat = min_lat
self.min_lng = min_lng
self.max_lat = max_lat
self.max_lng = max_lng def contains(self, lat, lng):
return self.min_lat <= lat < self.max_lat and self.min_lng <= lng < self.max_lng
 

定义MBR

In [40]:
big_MBR = MBR(28.14384, 112.85616, 28.21707, 112.96715)
small_MBR = MBR(28.170235, 112.917099, 28.203567, 112.943637)
 

遍历文件夹中的所有文件

In [41]:
import os
file = os.listdir('./trackdata')
trip_files = []
for trip_file in file:
if trip_file.startswith('trip_'):
trip_files.append(trip_file)
trip_files.__len__()
Out[41]:
1158
 

对每个文件中的轨迹点进行遍历,包含在MBR中就另存为

In [43]:
dir = './trackdata/'
for trip_file in trip_files:
with open(dir+trip_file) as tf:
# print(trip_file)
tmp = []
for trip_line in tf:
point = trip_line.split(' ')
if big_MBR.contains(float(point[0]),float(point[1])):
tmp.append(trip_line)
# print(len(tmp))
if(len(tmp) > 1):
with open(dir+'clip/'+trip_file,'w') as cf:
cf.writelines(tmp)
with open(dir+'clip/all.csv','a') as af:
af.writelines(tmp)
# print(trip_file)
 

以上是对大的范围剪裁,裁减结果如图:

In [44]:
dir = './trackdata/'
for trip_file in trip_files:
with open(dir+trip_file) as tf:
# print(trip_file)
tmp = []
for trip_line in tf:
point = trip_line.split(' ')
if small_MBR.contains(float(point[0]),float(point[1])):
tmp.append(trip_line)
# print(len(tmp))
if(len(tmp) > 1):
with open(dir+'clip_yuelushan/'+trip_file,'w') as cf:
cf.writelines(tmp)
with open(dir+'clip_yulushan/all.csv','a') as af:
af.writelines(tmp)
 

以上是对岳麓山进行裁减,结果如图:

 

不妨将裁减的轨迹放入KDE程序中运行,得到KDE图像:

 

看到跳来跳去的线,显然下一步的工作是跳跃点去除

 

3. 跳跃点去除

 

前后点之间距离过大视为跳跃点,将这两点切断,该轨迹后面的点设为新的轨迹

 

定义包含距离计算的实体类:

In [1]:
import math
EARTH_MEAN_RADIUS_METER = 6371008.7714 class SPoint:
def __init__(self, lat, lng):
self.lat = lat
self.lng = lng
def __str__(self):
return '({},{})'.format(self.lat, self.lng)
def __eq__(self, other):
return self.lat == other.lat and self.lng == other.lng # returns the distance in meters between two points specified in degrees (Haversine formula).
def distance(a, b):
return haversine_distance(a, b) def haversine_distance(a, b):
if a.__eq__(b):
return 0.0
delta_lat = math.radians(b.lat - a.lat)
delta_lng = math.radians(b.lng - a.lng)
h = math.sin(delta_lat / 2.0) * math.sin(delta_lat / 2.0) + math.cos(math.radians(a.lat)) * math.cos(
math.radians(b.lat)) * math.sin(delta_lng / 2.0) * math.sin(delta_lng / 2.0)
c = 2.0 * math.atan2(math.sqrt(h), math.sqrt(1 - h))
d = EARTH_MEAN_RADIUS_METER * c
return d
In [2]:
distance(SPoint(28.00100,118.00001),SPoint(28.00002,118.00000))
Out[2]:
108.97560082918801
 

读取文件:

In [5]:
import os
file = os.listdir('./trackdata/clip_yuelushan/')
trip_files = []
for trip_file in file:
if trip_file.startswith('trip_'):
trip_files.append(trip_file)
trip_files.__len__()
Out[5]:
995
 

跳跃点去除:

In [19]:
dir = './trackdata/clip_yuelushan/'
MAX_SAPN = 20
for trip_file in trip_files:
with open(dir+trip_file) as tf:
# print(trip_file)
tmp = []
num = 0
tag = ''
lines = tf.readlines()
for i in range(len(lines)-1):
point1 = lines[i].split(' ')
point2 = lines[i+1].split(' ')
if distance(SPoint(float(point1[0]),float(point1[1])),SPoint(float(point2[0]),float(point2[1]))) < MAX_SAPN:
tmp.append(lines[i])
else:
if(len(tmp) > 1):
if num > 0:
tag = '_' + str(num)
with open('./trackdata/'+'jumpfilter_yueluhsan/'+trip_file[:-4]+tag+'.txt','w') as cf:
cf.writelines(tmp)
with open('./trackdata/'+'jumpfilter_yueluhsan/all.csv','a') as af:
af.writelines(tmp)
num = num + 1
tmp.clear()
if(len(tmp) > 1):
tmp.append(lines[len(lines)-1])
if num > 0:
tag = '_' + str(num)
with open('./trackdata/'+'jumpfilter_yueluhsan/'+trip_file[:-4]+tag+'.txt','w') as cf:
cf.writelines(tmp)
with open('./trackdata/'+'jumpfilter_yueluhsan/all.csv','a') as af:
af.writelines(tmp)
 

再运行KDE程序得到图像:

 

看起来似乎好多了

 

以下是对另一个剪裁进行跳跃点剔除:

In [3]:
import os
file = os.listdir('./trackdata/clip/')
trip_files = []
for trip_file in file:
if trip_file.startswith('trip_'):
trip_files.append(trip_file)
trip_files.__len__()
Out[3]:
1013
In [4]:
dir = './trackdata/clip/'
MAX_SAPN = 20
for trip_file in trip_files:
with open(dir+trip_file) as tf:
# print(trip_file)
tmp = []
num = 0
tag = ''
lines = tf.readlines()
for i in range(len(lines)-1):
point1 = lines[i].split(' ')
point2 = lines[i+1].split(' ')
if distance(SPoint(float(point1[0]),float(point1[1])),SPoint(float(point2[0]),float(point2[1]))) < MAX_SAPN:
tmp.append(lines[i])
else:
if(len(tmp) > 1):
if num > 0:
tag = '_' + str(num)
with open('./trackdata/'+'jumpfilter/'+trip_file[:-4]+tag+'.txt','w') as cf:
cf.writelines(tmp)
with open('./trackdata/'+'jumpfilter/all.csv','a') as af:
af.writelines(tmp)
num = num + 1
tmp.clear()
if(len(tmp) > 1):
tmp.append(lines[len(lines)-1])
if num > 0:
tag = '_' + str(num)
with open('./trackdata/'+'jumpfilter/'+trip_file[:-4]+tag+'.txt','w') as cf:
cf.writelines(tmp)
with open('./trackdata/'+'jumpfilter/all.csv','a') as af:
af.writelines(tmp)
 

4. 关于滞留点

 

滞留点就是游客停留或者以很慢速度行走的地方,这些地方会造成点聚集,对结果有一定影响,但同时这些点也是重要的点,可以用来挖掘重要区域

 

5. 关于运动方式

 

运动方式其实主要是对于游客运动模式的思考,游客主要的运动方式为步行,但也有骑行、驾车、缆车等方式

 

可以根据速度进行一个划分,根据速度大小进行相应的剔除

 

考虑到实际情况,一般,景区内车辆能走的道路行人都能走,行人能走的车辆不一定能走

 

笔者想要的是面向行人的导航地图,所以此处笔者认为可以不处理,另外,在跳跃点剔除那里,由于手机的GPS采样时间有个默认值,我们可以认为对速度过快的也进行了剔除

GPS地图生成04之数据预处理的更多相关文章

  1. 借助 SIMD 数据布局模板和数据预处理提高 SIMD 在动画中的使用效率

    原文链接 简介 为发挥 SIMD1 的最大作用,除了对其进行矢量化处理2外,我们还需作出其他努力.可以尝试为循环添加 #pragma omp simd3,查看编译器是否成功进行矢量化,如果性能有所提升 ...

  2. R语言进行数据预处理wranging

    R语言进行数据预处理wranging li_volleyball 2016年3月22日 data wrangling with R packages:tidyr dplyr Ground rules ...

  3. Scikit-Learn模块学习笔记——数据预处理模块preprocessing

    preprocessing 模块提供了数据预处理函数和预处理类,预处理类主要是为了方便添加到 pipeline 过程中. 数据标准化 标准化预处理函数: preprocessing.scale(X, ...

  4. Deep Learning 11_深度学习UFLDL教程:数据预处理(斯坦福大学深度学习教程)

    理论知识:UFLDL数据预处理和http://www.cnblogs.com/tornadomeet/archive/2013/04/20/3033149.html 数据预处理是深度学习中非常重要的一 ...

  5. weka数据预处理

    Weka数据预处理(一) 对于数据挖掘而言,我们往往仅关注实质性的挖掘算法,如分类.聚类.关联规则等,而忽视待挖掘数据的质量,但是高质量的数据才能产生高质量的挖掘结果,否则只有"Garbag ...

  6. 对数据预处理的一点理解[ZZ]

    数据预处理没有统一的标准,只能说是根据不同类型的分析数据和业务需求,在对数据特性做了充分的理解之后,再选择相关的数据预处理技术,一般会用到多种预处理技术,而且对每种处理之后的效果做些分析对比,这里面经 ...

  7. 【深度学习系列】PaddlePaddle之数据预处理

    上篇文章讲了卷积神经网络的基本知识,本来这篇文章准备继续深入讲CNN的相关知识和手写CNN,但是有很多同学跟我发邮件或私信问我关于PaddlePaddle如何读取数据.做数据预处理相关的内容.网上看的 ...

  8. [数据预处理]-中心化 缩放 KNN(一)

    据预处理是总称,涵盖了数据分析师使用它将数据转处理成想要的数据的一系列操作.例如,对某个网站进行分析的时候,可能会去掉 html 标签,空格,缩进以及提取相关关键字.分析空间数据的时候,一般会把带单位 ...

  9. 数据准备<3>:数据预处理

    数据预处理是指因为算法或者分析需要,对经过数据质量检查后的数据进行转换.衍生.规约等操作的过程.整个数据预处理工作主要包括五个方面内容:简单函数变换.标准化.衍生虚拟变量.离散化.降维.本文将作展开介 ...

  10. Python数据预处理:机器学习、人工智能通用技术(1)

    Python数据预处理:机器学习.人工智能通用技术 白宁超  2018年12月24日17:28:26 摘要:大数据技术与我们日常生活越来越紧密,要做大数据,首要解决数据问题.原始数据存在大量不完整.不 ...

随机推荐

  1. [OpenCV实战]38 基于OpenCV的相机标定

    文章目录 1 什么是相机标定? 2 图像形成几何学 2.1 设定 2.1.1 世界坐标系 2.1.2 相机坐标系 2.1.3 图像坐标系 2.2 图像形成方法总结 3 基于OpenCV的相机标定原理 ...

  2. Spark详解(06) - SparkSQL

    Spark详解(06) - SparkSQL Spark SQL概述 什么是Spark SQL Spark SQL是Spark用于结构化数据(Structured Data)处理的Spark模块. ( ...

  3. python进阶之路18 os、sys、json模块

    os模块与sys模块 os模块主要与操作系统打交道 sys模块主要与python解释器打交道 os模块(重要) os模块主要与代码运行所在的操作系统打交道 import os os.path.spli ...

  4. 腾讯出品小程序自动化测试框架【Minium】系列(三)元素定位详解

    写在前面 昨天转发这篇文章时,看到群里有朋友这样说: 这么卷吗?这个框架官方已经不维护了. 姑且不说卷不卷的问题,要是能卷明白,别说还真不错: 不维护又怎样?我想学习,想会,分享给很期待这系列的文章的 ...

  5. 代码小DEMO随笔---JS原生手机版本alert弹框

    之前的随笔写的是WEB版本的弹框,这次是手机版本,欢迎路过的大佬们提出更好的写法~~ <!DOCTYPE html> <html lang="en"> &l ...

  6. 如何找到CSDN中关注的用户和粉丝?

    如何找到CSDN中关注的用户和粉丝? 刚刚在CSDN个人账号里找了半天都没找到自己关注的人 对CSDN的页面更新感到很迷, 个人账号管理很不人性化, 或者说是根本找不到自己关注的用户以及关注自己的粉丝 ...

  7. 2023计算机领域顶会(A类)以及ACL 2023自然语言处理(NLP)研究子方向领域汇总

    2023年的计算语言学协会年会(ACL 2023)共包含26个领域,代表着当前前计算语言学和自然语言处理研究的不同方面.每个领域都有一组相关联的关键字来描述其潜在的子领域, 这些子领域并非排他性的,它 ...

  8. 吾剑未尝不利,国内Azure平替,科大讯飞人工智能免费AI语音合成(TTS)服务Python3.10接入

    微软Azure平台的语音合成(TTS)技术确实神乎其技,这一点在之前的一篇:含辞未吐,声若幽兰,史上最强免费人工智能AI语音合成TTS服务微软Azure(Python3.10接入),已经做过详细介绍, ...

  9. 12月2日内容总结——边框属性,display属性,css盒子模型,浮动、溢出、定位、z-index属性和建议博客页面搭建

    目录 一.边框 边框简介 border-style--边框样式 border-width--边框宽度 border-color--边框颜色 二.display属性 三.CSS盒子模型 概念 margi ...

  10. LeetCode_单周赛_327

    目录 6283. 正整数和负整数的最大计数 代码 6285. 执行 K 次操作后的最大分数 代码 6284. 使字符串总不同字符的数目相等 代码 6283. 正整数和负整数的最大计数 代码 直接遍历统 ...