在工程实践中需要解决以下问题:1)检索门店附近一定范围内的活跃顾客,之后可以对顾客进行营销,比如通过push方式给顾客发送促销消息,从而达到拉新的目的 2)检索空间指定区域内,如某个商圈内或者某个商场内的顾客,进行有针对性的营销 3)判断点在哪个区域内,比如查询用户所在的商圈、所在的大学等等。这些功能作为基础服务,需要系统具备很高的性能,低时延、高吞吐。
本文主要介绍如何实现:1)检索指定坐标一定范围内的顾客 2)检索区域(如商圈、购物中心)内的顾客。
数据结构
程序=数据结构+算法,处理问题的关键点是选择合适的数据结构以及算法。空间索引是解决这类问题的利器,常用的空间索引数据结构包含:geohash、kd树、r树等。kd树(k-dimensional树的简称),主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索),利用kd树可以省去对大部分数据点的搜索,从而减少搜索的计算量。
kd-tree
kd树是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。kd树是二叉树,表示对k维空间的一个划分(partition)。构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域。kd树的每个结点对应于一个k维超矩形区域。
构造kd树的方法如下:构造根结点,使根结点对应于k维空间中包含所有实例点的超矩形区域;通过下面的递归方法,不断地对k维空间进行切分,生成子结点。
在超矩形区域(结点)上选择一个坐标轴和在此坐标轴上的一个切分点,确定一个超平面,这个
超平面通过选定的切分点并垂直于选定的坐标轴,(通常,依次选择坐标轴对空间切分)将当前超矩形区域切分为左右两个子区域(子结点);这时,实例被分到两个子区域。这个过程直到子区域内没有实例时终止(终止时的结点为叶结点)。在此过程中,将实例保存在相应的结点上。
放到地图上可以化简为,只包含经度、维度的二维空间,依次按照经度纬度(竖一刀横一刀)切分空间,
假设有以下点集:
(41.9483,126.4145),(45.3228,126.4956),(34.0173,113.8261),(29.6967,113.8800),
(36.6535,117.0389),(23.1248,113.6023),(46.3041,128.9676)
构造出kd树如下
空间划分结果如下
检索周边
查找(38.9483,116.4145)附近一定距离的点
- 迅速搜索到这个点位于(36.6535,117.0389)点构成的空间。左右都可能存在符合要求的点
- (34.0173,113.8261)的下面空间不会包含目标点,于是过滤掉,放弃搜索。
- (41.9483,126.4145)右边的空间不会包含目标点,放弃搜索
具体过程:首先找到包含目标点的叶结点;然后从该叶结点出发,依次回退到父结点:如果父结点的另一子结点的超矩形区域与圆相交,那么在相交的区域内寻找目标点。。
过滤规则:只需计算与上一级空间点相同经度或者相同纬度下距离是否小于目标距离。这里我们采用了化简后的距离函数,参见地理空间距离计算优化
检索区域
检索某个区域内的用户,只需将圆换成矩形,先查询到矩形内的所有点,然后利判断一下点是否在区域内。
以用户所在位置为起点,往右边(或左边)发出一条射线,计算该射线与多边形各个边的交点,如果交点个数是奇数则在多边形内部,否则在外部。
附近用户
对附近活跃用户有如下定义:最近30分钟内在门店附近打开应用的用户。需要保留历史记录,如果一个用户29分钟前在周围出现过,但是15分钟前就离开了,那么仍然算是周围用户,也就是说要保留历史状态,用户去过哪儿都可以查到。
项目为java项目,基于spring-quartz:
"0 0/10 * ? * *")
(cron =
每十分钟触发一次,新建一颗新的索引树,将current指向它,并判断一下,最旧的二叉树是否应该丢弃,检索附近用户化简为检索3棵kd树。
我的顾客
某些poi对应30多万设备,总体近60G空间,且还会继续增长,如何查询某poi购买过的顾客,比较困难,如果扫描到周边用户之后再发起一万次请求判断是否是新客,显然不行。
解决方案:基于lsm思想实现了一个简易的kv存储,保存(poi,购买顾客列表),直接放在本地磁盘,将求老客转化为求交集。
周边用户分布
简单的采用了k-means进行空间聚类,一定程度上反映了用户分布情况,缺点是聚类效果不够稳定。
取得效果
检索附近用户时总量500w记录 延达到2ms以内。
关键代码
关键代码 summer
相关推荐
【Vue框架在地理信息检索系统中的应用】 Vue.js是一个轻量级的JavaScript框架,它以其易用性、高效的数据绑定和组件化结构在前端开发领域备受青睐。在地理信息检索系统中,Vue提供了强大的功能来处理和展示海量的...
测绘地理信息检索云服务平台是基于云计算技术的,用于存储和检索测绘地理信息的一种服务平台。随着互联网和科学技术的发展,测绘地理信息检索云服务平台的建设得到了世界各国的重视。地理信息云服务平台的构建能够...
地理信息系统(GIS)自20世纪60年代诞生以来,一直是信息技术领域的重要研究课题,特别是随着互联网和空间数据的快速发展,地理信息检索服务正面临前所未有的机遇与挑战。海量的空间信息对传统的地理信息系统提出了...
《电信设备:基于用户视野的地理信息检索和导航系统》 在现代信息技术的快速发展中,地理信息系统(GIS)已经成为电信设备的重要组成部分。本资料重点探讨的是一个基于用户视野的地理信息检索和导航系统,该系统...
本文提出了一种利用主题爬行模式的分布式检索方法,旨在提升地理信息检索的效率和准确性。 【关键词】:MapReduce、主题爬行、地理信息、主题相关度 文章介绍了一种针对网络地理信息检索的新方法,主要包含以下几...
针对当前定量化的地理信息检索模型无法有效处理自然语义导致检索结果不理想的问题,以语义匹配为原则,以定性表达为基础,以推理方法为手段,提出基于定性空间推理的定性地理信息检索的方法及其形式化模型,实现Web...
总的来说,"基于MIML的OGC地理信息服务语义检索方法"是GIS领域的创新技术,它结合了机器学习的先进理念与开放标准的实用优势,为解决海量地理信息检索问题提供了一种有效途径。这种方法的实施有助于电信设备管理的...
此外,谷歌地图的使用展示了地理信息检索的便利性,能准确找到特定地点如“建一邮政储蓄ATM”。 搜索引擎的工作原理主要包括全网爬取、索引构建和结果排序三个步骤。关键词搜索、中文分词、同义词处理等技术是其...
在研究背景方面,文章还提到了地理信息检索的重要性。随着个人设备的普及和个人信息的大量涌现,越来越多的信息在特定地区范围内才有意义。因此,用户在搜索信息时,往往会隐含地希望找到与自己当前位置相关的内容。...
综合以上内容,该文档详细地阐述了如何设计和实现一个基于本体的智能信息检索系统,并通过地理信息检索应用案例,说明了语义Web技术在具体领域的实际应用。这种信息检索系统通过增强对查询语义的理解,提供了更为...
同时向地理信息消费者(信息最终用户)提供多媒体地理信息检索服务、地理信息导航服务(分类分级导航、人工索引检索式导航、自动索引检索式导航)。 该系统的核心包括全省信息查询(含地理风貌、环境气候、名胜古迹...
总的来说,这个系统和方法的创新之处在于结合了大索引技术、空间索引算法和分布式计算,以解决海量地理信息检索的挑战。它不仅提高了查询速度,也为位置服务提供了更强的扩展性和灵活性,满足了现代智能城市和移动...
- 实现高效的地理信息检索。 #### 虚拟现实(VR) - **定义**: 虚拟现实技术通过计算机生成一个逼真的虚拟环境,使用户能够与这个环境进行交互。 - **特点**: - 创建沉浸式的体验环境。 - 支持用户与虚拟世界的互动...
国内学者通过对地理本体的综述、地理本体与地理信息分类、地理本体构建、基于地理本体的空间数据组织管理与表达、基于地理本体的地理信息检索和地理知识查询、地理信息共享和互操作及语义集成、基于地理本体的地理...
缓冲区分析是GIS中的一个重要功能,它定义了一定距离内的影响区域,而缓冲区查询则侧重于基于缓冲区的地理信息检索。 总的来说,这门课程的学习要求学生掌握地理信息的数字化、管理、分析和可视化,理解空间数据的...
通过构建这样的系统,开发者可以更好地满足大学生用户的地理信息检索需求。这种服务不仅可以帮助用户快速地定位到校园内的各种地点,还能够提供其他相关的信息服务,如餐饮、娱乐、教学楼、宿舍、图书馆等重要设施的...
本项目以"基于ElasticSearch全文检索的农业地理信息大数据平台设计与实现"为主题,旨在利用先进的大数据技术和全文检索引擎,为农业生产提供高效、精准的信息服务。 Elasticsearch是一款开源的搜索引擎,基于Lucene...
百度地图SDK提供了强大的地理信息检索功能,可以通过关键字搜索、矩形区域搜索等方式获取地理位置信息。 4. **地图展示**:SDK提供了地图视图控件,可以方便地在应用中显示地图,支持卫星图、地形图、普通地图等...
分类与编码是将地理要素及其属性按照一定的规则和标准进行归类和赋予唯一的标识代码,这有助于提高数据处理效率和信息检索的精确性。 首先,了解地理信息分类与编码的意义。分类与编码是GIS数据库设计的核心部分,...