基于轨迹的游客行为特征分析
---------------------------------------------------------------------------------------------
[版权申明:本文系作者原创,转载请注明出处]
文章出处:https://blog.csdn.net/sdksdk0/article/details/83068473
作者:朱培 ID:sdksdk0
--------------------------------------------------------------------------------------------
大数据时代,深度“数据挖掘”高级分析技术成为大势所趋,对于旅游景区来说,谁先掌握互联网平台、善用大数据,谁就最有可能先人一步破除体制壁垒与管理围墙,实现转型升级和跨越式发展。通过在旅游景区部署移动信号监测设备,就可以发现该群体游客的相关属性,例如在一个区县,在不同景点之间部署,可以发现游客移动的轨迹是怎么样,本文主要就是用于分析游客在不同景点之间的浏览情况,这样可以更加合理的设计景区与景区之间的交通路线,销售相关旅游产品和应急预案等方面的东西。本文所涉及的内容使用mysql+springboot来实现。
首先来看一下清洗完成后的数据:浏览线路的格式为: 景区A=>景区C=>景区B=>景区D。
现在有数据格式如下(完整的数据集在文末提供下载链接):
第一列为id,第二列为景区编号,第三列为用户编号,第四列为时间,第五列为景区名称。
1 18C8E750176E 3478D7E2C139 20180503000000 嵩溪村
2 18C8E750182A C46699E01080 20180503000000 江南第一家花海
3 18C8E750180E 084ACF3E591F 20180503000000 水晶城
4 18C8E75017DA 386EA2788110 20180503000000 高速路
5 18C8E7501806 205D479A3020 20180503000001 翠湖
6 18C8E750181E 442C05543BED 20180503000001 水晶城
7 18C8E750182E F06D781D8FAF 20180503000002 通济桥水库大坝
8 18C8E75017EE B4EFFAC7D0C7 20180503000002 汽车客运站
9 18C8E75017EE 6C5C14743F6F 20180503000002 汽车客运站
10 18C8E75017A6 F4B7B356B876 20180503000003 檀溪镇
11 18C8E750181A 4C0FC7DF8C8E 20180503000003 金狮湖
12 18C8E750180A B436A9063032 20180503000003 翠湖
下载需要统计的就是同一个用户去了哪些景区,按时间维度进行排列,即可得出单个游客的移动轨迹。然后将所有游客的轨迹在一个List中进行合并处理,相同游客轨迹的数量加1,最终即可全部游客的移动轨迹。因为全部数据量在非常大,所以数据从数据仓库中选取了某一天的部分数据量来这里做演示。
1、在mysql数据库中创建表orbit_data,将数据集导入进去(文末提供数据集下载链接)
2、创建bean,OrbitData.java,里面包含和数据库表结构相对应的字段
private Integer id;
private String probMac;
private String devcMac;
private String inTime;
private String name;
3、mybatiss中查询
<select id="selectByMapAllList" resultType="OrbitData">
select * from orbit_data where 1=1
and devcMac in
(select devcMac from orbit_data where 1=1
and length(devcMac)>=10
<if test="beginTime != null and beginTime != '' ">
and inTime <![CDATA[ >= ]]> #{beginTime}
</if>
<if test="endTime != null and endTime != '' ">
and inTime <![CDATA[ <=]]> #{endTime}
</if>
group by devcMac
having count(*)>1
)
<if test="beginTime != null and beginTime != '' ">
and inTime <![CDATA[ >= ]]> #{beginTime}
</if>
<if test="endTime != null and endTime != '' ">
and inTime <![CDATA[ <=]]> #{endTime}
</if>
order by devcMac,inTime asc
</select>
4、因为这个轨迹分析计算是离线处理的,每天只需要运行一次即可,所以处理逻辑如下:
log.info("游客轨迹分析定时任务,开始...");
//获取总人数
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
String dayId = DateUtil.format(cal.getTime(), "yyyyMMdd");
String beginTime = dayId + "000000";
String endTime = dayId+"235959";
List<OrbitData> orbitList = orbitMapper.selectByMapAllList(beginTime,endTime);
List<Map<String, Object>> lineList = new ArrayList<Map<String, Object>>();
String tempLine="";
for(int i=0;i<orbitList.size();i++){
Map<String, Object> lineMap=new HashMap<String,Object>();
OrbitData orbit = orbitList.get(i);
if(i==0){
tempLine = orbitList.get(i).getName()+"=>";
location += "("+orbitList.get(i).getLongitude()+","+orbitList.get(i).getLatitude()+"),";
}else if(i>0 && i<orbitList.size()){
//如果相等,说明是同一个人
if(orbit.getDevcMac().equals(orbitList.get(i-1).getDevcMac())){
if(!orbitList.get(i-1).getName().equals(orbit.getName())){
BigDecimal a= new BigDecimal(orbitList.get(i-1).getInTime().toString().trim());
BigDecimal b= new BigDecimal(orbitList.get(i).getInTime().toString().trim());
BigDecimal cc=b.subtract(a);
//不同景点之间需要间隔10分钟以上的才属于有效数据
if( cc.compareTo(new BigDecimal(1000))>-1){
tempLine += orbitList.get(i).getName()+"=>";
}else if(i+1<orbitList.size()){
if(!orbit.getDevcMac().equals(orbitList.get(i+1).getDevcMac())){
tempLine += orbitList.get(i).getName()+"=>";
}
}
}
}else{
String[] split = tempLine.split("=>");
if(split.length>1){
tempLine=tempLine.substring(0,tempLine.length()-2);
lineMap.put("track", tempLine);
lineMap.put("day_id", DateUtil.format(cal.getTime(), "yyyy-MM-dd"));
lineMap.put("num", 1);
lineList.add(lineMap);
}
tempLine="";
location="";
tempLine += orbitList.get(i).getName()+"=>";
}
}
}
//lineList合并处理
List<Map<String, Object>> countList = new ArrayList<Map<String, Object>>();// 用于存放最后的结果
for (int i = 0; i < lineList.size(); i++) {
String track = lineList.get(i).get("track").toString();
String day_id = lineList.get(i).get("day_id").toString();
int flag = 0;// 0为新增数据,1为增加count
for (int j = 0; j < countList.size(); j++) {
String track_ = countList.get(j).get("track").toString();
String day_id_ = countList.get(j).get("day_id").toString();
if (track.equals(track_) && day_id.equals(day_id_)) {
int sum = Integer.parseInt(lineList.get(i).get("num").toString())
+ Integer.parseInt(countList.get(j).get("num").toString());
countList.get(j).put("num", sum + "");
flag = 1;
continue;
}
}
if (flag == 0) {
countList.add(lineList.get(i));
}
}
if(countList.size()>0){
//将查询出来的结果存放到数据库中
personStayLineMapper.insertBatch(countList);
}
log.info("游客轨迹分析定时任务,结束...");
5、处理完成的结果如下
处理完成之后有的有轨迹至少要有2个景区,同时会存在有多个景点情况
数据集下载地址为:https://download.csdn.net/download/sdksdk0/10723169
基于轨迹的游客行为特征分析相关推荐
- ACM第一名:基于轨迹感知多模态特征的视频关系检测
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达小白导读论文是学术研究的精华和未来发展的明灯.小白决心每天为大家带来 ...
- 学习 | 文献通读《基于LDA的游客网络评论主题分类:以故宫为例》
基于LDA的游客网络评论主题分类:以故宫为例 基于LDA的主题发现模型: [关注问题] 主题及情感倾向: 关键词 LDA 游客 网络评论 情感分析 故宫 [主要模块] 1.LDA主题分类,得到4个主题 ...
- 基于轨迹数据的人口流向分析技术,精准病毒传播追踪
2019年12月,我国出现了新型冠状病毒引发的多起病例,全国逐渐开启疫情防疫监控,严重地区甚至实施封闭管理.而此次疫情正好恰逢春运期间,大规模的跨地区人口流动会助长病毒传播,甚至传染到全球范围.因此, ...
- 基于文本挖掘的游客对古镇旅游态度的分析
基于文本挖掘的游客对古镇旅游态度的分析 范珈瑜 山东财经大学,山东 济南 250014 摘要:围绕游客的反馈,分析古镇旅游项目存在的问题及游客的态度.选取了5个各具特色的古镇--甲居藏寨.西江千户苗寨 ...
- 车联网中基于轨迹预测的无人机动态协同优化覆盖算法
本文由吴壮,唐伦,蒲昊,汪智平,陈前斌联合创作 摘要 针对城市车联网中出现的基站覆盖空洞及局部流量过载等问题,该文提出了一种基于车辆轨迹预测信息的动态预部署方案.首先,为了训练得到统一的 Seq2Se ...
- 基于php735旅行社游客信息导游管理系统
游客信息管理系统的建立在提高旅行社质量的同时也有利于提高旅行社的经济效益,为旅行社经营决策.组织旅游产品提供了详实的基础材料,也增强了旅游者对旅行社的满意度和忠诚度,增加了旅游者再次选择旅行社的机会, ...
- 基于轨迹优化的自动驾驶汽车跟随自行车模型动力学控制(Matlab代码实现)
- JUST技术:提升基于GPS轨迹的路网推测精确度
路网数据对于城市中的很多应用,比如车载导航和线路优化等,都非常重要.传统的道路数据采集方法依赖于采集车,消耗大量的人力物力.随着GPS设备的普及,海量轨迹数据在城市里产生,使我们能够用轨迹数据去生成路 ...
- JUST技术:基于注意力机制恢复细粒度轨迹
随着基于位置服务的大量增长,越来越多的移动数据可以被分析挖掘,以更好地服务人们的生活.然而,与来自出租车等运输系统类的高采样率轨迹数据相比,用户地理服务数据具有严重稀疏性问题,是因为用户不会一直访问移 ...
- 基于遥感影像及轨迹数据融合的地图自动化生成器
自动化的地图生成对于城市服务及基于位置服务非常重要,现有的工作研究主要利用遥感影像或可以充分反映地图路网情况的车辆轨迹数据生成地图,数据源较为单一,如果能将遥感影像数据及轨迹数据融合起来,地图生成的质 ...
最新文章
- win 复制linux文件命令行,windows与Linux间远程拷贝文件(pscp命令)
- BCH大涨带领币市小幅走高 个别币种走势逐步分化
- 如何用css让一个容器水平垂直居中
- 【MM 模块】 Optimized Purchasing 优化采购 3
- 饿了么ui组件中分页获取当前选中的页码值_【Web技术】314 前端组件设计原则
- HH SaaS电商系统的线下服务商品库存和采购设计
- 阿里云设置域名解析到主机ip
- 前端md转html添加样式_前端文档站点搭建方案
- Android Studio升级到3.0,抛出Aapt2Exception异常
- 查看python安装位置和已安装库的相关操作
- sql 常见查询代码操作
- matlab gui伪色彩增强,基于Matlab GUI的医学灰度图像伪彩色增强判读系统
- Thingsboard hierachy widget 和同一个dashboard不同数据的联动控制
- 数学建模学习:因子分析
- 《亡灵序曲》各版本收集
- linux wifi6 笔记本网卡,老旧笔记本电脑也能用WIFI6?无线网卡更换实录
- 【Mysql数据库】数据库添加索引方式
- flac格式如何转换为mp3,这3个方法超好用
- Java支付宝沙箱环境支付,官方Demo远程调试【内网穿透】
- CF76A.Gift [最小生成树]
热门文章
- Android 音频系统
- openbmc开发29:开关机管理
- IT与商业管理的三大阶段
- Java 冻结或解除冻结Excel中的行和列的方法
- 在北京这种城市,周末假期怎么整才算浪......
- PLC(二)西门子S7-200PLC基础知识
- 档案管理系统,项目总结
- 怎样用php制作动态烟花,动态烟花图片之自己动手制作
- 打印时候复选框勾选不见了_使用JS实现分页打印(复选框勾选打印)
- (转载)一级域名(顶级域名),二级域名,主域名,次域名,父域名,子域名联系与区别及域名带不带www的区别