使用 ES 实现疫情地图或者外卖点餐功能(含代码及数据)
0、引言
疫情当下,大家几乎每天都在用疫情地图的相关功能,其中的核心功能即地理位置检索,使用 ES 可以非常轻松的实现,下面我简单说一下核心的几个功能如何设计和实现。
本文不涉及前段UI的设计和实现以及客户端调用代码,如果大伙儿需要,可以给我留言,需求量比较大的话可以考虑做一个完整项目开源出来,点赞支持下吧
PS:学习本文需要对 Elasticsearch 地理位置检索 的基本功能有一定的了解,推荐阅读:todo
本文案例中所使用的数据,可在文末下载。
1、功能模块
下图为疫情地图的基本木块,本文目的为将地理位置检索应用于项目落地,因此和核心功能无关的业务模块将不再罗列。主要的实现的功能如图所示
主要功能包含:
- 行政地区信息录入
- 机构信息
- 健康码状态上报
- 搜索附近的核酸检测机构(医院)
- 查询某地区的确诊人数(行政区范围内)
- 查询某地区的确诊人员分布
- 查询某个医院所属的行政区
- 统计各省份城市确诊人数
2、索引结构设计
2.1 地区索引
省市区联动是在很多场景下都是非常常见的,其表结构也非常简单,通过一个pid
或者pcode
即可保存起级联关系。
但是在地理位置检索时,只存在空间关系
而不存在逻辑关系
,不同的地理位置并不是通过关联字段来保存其关系的,因此在索引设计的时候,是否省市区是否采用结构化逻辑存储,取决于业务。单从地理位置检索上来分析,不管是省份、城市、地区还是街道,在地理位置坐标中均属于几何图形
,因此无需结构化存储,每个_doc 保存一个geo_shape即为合理的方式。
我这里仍然是保留了省市区之间的逻辑关系,但是这一点对本文要实现的功能是没有用处的。建议在索引中为每一个省份、城市、地区、街道单独创建一个文档,使用polygon
存储。
ES 支持仅支持基本的几何图形,并不支持不规则几何图形,省份地区这种图形如何存储?
其实不规则几何图形可以看成是边很多的多边形,当边的数量足够多,经可以足够精确的描述一个不规则多边形。这其实和你玩游戏的时候一样,一些需要显示曲线的场景,其实就是由无数个多边形来描述的,当边的数量足够多的时候,你就看不出的他是个多边形了。
索引 mapping
PUT area
{"mappings": {"properties": {"location": {"type": "geo_shape"},"city": {"properties": {"location": {"type": "geo_shape"},"district": {"properties": {"location": {"type": "geo_shape"}}}}}}}
}
2.2 机构索引
机构可以是:医院、学校、桥梁、公司、隧道等任意单位,具体包含什么取决于你在做功能时想搜索到什么,一般机构为一个点坐标即可,即:geo_shape:point
。为了简化代码,我这里只存储一个医院信息,也可以理解为核酸检测机构的网点。
索引 mapping 如下:
PUT hospital
{"mappings": {"properties": {"properties" : {"address" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"district" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"location" : {"type" : "geo_shape"},"lv" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"name" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}}}}}
}
2.3 人员信息索引(上报信息)
人员信息上报其实包含了如健康码、行程码(行程轨迹)、核酸检测报告、健康状态等信息,信息上报基本发生在门禁扫码登记、核酸检测结果发生时期等,行程轨迹上报时间可通过手机连接的基站发生变化而做出轨迹测算和上报。为了简化功能,我们人员的健康信息只保留一个状态字段:及健康或感染(确诊)。
索引 mapping:
PUT case_person
{"mappings": {"properties": {"date": {"type": "date"},"location": {"type": "geo_shape"},"name": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}},"status": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256}}}}}
}
3、实现
3.1 统计当日新增
这里只是做一个简单的统计,不再区分本土、外来、无症状等业务字段,统计当日新增,即表示满足
- 确诊时间为当日
- 状态为已确诊
两个条件的所有人员信息,代码如下:
GET case_person/_search
{"size": 0, "query": {"bool": {"must": [{"range": {"date": {"gte": "now/d"}}},{"term": {"status.keyword": {"value": "确诊"}}}]}},"aggs": {"today_add": {"value_count": {"field": "status.keyword"}}}
}
3.2 查询周边的确诊病例
查询周边确诊病例或者查询所在行政区的确诊病例,可应用如判断所属地区是否属于中高风险地区等业务,实现起来也非常简单。只需提供两个条件
- 当前所处经纬度坐标
- 搜索半径
如果是在APP中,当前所处坐标直接通过调用SDK中提供的位置接口即可获取,如果是用于测试,可通过百度地图提供的开放接口在地图上选点获取坐标。操作步骤为:
滚动页面,找到页面中开发文档部分,点击坐标拾取器
此时,地图中鼠标经过处便会显示实时坐标:
可以在地图中选出自己心仪的坐标,模拟自己当前所处位置。比如我当前所处位置经纬度为:
- “lon”:116.238334,
- “lat”:39.900112
以图中定位的永辉超市为圆心,半径三公里,搜索到了 八角游乐园、八宝山、玉泉路、五棵松四个地铁站(这里地铁站可以看做是确认病例),即三公里范围内有四个确诊病例。
这样的搜索,同样可用于搜索附近的核酸检测机构:代码如下:
3.2 搜索指定区域内的指定单位
搜索指定区域内单位,可以搜索各种单位,也可以对各个行政地区进行搜索。
比如搜索北京市-海淀区内所有核酸检测机构:
代码如下:
GET province_bak/_search
{"query": {"term": {"name.keyword": {"value": "海淀区"}}}
}
GET hospital/_search
{"_source": {"include":["name","district"]},"query": {"geo_shape": {"location": {"indexed_shape": {"index": "province_bak","id": "110108","path": "location"},"relation": "within"}}}
}
索引数据下载:https://t.zsxq.com/037YJUJia
使用 ES 实现疫情地图或者外卖点餐功能(含代码及数据)相关推荐
- Springboot具有智能推荐功能的外卖点餐系统bia14计算机毕业设计-课程设计-期末作业-毕设程序代做
Springboot具有智能推荐功能的外卖点餐系统bia14计算机毕业设计-课程设计-期末作业-毕设程序代做 [免费赠送源码]Springboot具有智能推荐功能的外卖点餐系统bia14计算机毕业设计 ...
- SSM基于微信小程序的外卖点餐系统 毕业设计-附源码2711704
基于微信小程序的外卖点餐系统的设计与实现 摘要 立足于当下餐饮行业现有的点餐模式,分析传统APP点餐的运作流程,结合微信小程序的特点设计新型的外卖点餐系统.近几年,人们生活水平日益提升,但工作强度和压 ...
- 开题报告-基于Android的外卖点餐APP的设计与实现
目录 1.课题研究立项依据 2.文献综述 3.课题研究的基本内容及预期目标或成果 4.课题的研究方案 5.研究进度安排 6.主要参考文献 1.课题研究立项依据 (内容格式要求:字体为5号宋体,行距为固 ...
- 基于JAVA外卖点餐系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
基于JAVA外卖点餐系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 基于JAVA外卖点餐系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 本源码技术栈: 项目架构:B/S ...
- 干货| 外卖点餐系统(App及后台)
简单总结一下,这个系统是一个外卖点餐系统,也就是仿美团饿了么,也是当时我的毕业设计,花费了我很多精力,主要包括了移动端App.服务端(中台)和商家的后台管理.答辩完后我就将移动端源码放到了GitHub ...
- PHP项目——外卖点餐系统后台管理解析
项目介绍 系统基于总部+多门店的连锁模式,拥有门店独立管理后台,支持总部定价和门店定价.LBS定位点餐,可堂食可外卖,适用于茶饮的外卖点餐场景,搭建自己的一点点.奈雪.喜茶点餐系统. 平台后台 1.商 ...
- ssm基于微信小程序的外卖点餐系统的设计与实现毕业设计-附源码211704
摘要 立足于当下餐饮行业现有的点餐模式,分析传统APP点餐的运作流程,结合微信小程序的特点设计新型的外卖点餐系统.近几年,人们生活水平日益提升,但工作强度和压力不断增强,尤其是对于上班族而言,到餐厅吃 ...
- 微信扫码点餐小程序springboot外卖点餐系统源码和论文
开发工具: 后端:idea 用户端:微信开发者工具 数据库 :mysql5.7+ 技术:java springboot mybatis 微信原生技术 角色: 管理员 多商家 用户 ...
- Java外卖点餐系统
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:blog.csdn.net/weixin_44219 ...
最新文章
- HDU4920(矩阵连乘)
- 30 天学习 30 种新技术系列
- bzoj3993: [SDOI2015]星际战争(二分+最大流)
- jvm_垃圾收集算法讲解(二)
- 如何提高个人的职涯“本钱”
- python编程心得体会-python核心编程____学习心得____part1
- 实现最小宽度的几种方法及CSS Expression
- mysql实现不重复插入数据
- C#后台调用跨域MVC服务,带Cookie验证
- 【信息系统项目管理师】第十三章 项目合同管理思维导图
- 余光中 听那冷冷的雨
- HDS存储给主机扩容步骤
- FireFox-background
- php根据城市获取天气预报,中国天气网 天气预报API 国家气象局 根据城市名称抓取城市(示例代码)...
- ora-27100产生的原因分析
- 倘若有天你不想再敲代码了,你想做什么?
- 安装Anaconda出现Error opening file for writing错误最简单有效的办法
- 【目标检测算法】YOLO-V5实战检测VOC2007数据集
- C语言逻辑语句问题集锦
- 下载了免费的epub电子书,如何用Windows电脑打开?